Всем привет. Стоит задача - получить имена установленных устройств в ядре. Делаю так (код честно стырил у n0name ) Код (Text): PUNICODE_STRING GetName(IN POBJECT_DIRECTORY_ENTRY Drv) { POBJECT_HEADER_NAME_INFO NameInfo; POBJECT_HEADER ObjHeader; if ((!Drv) || (!Drv->Object)) return NULL; ObjHeader = OBJECT_TO_OBJECT_HEADER(Drv->Object); NameInfo = OBJECT_HEADER_TO_NAME_INFO(ObjHeader); if (!NameInfo) return NULL; DbgPrint("%ws\n", NameInfo->Name.Buffer); //<--------- выводит return &NameInfo->Name; } VOID Find() { UNICODE_STRING usDirName; OBJECT_ATTRIBUTES oa; HANDLE hDir = NULL; POBJECT_DIRECTORY pDir = NULL; POBJECT_DIRECTORY_ENTRY pEntry; NTSTATUS status; ULONG i; RtlInitUnicodeString(&usDirName, L"\\Device"); InitializeObjectAttributes(&oa, &usDirName, OBJ_CASE_INSENSITIVE, NULL, NULL); status = ObOpenObjectByName(&oa, NULL, KernelMode, NULL, GENERIC_READ, NULL, &hDir); if (status != STATUS_SUCCESS) goto exit; status = ObReferenceObjectByHandle(hDir, FILE_ANY_ACCESS, NULL, KernelMode, &pDir, NULL); if (status != STATUS_SUCCESS) goto exit; for (i = 0; i < NUMBER_HASH_BUCKETS; i++) { pEntry = pDir->HashBuckets[i]; while (pEntry) { if(GetName(pEntry) == NULL) { //что-то там делаем... goto exit; } pEntry = pEntry->ChainLink; } } exit: if (pDir) ObDereferenceObject(pDir); if (hDir) ZwClose(hDir); } Проблема в том, что DbgPrint в функции GetName имена большей части найденных устройств выводит в таком вот малочитаемом виде: и т.д., хотя имена отдельных устройств, например Ndis, Afd и др. отображаются нормально. Почему так?
Name - это UNICODE_STRING Name.Buffer - в конце строки не обязан быть ноль. Вместо этого длина строки записана в Name.Length Некоторые отображаются правильно, потому что в конце строки случайно оказался ноль.
Partner дело говорит. Пиши так Код (Text): DbgPrint( "%wZ", & NameInfo->Name ) %wZ - специльно предназначен для вывода структур UNICODE_STRING. Требуется передать указатель на такую структуру.