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

  • водитель подписывается свидетельством об испытании

  • я отслеживаю код в отладчике ядра

  • код не аварийно завершает работу, но не может быть вызван пользователем режим


Что является очевидным, что я упускаю ?

503   1  

1 ответ:

В документации говорится

Если IgnoreCase равно TRUE, Expression должно быть, в верхнем регистре.

Обратите внимание, что, согласно Вашим комментариям, вы неправильно поняли параметр чувствительности к регистру. Это IgnoreCase не CaseSensitive.

Что касается результатов:

  1. выражение в нижнем регистре с IgnoreCase равным TRUE - не будет работать
  2. выражение в нижнем регистре, IgnoreCase установлено в FALSE, верхний регистр шаблон-не будет соответствовать
  3. выражение в нижнем регистре с IgnoreCase равным TRUE - не будет работа
  4. выражение в нижнем регистре с IgnoreCase равным TRUE - не будет работать

Просто очень не повезло, что ни один не сработал :)

Comments

    Ничего не найдено.