4

我使用Boyer-Moore 算法在内核驱动程序中进行字符串匹配,但我还需要实现基本的通配符支持。这个关于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
}

作为记录 :

  • 我正在使用 WDK 版本 7600.16385.1,检查构建(我的代码,不是 Windows)
  • 该驱动程序在我的 Windows 7 Ultimate 64 位上托管 Windows 7 Pro 64 位的 Virtual Box 中运行
  • 驱动程序由测试证书签名
  • 我在内核调试器中跟踪代码
  • 代码不会崩溃,但不能在用户态调用

我缺少什么明显的东西?

4

1 回答 1

3

文件说

如果IgnoreCaseTRUE,则Expression必须为大写。

请注意,根据您的评论,您误解了区分大小写的参数。它IgnoreCase不是CaseSensitive

至于结果:

  1. IgnoreCase设置为-的小写表达式TRUE不起作用
  2. 小写表达式,IgnoreCase设置为FALSE大写模式 - 不匹配
  3. IgnoreCase设置为-的小写表达式TRUE不起作用
  4. IgnoreCase设置为-的小写表达式TRUE不起作用

只是运气不好,没有一个工作:)

于 2012-05-08T05:26:16.780 回答