我從上週開始搜索,幾乎所有關於DriveLetter x DevicePath/Volume/Device ID /的鏈接都是紫色的。驅動器號與DevicePath
我正在開發該列表中的一些sotorage設備和使用SETUPAPI功能與這些GUID GUID_DEVINTERFACE_USB_DEVICE 「A5DCBF10-6530-11D2-901F-00C04FB951ED」 也HDI/WPD設備的應用,GUID_DEVINTERFACE_VOLUME「53F5630D-B6BF-11D0-94F2- 00A0C91EFB8B」。
所以...我已經能夠映射設備與驅動器號。怎麼樣? 使用DeviceApi結果,使用DevicePath通過DeviceIOControl獲取DiskNumber和PartitionNumber。沒關係!其實並非全部。 其實到CDROM驅動器我無法得到它。
這是我的代碼。
int bytesReturned = 0;
IOCTL.DiskExtents de1 = new IOCTL.DiskExtents();
int numDiskExtents = 0;
IntPtr ptrDe1 = Marshal.AllocHGlobal(Marshal.SizeOf(de1));
bool result = IOCTL.DeviceIoControl(FileHandle, IOCTL.IOControlCodes.IOCTL_VOLUME_GET_VOLUME_DISK_EXTENTS, IntPtr.Zero, 0, ptrDe1, Marshal.SizeOf(de1), bytesReturned, null);
if ((!result)) {
Marshal.FreeHGlobal(ptrDe1);
//libera a memória alocada.
throw new System.ComponentModel.Win32Exception(); //is thrown here
} else {
de1 = Marshal.PtrToStructure(ptrDe1, typeof(IOCTL.DiskExtents));
Marshal.FreeHGlobal(ptrDe1);
return de1.first.DiskNumber;
}
對於所有的光盤驅動器我有,一個IncorrectFunction被拋出。
爲了得到FileHandle,我同時使用Drive Letter(如「\。\ D:」)和Device Path。兩者都失敗。
我不知道我是否做錯了什麼,因爲這項工作適用於USB Mass Storage和硬盤。
謝謝。
我做到了! 我們走吧。 現在我使用DevicePath中的VolumeName而不是DiskNumber和PartitionNumber。 我們從「\\。\ C:」和DevicePath中獲取一個VolumeName。 太棒了! 有一個星期! – lcssanches
回答你自己的問題是可以的。既然這現在對你有用,你應該考慮寫下你如何解決它作爲答案,而不僅僅是評論。 – Yuck
對不起,但我無法回答我自己的問題。因爲我的聲譽太低。是我嘗試的第一件事。 – lcssanches