Всем привет! Помогите плз решить проблему. Нужно по букве диска (например C:, G получить STORAGE_DEVICE_DESCRIPTOR. Делаю так: Код (Text): ... ntStatus = IoGetDeviceObjectPointer(pusDriveName, FILE_READ_ATTRIBUTES, &FileObject, &DeviceObject); // pusDriveName = \??\C: if( !NT_SUCCESS(ntStatus) ) goto END; KeInitializeEvent(&Event, NotificationEvent, FALSE); RtlZeroMemory(&sddQuery, sizeof(STORAGE_PROPERTY_QUERY)); RtlZeroMemory(&sdd, sizeof(STORAGE_DEVICE_DESCRIPTOR)); sddQuery.QueryType = PropertyStandardQuery; sddQuery.PropertyId = StorageDeviceProperty; pIrp = IoBuildDeviceIoControlRequest(IOCTL_STORAGE_QUERY_PROPERTY, DeviceObject, &sddQuery, sizeof(STORAGE_PROPERTY_QUERY), &sdd, sizeof(STORAGE_DEVICE_DESCRIPTOR), TRUE, &Event, &ioStatus); if( pIrp == NULL ) goto END; ntStatus = IoCallDriver(DeviceObject, pIrp); if( ntStatus == STATUS_PENDING ) { #ifdef DEBUG_PRINT DbgPrint("IoCallDriver Waiting..."); #endif KeWaitForSingleObject(&Event, Executive, KernelMode, FALSE, NULL); } else if( !NT_SUCCESS(ntStatus) ){ #ifdef DEBUG_PRINT DbgPrint("IoCallDriver error [0x%08X]", ntStatus); #endif goto END; } ... IoCallDriver постоянно возвращает STATUS_INVALID_DEVICE_REQUEST (0xC0000010). Какое же объект-устройство в данном случае нужно и как его получить? И еще по какой причине, если в IoGetDeviceObjectPointer указываю флаги отличные от FILE_READ_ATTRIBUTES (например FILE_ALL_ACCESS), то система зависает полностью? Заранее благодарен!
и, если че не помню, но разве в IoGetDeviceObjectPointer() не GENERIC_??? вместо FILE_??? нужно использовать?