Всем доброго дня Как получить PDRIVER_OBJECT по его имени. если я знаю его DEVICE_OBJECT имя, то я знаю как это сделать. Большое спасибо
Я получил DriverObject и успешно перчисляю его DiviceObject, но у них у всех имена = "(null)", хотя я вижу в DeviceTree.exe, что они не являются unnamed. Помогите, времени у меня уже вообще нет, горю. Код (Text): RtlInitUnicodeString( &nameUsbStor, L"\\Driver\\USBSTOR" ); status = ObReferenceObjectByName(&nameUsbStor,OBJ_CASE_INSENSITIVE,NULL,(ACCESS_MASK)0L,*IoDriverObjectType,KernelMode,NULL,&DriverObject); if (NT_SUCCESS( status )) { // request to know number of devices in USBSTOR status = (gFuncTbl.EnumerateDeviceObjectList)(DriverObject,NULL,0,&numDevices); DbgPrint("USBSTOR has devices num = %d \r\n",numDevices); if(status != STATUS_BUFFER_TOO_SMALL) goto func_exit_deref; numDevices += 8;//for some bad case devList = SDalloc(numDevices * sizeof(PDEVICE_OBJECT)); if (NULL == devList) goto func_exit_deref; status = (gFuncTbl.EnumerateDeviceObjectList)(DriverObject,devList,(numDevices * sizeof(PDEVICE_OBJECT)),&numDevices); if (!NT_SUCCESS( status )) { SDfree(devList); goto func_exit_deref; } // Walk the given list of devices into USBSTOR for (i=0; i < numDevices; i++) { try { SDGetObjectName( devList[i], &name ); DbgPrint("device object of USBSTOR name = %wZ \r\n", &name); baseDeviceObject = (gFuncTbl.GetDeviceAttachmentBaseRef)( devList[i] ); SDGetObjectName( baseDeviceObject, &name ) ObDereferenceObject( baseDeviceObject ); DbgPrint("baseDeviceObject name = %wZ \r\n",&name); currentDevObj = (gFuncTbl.GetAttachedDeviceReference)( devList[i] ); do { SDGetObjectName( currentDevObj, &name ); DbgPrint("device object of USBSTOR name = %wZ \r\n", &name); nextDevObj = (gFuncTbl.GetLowerDeviceObject)( currentDevObj ); ObDereferenceObject( currentDevObj ); currentDevObj = nextDevObj; } while (NULL != currentDevObj); } finally { ObDereferenceObject( devList[i] ); } } ObDereferenceObject( DriverObject ); } //========================= VOID SDGetObjectName (IN PVOID Object,IN OUT PUNICODE_STRING Name) { NTSTATUS status; CHAR nibuf[512]; //buffer that receives NAME information and name POBJECT_NAME_INFORMATION nameInfo = (POBJECT_NAME_INFORMATION)nibuf; ULONG retLength; status = ObQueryNameString( Object, nameInfo, sizeof(nibuf), &retLength); Name->Length = 0; if (NT_SUCCESS( status )) { RtlCopyUnicodeString( Name, &nameInfo->Name ); } }
код рабочий, просто я по ошибке делая некоторые модификации, закоментил нужную строчку кода. Меня сроки сильно поджимают. Проблема решена Спасибо всем кто хотел мне помочь.