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