2012-05-08 6 views
3

Я выполняю строковое сопоставление в драйвере ядра с помощью Boyer-Moore algorithm, но мне также необходимо реализовать базовую поддержку подстановочных знаков. This answer on SO упоминает функцию FsRtlIsNameInExpression, которая выглядит правильно для моих нужд. Он даже выглядит так, что он обрабатывает нечувствительность к регистру для строк Unicode.FsRtlIsNameInExpression никогда не соответствует ни одному

Но он не может даже заставить его соответствовать простой строке с собой.

Я пробовал несколько вещей, но 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)
  • Драйвер работает в Virtual Box принимал Windows 7 Pro 64 биты на моей Windows 7 Ultimate 64 бит
  • водитель подписывается сертификатом испытаний
  • трассировать код в отладчик ядра
  • Код не сбой, но не может быть вызван в пользовательском режиме

Что очевидно, что мне не хватает?

ответ

1

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

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

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

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

  1. выражения нижнего регистра с IgnoreCase набором для TRUE - не будет работать
  2. Строчного выражения, IgnoreCase набор для FALSE, верхнего регистр узор - выиграл» t соответствует
  3. Нижняя регистр с IgnoreCase установлена ​​в TRUE - не будет работать
  4. Младшее выражение w Ith IgnoreCase набор для TRUE - не будет работать

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

+0

Еще одно доказательство того, что Мерфи таится поздно ночью! Он работает, я смог сопоставить 'J'ai déjà testé ça et j'ai détesté ça' с' * TE? TÉ * '. – ixe013

+0

Рад помочь! J'adore le code, et al vous aimera en retour. Déteste le code, et il vous déteste le dos. –

Смежные вопросы