При определении имени устройства DbgPrint выводит непонятную ерунду

Тема в разделе "WASM.NT.KERNEL", создана пользователем steelfactor, 6 янв 2009.

  1. steelfactor

    steelfactor New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    501
    Всем привет. Стоит задача - получить имена установленных устройств в ядре. Делаю так (код честно стырил у n0name :))
    Код (Text):
    1. PUNICODE_STRING GetName(IN POBJECT_DIRECTORY_ENTRY Drv)
    2. {
    3.     POBJECT_HEADER_NAME_INFO NameInfo;
    4.     POBJECT_HEADER ObjHeader;
    5.     if ((!Drv) || (!Drv->Object))
    6.         return NULL;
    7.     ObjHeader = OBJECT_TO_OBJECT_HEADER(Drv->Object);
    8.     NameInfo = OBJECT_HEADER_TO_NAME_INFO(ObjHeader);
    9.     if (!NameInfo)
    10.           return NULL;
    11.     DbgPrint("%ws\n", NameInfo->Name.Buffer); //<--------- выводит
    12.     return &NameInfo->Name;
    13. }
    14.  
    15. VOID Find()
    16. {
    17.     UNICODE_STRING usDirName;
    18.     OBJECT_ATTRIBUTES oa;
    19.     HANDLE hDir = NULL;
    20.     POBJECT_DIRECTORY pDir = NULL;
    21.     POBJECT_DIRECTORY_ENTRY pEntry;
    22.     NTSTATUS status;
    23.     ULONG i;
    24.  
    25.     RtlInitUnicodeString(&usDirName, L"\\Device");
    26.     InitializeObjectAttributes(&oa, &usDirName, OBJ_CASE_INSENSITIVE, NULL, NULL);
    27.     status = ObOpenObjectByName(&oa, NULL, KernelMode, NULL, GENERIC_READ, NULL, &hDir);
    28.     if (status != STATUS_SUCCESS)
    29.         goto exit;    
    30.     status = ObReferenceObjectByHandle(hDir, FILE_ANY_ACCESS, NULL, KernelMode, &pDir, NULL);
    31.     if (status != STATUS_SUCCESS)
    32.         goto exit;    
    33.     for (i = 0; i < NUMBER_HASH_BUCKETS; i++)
    34.    {
    35.         pEntry = pDir->HashBuckets[i];
    36.         while (pEntry)
    37.         {
    38.             if(GetName(pEntry) == NULL)
    39.     {
    40.                   //что-то там делаем...
    41.          goto exit;
    42.     }
    43.     pEntry = pEntry->ChainLink;
    44.         }
    45.     }
    46. exit:
    47.     if (pDir)
    48.         ObDereferenceObject(pDir);
    49.     if (hDir)
    50.         ZwClose(hDir);
    51. }
    Проблема в том, что DbgPrint в функции GetName имена большей части найденных устройств выводит в таком вот малочитаемом виде:
    и т.д., хотя имена отдельных устройств, например Ndis, Afd и др. отображаются нормально.
    Почему так?
     
  2. Partner

    Partner Павел

    Публикаций:
    0
    Регистрация:
    28 фев 2008
    Сообщения:
    917
    Адрес:
    Los Angeles
    Name - это UNICODE_STRING
    Name.Buffer - в конце строки не обязан быть ноль. Вместо этого длина строки записана в Name.Length
    Некоторые отображаются правильно, потому что в конце строки случайно оказался ноль.
     
  3. Forever

    Forever Виталий

    Публикаций:
    0
    Регистрация:
    12 апр 2008
    Сообщения:
    244
    Partner дело говорит. Пиши так
    Код (Text):
    1. DbgPrint( "%wZ", & NameInfo->Name )
    %wZ - специльно предназначен для вывода структур UNICODE_STRING. Требуется передать указатель на такую структуру.
     
  4. steelfactor

    steelfactor New Member

    Публикаций:
    0
    Регистрация:
    26 апр 2007
    Сообщения:
    501
    Forever, Partner
    спасибо!
    Насчет %wZ реально не знал...