Наткнулся на некоторую проблему, в работе со строками. На сколько я понимаю в r0, для этого есть только функции Rtl*. Задача, самое простое - объединять строки и обрезать. Для 1го существует функция RtlAppendUnicodeToString, чтобы её использовать нужно выделять пул с подходящим размером, статическая строка не подойдёт, иначе STATUS_BUFFER_TOO_SMALL . Код (Text): NewDir=(PUNICODE_STRING)ExAllocatePoolWithTag(PagedPool,PAGE_SIZE,'rDN'); RtlZeroMemory(NewDir,PAGE_SIZE); NewDir->Length=0x0; NewDir->MaximumLength=0x10; //RtlAppendUnicodeToString видемо проверяет размер строки и нужно как-то обозначить размер status=RtlAppendUnicodeToString(NewDir,L"123"); DbgPrint("NewDir->Buffer:%ws",&NewDir->Buffer); ExFreePool(NewDir); В результате чего bsod на RtlAppendUnicodeToString. Также строки можно объединять используя RtlCopyMemory. Код (Text): NewDir=(PUNICODE_STRING)ExAllocatePoolWithTag(PagedPool,PAGE_SIZE,'rDN'); RtlZeroMemory(NewDir,PAGE_SIZE); RtlCopyMemory(&NewDir->Buffer, Name.Buffer, Name.Length ); NewDir->Length+=Name.Length; DbgPrint("NewDir->Buffer:%ws",&NewDir->Buffer); ExFreePool(NewDir); Вроде работает, но если хочу добавить не в начало: Код (Text): RtlCopyMemory(&NewDir->Buffer[NewDir->Length/sizeof(WCHAR)], Name.Buffer, Name.Length ); bsod, возможно указатель неверно передаю.. Есть ли ещё другие споспобы объединения строк? Может более оптимальные, т.к. в коде будет использоваться много раз, скорость важна. Есть ли смысл свои писать? --- Для 2го, можно просто обрезать строку нулями, или если это структура UNICODE_STRING, подсатавлять в размер нужные значения. Будет ли это хорошим решением? Потому как в целом безопасность кода тоже важна, охото найти хорошее решение, которое потом можно будет юзать в различных ситуациях.
Судя по коду, UNICODE_STRING обрабатывается неправильно. Структура выглядит так: Код (Text): typedef struct _LSA_UNICODE_STRING { USHORT Length; USHORT MaximumLength; PWSTR Buffer; } LSA_UNICODE_STRING, *PLSA_UNICODE_STRING, UNICODE_STRING, *PUNICODE_STRING; Т.е. третий ее член -- указатель на строку, а не сама строка Т.к. после RtlZeroMemory там лежит 0, то RtlAppendUnicodeToString пытается записать по этому адресу, после чего происходит BSoD. Вообще, для работы с UNICODE_STRING самое правильное (чаще всего) -- объявить саму структуру в стеке, а вот Buffer уже выделять динамически. Т.е. должно быть что-то вроде: Код (Text): UNICODE_STRING UnicodeString; UnicodeString.Buffer = ExAllocatePool(..., N); UnicodeString.MaxLength = N;
Mika0x65, Спасибо. Если выделить динамически только буфер, работают обе функции. Как-то я не внимательно структуру смотрел =\ Что насчет второго пункта? Есть вариаты лучше, чем искать определённое сочетани символов в строке и затем уменьшать USHORT Length?
Для инициализации паолей Unicode-структуры полезнее юзать RtlInitUnicodeString и т.п. + wcscat, wcsncat для объединения строк, содержащихся в буфере. Обычно редко именно UNICODE_STRING приходится юзать, WCHAR - другое дело.