4

ボイヤームーアアルゴリズムを使用してカーネルドライバーで文字列照合を行いますが、基本的なワイルドカードサポートも実装する必要があります。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 7Ultimate64ビット上のWindows7Pro64ビットでホストされている仮想ボックスで実行されます
  • ドライバーはテスト証明書によって署名されています
  • カーネルデバッガーでコードをトレースします
  • コードはクラッシュしませんが、ユーザーモードで呼び出すことはできません

私が行方不明になっていることは明らかですか?

4

1 に答える 1

3

ドキュメントには

の場合、大文字でIgnoreCaseある必要があります。TRUEExpression

コメントによると、大文字と小文字の区別のパラメータを誤解していることに注意してください。ではありIgnoreCaseませんCaseSensitive

結果について:

  1. IgnoreCase-に設定された小文字の式は機能しTRUEません
  2. 小文字の式、にIgnoreCase設定FALSE大文字のパターン-一致しません
  3. IgnoreCase-に設定された小文字の式は機能しTRUEません
  4. IgnoreCase-に設定された小文字の式は機能しTRUEません

運が悪かったので、1つも機能しませんでした:)

于 2012-05-08T05:26:16.780 に答える