Задача: Получиться информацию о диске с которого читается файл. Т.е. Есть FileHandle, от например \Device\HarddiskVolume2\Documents and Settings\p\Desktop\dbgview.log.. PFILE_OBJECT obj; NTSTATUS status=ObReferenceObjectByHandle(handle,0,0,KernelMode,(PVOID*)&obj,NULL); далее сую этот obj в int GetParameter(IN PDEVICE_OBJECT pDeviceObject) { WCHAR* buff2; ULONG len = 0; PDEVICE_OBJECT pPDO; if(GetTargetDevicePdo(pDeviceObject,&pPDO) != STATUS_SUCCESS) { DbgPrint("\n\nError IoGetDeviceProperty: \n"); return -1; } //try to get name IoGetDeviceProperty(pPDO, DevicePropertyFriendlyName , 0, NULL, &len); if(len > 0) { buff2 = (WCHAR*)malloc_np(len); if(IoGetDeviceProperty(pPDO, DevicePropertyFriendlyName , len, buff2, &len) == STATUS_SUCCESS) { DbgPrint("Property: %S\n\n",buff2); } free(buff2); } ObDereferenceObject(pPDO); return 0; } GetTargetDevicePdo - это из пирмера DDK либо пробовал пробегая по AttachedTo (тут на форуме GetNextLowerDeviceObject). Результат тот же. Проблема в том, это этот PDO говорит что он STORAGE, а не реальный диск. Приче для CDROM работает хорошо, для жесткого диска - нет. Смотрел в дереве DeviceTree, и действительно это другая ветка, насколько я понимаю связанная с драйверами файльвой системы. Как связаны обекты этой ветки с другой, где реальный диск, со всеми параметрами я не понял... Объясните плиз.. оо великие войны дзена
Добрался в юзер моде через CM_Get_DevNode_Registry_Property и SetupDi... функции. по коду выдно, что тыкался уже наугад... Код (Text): guid = GUID_DEVINTERFACE_VOLUME; // Get device Information handle for Volume interface hDevInfo = SetupDiGetClassDevs(&guid, NULL, NULL, DIGCF_DEVICEINTERFACE | DIGCF_PRESENT); if(hDevInfo == INVALID_HANDLE_VALUE) { printf("Error - SetupDiGetClassDevs failed\n"); return 0; } // Loop until device interfaces are found. for(dwIndex = 0; ;dwIndex ++) { ZeroMemory(&devInterfaceData, sizeof(devInterfaceData)); devInterfaceData.cbSize = sizeof(devInterfaceData); // Get device Interface data. if(!SetupDiEnumDeviceInterfaces(hDevInfo, NULL, &guid, dwIndex,&devInterfaceData)) { break; } ZeroMemory(&devInfoData, sizeof(devInfoData)); devInfoData.cbSize = sizeof(devInfoData); pDevDetail = (PSP_DEVICE_INTERFACE_DETAIL_DATA)buffer; pDevDetail->cbSize = sizeof(SP_DEVICE_INTERFACE_DETAIL_DATA); // Get device interface detail data to get // Device Instance from SP_DEVINFO_DATA and // Device Path from SP_DEVICE_INTERFACE_DETAIL_DATA SetupDiGetDeviceInterfaceDetail(hDevInfo, &devInterfaceData, pDevDetail, // SP_DEVICE_INTERFACE_DETAIL_DATA BUFFER_SIZE, &dwRequiredSize, &devInfoData); // SP_DEVINFO_DATA // Get the device instance of parent. This points to USBSTOR. //CM_Get_Child(&devInstParent,devInfoData.DevInst, 0); // Get the device instance of grand parent. This points to USB root. CM_Get_Parent(&devInstParent,devInfoData.DevInst, 0); //CM_Get_Parent(&devInstParent,devInstParent,0); //CM_Get_Parent(&devInstParent,devInstParent,0); //CM_Get_Parent(&devInstParent,devInstParent,0); CM_Get_Parent(&devInstParent,devInstParent,0); // Get the device ID of the USB root. //CM_Get_Device_ID(devInstParent, buf, BUFFER_SIZE,0); CM_Get_Device_ID(devInfoData.DevInst, buf, BUFFER_SIZE,0); WCHAR buff2[1000]; ULONG len = 1000; memset(buff2,0,100); CM_Get_DevNode_Registry_Property( devInfoData.DevInst,//devInstParent, CM_DRP_HARDWAREID, NULL, buff2, &len, 0); То же саоме. Для CDRom таже нода возврашает FriendlyName и HardwareID, для флешки парент, для диска ненашел... Как то же его можно выковырять.....????
план порабощения вселенной такой: 1) ObReferenceObjectByHandle 2) Получаем из FileObject->DeviceObject 3) ObQueryNameString - имеем имя девайса 4) Затем простым перебором линков \??\A, \??\B , \??\C .. получаем из них имена девайсов и сверяем с нашим код не дам, жадный я
И таким образом я получу, что мой девайс есть, скажем диск с:. Это получается без проблем, но из этого девайса я не могу получить информацию FriendlyName и HardwareId, т.е. он говорит что он STORAGE\Volume... а мне нужно получить зависимость типа C: - ST980811AS D: - HL-DT-ST DVDRAM GSA-T10N F: - JetFlash TS2GJF130 USB Device Для CDRom и флешки я могу получить это выше указанными способами, а для жесткого диска нет. Т.к. дерево девайсов для жесткого диска устроено иначе.
посмотрел, ее похоже нету для w2k и возвращает она вот это: Код (Text): typedef struct _FILE_FS_VOLUME_INFORMATION { LARGE_INTEGER VolumeCreationTime; ULONG VolumeSerialNumber; ULONG VolumeLabelLength; BOOLEAN SupportsObjects; WCHAR VolumeLabel[1]; } FILE_FS_VOLUME_INFORMATION, *PFILE_FS_VOLUME_INFORMATION; я не вижу тут нужной мне инфы.. можно подробнее плиз.. .... мне кажется, что тут нужно каким-то хитрым образом ползать по дереву устройств, найти нужный PDO и спросить у него что нужно. Проблема в том, что непонятно каким образом перейти от PDO который STORAGE\Volume к тому PDO который знает все про физический девайс (т.е. у которого можно спросить IoGetDeviceProperty и он ответить что нужно). Наверное, можно как-то использовать инфу в реестре, но я ковырялся и тоже болд..
Вот например, есть такая вещь HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Disk\Enum и Код (Text): bool GetPhysicalDrive(const WCHAR* logicaldevice, DWORD& disknr) { DWORD cb; HANDLE fh= CreateFile(logicaldevice, GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_WRITE,NULL,OPEN_EXISTING,0,NULL); if (fh==NULL || fh==INVALID_HANDLE_VALUE) { return false; } STORAGE_DEVICE_NUMBER devnr; if (!DeviceIoControl(fh, IOCTL_STORAGE_GET_DEVICE_NUMBER, NULL, 0, &devnr, sizeof(STORAGE_DEVICE_NUMBER), &cb, NULL)) return false; if (devnr.DeviceType!=FILE_DEVICE_DISK) return false; disknr= devnr.DeviceNumber; return true; } соотв. я сязываю драйв леттер и строку в реестре. По этой строке из реестра, в том же реестре можно найти соотв. запись со всей инфой. только мне кажется, что это как-то через анус и я не уверен насчет DeviceNumber... .... и есче! почему тогда там нет сдрома, он уже не диск оказываца.. фсе пайду курить.....
попробуй это IRP_MN_QUERY_CAPABILITIES, IRP_MN_QUERY_ID может чем поможет я и сам толком не знаю разбиратся щас неполучается