【发布时间】:2012-01-24 11:45:06
【问题描述】:
我从上周开始搜索这个,几乎所有关于 DriveLetter x DevicePath/Volume/Device ID/whatever 的链接对我来说都是紫色的。
我正在开发一个应用程序,该应用程序使用带有这些 guid 的 SetupApi 函数列出一些存储设备以及 HDI/WPD 设备 GUID_DEVINTERFACE_USB_DEVICE "A5DCBF10-6530-11D2-901F-00C04FB951ED", GUID_DEVINTERFACE_VOLUME "53F5630D-B6BF-11D0-94F2-00ABB0C9 ”。
所以...我已经能够使用驱动器号映射设备。如何? 使用 SetupApi 结果,使用 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;
}
对于我拥有的所有 CDROM 驱动器,都会抛出 IncorrectFunction。
为了获取 FileHandle,我同时使用了驱动器号(如“\.\D:”)和设备路径。两者都失败了。
我不知道我是否做错了什么,因为这适用于 USB 大容量存储和硬盘。
谢谢。
【问题讨论】:
-
我做到了!开始了。现在我使用 DevicePath 中的 VolumeName 而不是 DiskNumber 和 PartitionNumber。我们从 "\\.\C:" 和 DevicePath 中得到一个 VolumeName。伟大的!!!度过一个愉快的一周!!!
-
回答你自己的问题就可以了。由于这现在对您有用,您应该考虑写下您如何修复它作为答案,而不仅仅是评论。
-
抱歉,我无法回答我自己的问题。因为我的名声太低了。是我尝试的第一件事。
-
“声誉低于 100 的用户...”不,它会在 5 小时内自动回复(我的猜测)。否则,我会尝试在这里。
-
抱歉,我以为这是删除新用户限制的一部分。
标签: c# c++ pinvoke drive-letter cd-rom