C# 驱动器号与设备路径

C# 驱动器号与设备路径,c#,c++,pinvoke,drive-letter,cd-rom,C#,C++,Pinvoke,Drive Letter,Cd Rom,我从上周开始就在搜索这个,几乎所有关于DriveLetter x DevicePath/Volume/Device ID/任何内容的链接对我来说都是紫色的 我正在开发一个应用程序,其中列出了一些存储设备以及使用SetupApi函数的HDI/WPD设备,这些GUID GUID_deviceinterface_USB_DEVICE“A5DCBF10-6530-11D2-901F-00C04FB951ED”,GUID_deviceinterface_VOLUME“53F5630D-B6BF-11D0-

我从上周开始就在搜索这个,几乎所有关于DriveLetter x DevicePath/Volume/Device ID/任何内容的链接对我来说都是紫色的

我正在开发一个应用程序,其中列出了一些存储设备以及使用SetupApi函数的HDI/WPD设备,这些GUID GUID_deviceinterface_USB_DEVICE“A5DCBF10-6530-11D2-901F-00C04FB951ED”,GUID_deviceinterface_VOLUME“53F5630D-B6BF-11D0-94F2-00A0C91EFB8B”

所以。。。我已经能够使用驱动器号映射设备。怎么用? 使用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驱动器,会抛出一个不正确的函数。

对于获取文件句柄,我同时使用驱动器号(如“\。\D:”)和设备路径。两者都失败了

我不知道我是否做错了什么,因为这是USB大容量存储和硬盘的工作方式


谢谢。

现在我使用DevicePath中的VolumeName,而不是DiskNumber和PartitionNumber。
我们从“\.\C:”和设备路径中得到一个卷名。

我做到了!我们开始吧。现在我使用DevicePath中的VolumeName,而不是DiskNumber和PartitionNumber。我们从“\\.\C:”和设备路径中获得一个VolumeName。伟大的祝你有个美好的一周!!!回答你自己的问题没关系。既然这是现在为你工作,你应该考虑写你如何把它作为一个答案,而不仅仅是一个评论。对不起,但我不能回答我自己的问题。因为我的名声太低了。这是我尝试的第一件事。“声誉低于100的用户…”不,它将在5小时内自动回复(我猜)。否则,我会尝试在这里。对不起,我以为这是删除新用户限制的一部分。