Здравствуйте, уважаемые форумчане! В моем драйвере необходимо во многих местах найти подстроку в строке UNICODE_STRING. Для строк, оканчивающихся нулем, я обычно использую wcsstr. Но так как UNICODE_STRING::Buffer не обязательно завершается нулем, но приходится придумывать что-то другое. На данный момент я остановился на вот такой реализации: Код (Text): WCHAR* safe_wcsstr(const PUNICODE_STRING str1, const WCHAR* str2) { WCHAR wszBuffer[256]; if (ExGetPreviousMode() == KernelMode) { if (str1 != NULL && str1->Buffer != NULL && str1->Length < sizeof(wszBuffer)) { memcpy(wszBuffer,str1->Buffer,str1->Length); wszBuffer[str1->Length/2] = L'\0'; return wcsstr(wszBuffer,str2); } } else { __try{ if (str1 != NULL && str1->Buffer != NULL && str1->Length < sizeof(wszBuffer)) { memcpy(wszBuffer,str1->Buffer,str1->Length); wszBuffer[str1->Length/2] = L'\0'; return wcsstr(wszBuffer,str2); } } __except(EXCEPTION_EXECUTE_HANDLER) { } } return NULL; } Но она мне не очень нравится по причине создания своего буфера и копирования в него что медленно и занимает память. Подскажите, может быть в ядре уже есть функция которую я ищу (поиск подстроки) из каких-нибудь RtlXXX или кто-нибудь уже решал подобную задачу и есть решение ? Всего хорошего!
Ev0lwaves RtlCompareUnicodeString мне не подходит т.к. сравнивает 2 строки, мне же надо найди подстроку, т.е. строка №2 может быть например и в середине строки №1 x64 Ну а что тут такого? Я просто спросил, есть ли такая функция, чтобы не изобретать велосипед, может я чего-то проглядел, а народ тут знающий
ntcdm > то-нибудь уже решал подобную задачу Попробуй Код (Text): WCHAR *foo(const PUNICODE_STRING str1, const WCHAR *str2) { if (str1 && str1->Buffer) { WCHAR *c = str1->Buffer; USHORT l = str1->Length / 2; while (l) { WCHAR *s1 = c; WCHAR *s2 = (WCHAR *) str2; USHORT k = l; while (k && *s2 && !(*s1 - *s2)) s1++, s2++, k--; if (!*s2) return c; c++; l--; } } return NULL; }
Поиск подстроки в строке - алгоритм Кнута-Морисса-Пратта, Боуэра-Мура ... Лезешь в википедию и пишешь. Там кода то, строчек 15.
Честно говоря хотел не согласиться по началу. Т.к. есть некот. доля непрофессионализма городить огород собственных велосипедов в коде драйвера. Т.е. если есть стандартный докум. возможности ОС для каких-то элементарных задач, то один из признаков вашей эрудиции как того же разработчика драйверов - знать эти стандартные средства и использовать их. Но после этого: ясно что это не из той оперы.
ntcdm Копирование это верный способ. Посмотри как много копирования юзермодных параметров в системный буфер в коде из WRK. А всё из-за ненадёжности юзермодного/другого буфера. И try/except уместно. Твои первоначальный код хорош.