FsRtlIsNameInExpression никогда ни с чем не совпадает
Я делаю сопоставление строк в драйвере ядра с помощью алгоритма Бойера-Мура, но мне также нужно реализовать базовую поддержку подстановочных знаков. Этот ответ на 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 Pro 64 bits на моем Windows 7 Ultimate 64 bits
- водитель подписывается свидетельством об испытании
- я отслеживаю код в отладчике ядра
- код не аварийно завершает работу, но не может быть вызван пользователем режим
Что является очевидным, что я упускаю ?
1 ответ:
В документации говорится
Обратите внимание, что, согласно Вашим комментариям, вы неправильно поняли параметр чувствительности к регистру. ЭтоЕсли
IgnoreCaseравноTRUE,Expressionдолжно быть, в верхнем регистре.IgnoreCaseнеCaseSensitive.Что касается результатов:
- выражение в нижнем регистре с
IgnoreCaseравнымTRUE- не будет работать- выражение в нижнем регистре,
IgnoreCaseустановлено вFALSE, верхний регистр шаблон-не будет соответствовать- выражение в нижнем регистре с
IgnoreCaseравнымTRUE- не будет работа- выражение в нижнем регистре с
IgnoreCaseравнымTRUE- не будет работатьПросто очень не повезло, что ни один не сработал :)
Comments