2

自上周以来,我一直在搜索这个,几乎所有关于 DriveLetter x DevicePath/Volume/Device ID/whatever 的链接对我来说都是紫色的。

我正在开发一个应用程序,列出一些存储设备和 HDI/WPD 设备,这些设备使用 SetupApi 函数和这些 guid GUID_DEVINTERFACE_USB_DEVICE "A5DCBF10-6530-11D2-901F-00C04FB951ED", GUID_DEVINTERFACE_VOLUME "53F5630D-B6BF-11D0-94F2-00A0C91EFB8"

所以......我已经能够用驱动器号映射设备。如何?使用 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 大容量存储和硬盘。

谢谢。

4

1 回答 1

1

现在我使用 DevicePath 中的 VolumeName 而不是 DiskNumber 和 PartitionNumber。我们从 "\.\C:" 和 DevicePath 中得到一个 VolumeName。

于 2012-01-25T10:30:17.043 回答