2013-03-21 2 views
0

Я использую pFileObject-> FileName, чтобы получить имя файла, открытого в режиме ядра фильтра driver.This Имя исполняемого файла, возвращаемый это в виде UNICODE_STRING. Я хочу преобразовать его в std String. Что такое метод ??? Пожалуйста, приводятся в качестве примера, если это возможно ... Ниже приведен кодUNICODE_STRING к StD Строка преобразования

NTSTATUS FsFilterDispatchCreate(
    __in PDEVICE_OBJECT DeviceObject, 
    __in PIRP   Irp 
    ) 
{ 
    PFILE_OBJECT pFileObject = IoGetCurrentIrpStackLocation(Irp)->FileObject; 

    DbgPrint("%wZ\n", &pFileObject->FileName); 

    return FsFilterDispatchPassThrough(DeviceObject, Irp); 
} 
+4

Две вещи, которые вы никогда не должны делать в драйвере устройства: при условии, что работает оператор * new * по умолчанию и предполагается, что существует допустимая кодовая страница. Do ** not ** используйте std :: string в драйвере. –

+1

Как отметил Ханс, этот план является не стартером. В режиме ядра MSVCR90.DLL отсутствует. –

+0

@Hans Я не планирую использовать std :: string в KM, а я буду использовать его в UM –

ответ

2

Я согласен с комментарием Ганса. Сделать std :: classes работать в режиме ядра Windows чрезвычайно сложно, если не невозможно. По умолчанию среда WinDDK - это C, а не C++. Лучше всего конвертировать UNICODE_STRING в ANSI строку с нулевым завершением. (Вы можете распечатать его с помощью DbgPrint («% s» ...) и т. Д.). См. Пример ниже.

UNICODE_STRING tmp; 

// ... 

ANSI_STRING dest; 
ULONG unicodeBufferSize = tmp.Length; 
// Length of unicode string in bytes must be enough to keep ANSI string 
dest.Buffer = (PCHAR)ExAllocatePool(NonPagedPool, unicodeBufferSize+1); 
// check for allocation failure... 
dest.Length = 0; 
dest.MaximumLength = unicodeBufferSize+1; 

RtlUnicodeStringToAnsiString(&dest, &tmp, FALSE); 
// check for failure... 
dest.Buffer[dest.Length] = 0; // now we get it in dest.Buffer 
Смежные вопросы