Как получить PDRIVER_OBJECT по его имени

Тема в разделе "WASM.NT.KERNEL", создана пользователем fedotov, 24 июл 2008.

  1. fedotov

    fedotov New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2008
    Сообщения:
    30
    Всем доброго дня

    Как получить PDRIVER_OBJECT по его имени.
    если я знаю его DEVICE_OBJECT имя, то я знаю как это сделать.

    Большое спасибо
     
  2. fedotov

    fedotov New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2008
    Сообщения:
    30
    Я получил DriverObject и успешно перчисляю его DiviceObject, но у них у всех имена = "(null)", хотя я вижу в DeviceTree.exe, что они не являются unnamed.
    Помогите, времени у меня уже вообще нет, горю.
    Код (Text):
    1. RtlInitUnicodeString( &nameUsbStor, L"\\Driver\\USBSTOR" );
    2.  status = ObReferenceObjectByName(&nameUsbStor,OBJ_CASE_INSENSITIVE,NULL,(ACCESS_MASK)0L,*IoDriverObjectType,KernelMode,NULL,&DriverObject);
    3. if (NT_SUCCESS( status ))
    4. {
    5. // request to know number of devices in USBSTOR
    6. status = (gFuncTbl.EnumerateDeviceObjectList)(DriverObject,NULL,0,&numDevices);
    7.  
    8. DbgPrint("USBSTOR has devices num = %d \r\n",numDevices);
    9.  
    10. if(status != STATUS_BUFFER_TOO_SMALL) goto func_exit_deref;
    11.  
    12. numDevices += 8;//for some bad case
    13.  
    14. devList = SDalloc(numDevices * sizeof(PDEVICE_OBJECT));
    15.        
    16. if (NULL == devList)                  goto func_exit_deref;
    17.  
    18. status = (gFuncTbl.EnumerateDeviceObjectList)(DriverObject,devList,(numDevices * sizeof(PDEVICE_OBJECT)),&numDevices);
    19. if (!NT_SUCCESS( status ))  
    20. {
    21.     SDfree(devList);
    22.     goto func_exit_deref;
    23. }
    24. //  Walk the given list of devices into USBSTOR
    25. for (i=0; i < numDevices; i++)
    26. {
    27.    try
    28.   {
    29.        SDGetObjectName( devList[i], &name );
    30.       DbgPrint("device object of USBSTOR name = %wZ \r\n", &name);
    31.  
    32.     baseDeviceObject = (gFuncTbl.GetDeviceAttachmentBaseRef)( devList[i] );
    33.     SDGetObjectName( baseDeviceObject, &name )
    34.    ObDereferenceObject( baseDeviceObject );
    35.            
    36.     DbgPrint("baseDeviceObject name = %wZ \r\n",&name);
    37.  
    38.     currentDevObj = (gFuncTbl.GetAttachedDeviceReference)( devList[i] );
    39.     do
    40.     {
    41.          SDGetObjectName( currentDevObj, &name );
    42.          DbgPrint("device object of USBSTOR name = %wZ \r\n", &name);
    43.         nextDevObj = (gFuncTbl.GetLowerDeviceObject)( currentDevObj );
    44.        ObDereferenceObject( currentDevObj );
    45.        currentDevObj = nextDevObj;
    46.  
    47.        } while (NULL != currentDevObj);
    48.  
    49. }
    50. finally
    51. {
    52.     ObDereferenceObject( devList[i] );
    53. }
    54. }
    55. ObDereferenceObject( DriverObject );
    56. }
    57. //=========================
    58. VOID SDGetObjectName (IN PVOID Object,IN OUT PUNICODE_STRING Name)
    59. {
    60.     NTSTATUS status;
    61.     CHAR nibuf[512];        //buffer that receives NAME information and name
    62.     POBJECT_NAME_INFORMATION nameInfo = (POBJECT_NAME_INFORMATION)nibuf;
    63.     ULONG retLength;
    64.  
    65.     status = ObQueryNameString( Object, nameInfo, sizeof(nibuf), &retLength);
    66.  
    67.     Name->Length = 0;
    68.     if (NT_SUCCESS( status ))
    69.     {
    70.         RtlCopyUnicodeString( Name, &nameInfo->Name );
    71.     }
    72. }
     
  3. fedotov

    fedotov New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2008
    Сообщения:
    30
    код рабочий, просто я по ошибке делая некоторые модификации, закоментил нужную строчку кода. Меня сроки сильно поджимают.
    Проблема решена
    Спасибо всем кто хотел мне помочь.