2013-10-14 7 views
0

Первая попытка разработки драйверов Windows. Как преобразовать массив WCHAR (исходящий из пользовательского пространства) в UNICODE_STRING (в режиме ядра), предполагая, что массив WCHAR равен , а не с нулевой остановкой?Преобразование WCHAR * в UNICODE STRING

Должен ли я проверить, заканчивается ли оно нулевым, и если он не выделяет новый буфер (+2 для нулевого), а затем использовать функции RtlAnsiXXX? Каков правильный путь?

Спасибо!

ответ

1

Для инициализации UNICODE_STRING из массива wchar используйте RtlInitUnicodeString.

WCHAR-массив должен быть завершен с нуля.

Итак, если вы отметили, и строка wchar не завершена нулевым символом, вы должны выделить новый буфер (+ sizeof (WCHAR) для null), скопировать содержимое массива и затем вызвать RtlInitUnicodeString.

Чтобы проверить WCHAR строка из пользовательского режима заканчивается нулем Я использую:

BOOLEAN IsStringTerminated(PWCHAR Array, USHORT ArrayLength, USHORT *StringLength) 
{ 
    BOOLEAN bStringIsTerminated = FALSE; 
    USHORT uiIndex = 0; 

    *StringLength = 0; 

    while(uiIndex < ArrayLength && bStringIsTerminated == FALSE) 
    { 
     if(Array[uiIndex] == L'\0') 
     { 
      *StringLength = uiIndex + 1; 
      bStringIsTerminated = TRUE; 
     } 
     else 
     { 
      uiIndex++; 
     } 
    } 

    return bStringIsTerminated; 
} 
+0

спасибо! Предположим, что буфер, который поступает из пользовательского пространства (irp-> AssociatedIrp.SystemBuffer), не завершен с нулевой точки, какие функции режима ядра я должен использовать для выделения нового буфера? ExAllocatePoolWithTag? – user1782427

+0

Да Для этого вы можете использовать ExAllocatePool. – ladan

0

WCHAR массив не должен быть нулем. Структура UNICODE_STRING была разработана для подсчитанных строк и, как таковая, работает с массивами WCHAR с прекращением NULL - вам, конечно, придется знать длину.

Например, вы можете использовать RtlInitEmptyUnicodeString.