Ишу аналог wcsstr для UNICODE_STRING

Тема в разделе "WASM.NT.KERNEL", создана пользователем ntcdm, 24 апр 2009.

  1. ntcdm

    ntcdm New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2007
    Сообщения:
    247
    Здравствуйте, уважаемые форумчане!

    В моем драйвере необходимо во многих местах найти подстроку в строке UNICODE_STRING. Для строк, оканчивающихся нулем, я обычно использую wcsstr. Но так как UNICODE_STRING::Buffer не обязательно завершается нулем, но приходится придумывать что-то другое. На данный момент я остановился на вот такой реализации:

    Код (Text):
    1. WCHAR* safe_wcsstr(const PUNICODE_STRING str1, const WCHAR* str2)
    2. {
    3.     WCHAR wszBuffer[256];
    4.  
    5.     if (ExGetPreviousMode() == KernelMode)
    6.     {
    7.         if (str1 != NULL &&
    8.             str1->Buffer != NULL &&
    9.             str1->Length < sizeof(wszBuffer))
    10.         {
    11.             memcpy(wszBuffer,str1->Buffer,str1->Length);
    12.             wszBuffer[str1->Length/2] = L'\0';
    13.  
    14.             return wcsstr(wszBuffer,str2);
    15.         }
    16.     }
    17.     else
    18.     {
    19.         __try{
    20.  
    21.             if (str1 != NULL &&
    22.                 str1->Buffer != NULL &&
    23.                 str1->Length < sizeof(wszBuffer))
    24.             {
    25.  
    26.                 memcpy(wszBuffer,str1->Buffer,str1->Length);
    27.                 wszBuffer[str1->Length/2] = L'\0';
    28.  
    29.                 return wcsstr(wszBuffer,str2);
    30.             }
    31.         }
    32.         __except(EXCEPTION_EXECUTE_HANDLER)
    33.         {
    34.         }
    35.  
    36.     }
    37.  
    38.     return NULL;
    39. }
    Но она мне не очень нравится по причине создания своего буфера и копирования в него что медленно и занимает память.

    Подскажите, может быть в ядре уже есть функция которую я ищу (поиск подстроки) из каких-нибудь RtlXXX или кто-нибудь уже решал подобную задачу и есть решение ?

    Всего хорошего!
     
  2. Ev0lwaves

    Ev0lwaves New Member

    Публикаций:
    0
    Регистрация:
    26 дек 2008
    Сообщения:
    125
    RtlCompareUnicodeString
     
  3. x64

    x64 New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    1.370
    Адрес:
    Россия
    Несерьёзно как-то... Честно говоря, даже не смешно уже.
     
  4. ntcdm

    ntcdm New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2007
    Сообщения:
    247
    Ev0lwaves
    RtlCompareUnicodeString мне не подходит т.к. сравнивает 2 строки, мне же надо найди подстроку, т.е. строка №2 может быть например и в середине строки №1

    x64
    Ну а что тут такого? Я просто спросил, есть ли такая функция, чтобы не изобретать велосипед, может я чего-то проглядел, а народ тут знающий :)
     
  5. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    ntcdm
    > то-нибудь уже решал подобную задачу
    Попробуй
    Код (Text):
    1. WCHAR *foo(const PUNICODE_STRING str1, const WCHAR *str2)
    2. {
    3.   if (str1 && str1->Buffer)
    4.   {
    5.     WCHAR *c = str1->Buffer;
    6.     USHORT l = str1->Length / 2;
    7.  
    8.     while (l)
    9.     {
    10.       WCHAR *s1 = c;
    11.       WCHAR *s2 = (WCHAR *) str2;
    12.       USHORT k  = l;
    13.  
    14.       while (k && *s2 && !(*s1 - *s2))
    15.         s1++, s2++, k--;
    16.  
    17.       if (!*s2)
    18.         return c;
    19.  
    20.       c++;
    21.       l--;
    22.     }
    23.   }
    24.  
    25.   return NULL;
    26. }
     
  6. Forever

    Forever Виталий

    Публикаций:
    0
    Регистрация:
    12 апр 2008
    Сообщения:
    244
    Поиск подстроки в строке - алгоритм Кнута-Морисса-Пратта, Боуэра-Мура ... Лезешь в википедию и пишешь. Там кода то, строчек 15.
     
  7. ntcdm

    ntcdm New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2007
    Сообщения:
    247
    q_q
    Большое человеческое Спасибо!

    Forever
    Ок, гляну
     
  8. ntcdm

    ntcdm New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2007
    Сообщения:
    247
    q_q
    Все работает отлично, Спасибо!
     
  9. SashaTalakin

    SashaTalakin New Member

    Публикаций:
    0
    Регистрация:
    15 дек 2008
    Сообщения:
    261
    Честно говоря хотел не согласиться по началу. Т.к. есть некот. доля непрофессионализма городить огород собственных велосипедов в коде драйвера. Т.е. если есть стандартный докум. возможности ОС для каких-то элементарных задач, то один из признаков вашей эрудиции как того же разработчика драйверов - знать эти стандартные средства и использовать их. Но после этого:
    ясно что это не из той оперы.
     
  10. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    SashaTalakin
    #9 переведи на человеческий.
     
  11. asmfan

    asmfan New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2006
    Сообщения:
    1.004
    Адрес:
    Abaddon
    ntcdm
    Копирование это верный способ. Посмотри как много копирования юзермодных параметров в системный буфер в коде из WRK. А всё из-за ненадёжности юзермодного/другого буфера.
    И try/except уместно. Твои первоначальный код хорош.