我使用Boyer-Moore algorithm在内核驱动程序中进行字符串匹配,但我还需要实现基本的通配符支持。 This answer on SO提到了FsRtlIsNameInExpression
函数,它看起来恰好满足了我的需求。它甚至看起来像处理Unicode字符串的大小写不敏感。
但它甚至无法让它与一个简单的字符串匹配。
我尝试了一些东西,但FsRtlIsNameInExpression永远不会匹配任何东西。以下是我用来测试的一些代码(我在MyTest
例程结束时调用了DriverEntry
。
NTSTATUS MyTest()
{
int matches = 0;
UNICODE_STRING a3times;
UNICODE_STRING A5times;
UNICODE_STRING bbb;
UNICODE_STRING patterna;
UNICODE_STRING patternb;
RtlInitUnicodeString(&a3times, L"aaa");
RtlInitUnicodeString(&A5times, L"AAAAA");
RtlInitUnicodeString(&bbb, L"bbb");
RtlInitUnicodeString(&patterna, L"a*a");
RtlInitUnicodeString(&patternb, L"b*");
if(FsRtlIsNameInExpression(&patterna, &a3times, TRUE, 0))
++matches; // a*a should match aaa
if(FsRtlIsNameInExpression(&patterna, &A5times, FALSE, 0))
++matches; // a*a should match (insensitive) AAAAA
if(FsRtlIsNameInExpression(&a3times, &a3times, TRUE, 0))
++matches; //aaa should match aaa
if(FsRtlIsNameInExpression(&patternb, &bbb, TRUE, 0))
++matches; //b* should match bbb
return matches; //Should be 4, but is 0
}
记录:
我失踪的显而易见的是什么?
答案 0 :(得分:1)
文档说
如果
IgnoreCase
为TRUE
,则Expression
必须为大写。
请注意,根据您的评论,您误解了区分大小写的参数。它是IgnoreCase
而不是CaseSensitive
。
至于结果:
IgnoreCase
设置为TRUE
的小写表达式无效IgnoreCase
设置为FALSE
,大写模式 - 将不匹配IgnoreCase
设置为TRUE
的小写表达式无效IgnoreCase
设置为TRUE
的小写表达式无效真是运气不好,没有一个人工作:)