Преобразование UNICODE_STRING в стандартную строку

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

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

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

    return FsFilterDispatchPassThrough(DeviceObject, Irp);
}

person Muhammad Irfan    schedule 21.03.2013    source источник
comment
Две вещи, которые вы никогда не должны делать в драйвере устройства: предполагать, что оператор new по умолчанию работает, и предполагать, что существует допустимая кодовая страница. Не используйте std::string в драйвере.   -  person Hans Passant    schedule 21.03.2013
comment
Как заметил Ханс, этот план не является стартовым. В режиме ядра MSVCR90.DLL отсутствует.   -  person Raymond Chen    schedule 22.03.2013
comment
@Hans Я не планирую использовать std::string в KM, скорее я буду использовать его в UM   -  person Muhammad Irfan    schedule 22.03.2013


Ответы (1)


Я согласен с комментарием Ганса. Заставить классы std:: работать в режиме ядра 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
person glagolig    schedule 21.03.2013