我有几个USB驱动器连接到一个WinXP SP3电脑,我需要以编程方式告诉他们 – 我需要find哪个驱动器号对应哪个设备 (在这种情况下,一个设备〜一个卷)。 我可以使用mountvol
来获得他们的卷ID和驱动器号,看起来像这样:
C:\WINDOWS\> mountvol \\?\Volume{bdb681b2-1ddf-11dd-bf71-806d6172696f}\ C:\ \\?\Volume{6a8784f8-7406-11dd-a8c3-001e8c829b67}\ A:\
另外,使用devcon或设备pipe理器,我可以看到设备ID:
C:\WINDOWS\> devcon resources *STOR* STORAGE\REMOVABLEMEDIA\7&190C24E5&0&RM Name: Generic volume STORAGE\VOLUME\1&30A96598&0&SIGNATURED84ED84EOFFSET7E00LENGTH2543150400 Name: Generic volume USBSTOR\DISK&VEN_KINGSTON&PROD_DATATRAVELER2.0&REV_1.00\0803240752536&0 Name: Kingston DataTraveler2.0 USB Device
但是,我还没有find一种方法来链接设备ID和卷ID /字母,如“安全删除硬件”对话框(因此,我认为这是可能的):
通用量 – 答:sof/windows/safely_remove.png
正如您所看到的,这些是我在devcon中看到的和Mountvol所看到的相同的设备。 但到目前为止,我还没有find他们之间的联系。
我发现了一些相关的 问题 ,但似乎使用的方法是“无论你首先find的是你的USB设备”,这对我来说不是很有用,因为会有几个类似的设备(相同的供应商,通常是相同的产品types) 连接的。
编辑:
@MSalters的答案看起来很有希望:在XP上, HKEY_LOCAL_MACHINE\SYSTEM\MountedDevices
具有REG_BINARY
值\DosDevices\x:
其中x
是[AZ]); 注释是正确设备(UTF-16)的名称
\DosDevices\A:
=“ \??\STORAGE#RemovableMedia#7&190c24e5&0&RM#{53f5630d-b6bf-11d0-94f2-00a0c91efb8b}\"
,对应
STORAGE\REMOVABLEMEDIA\7&190C24E5&0&RM
在设备列表中看到)。
将看看如果这是要走的路。
这是一个不平凡的问题。 据我所知,没有官方API。 所以,你需要一个未公开的API:注册表。 HKEY_LOCAL_MACHINE\SYSTEM\MountedDevices
包含驱动器号和卷ID的条目。 如果你看看实际的数据,你会发现它识别的驱动器。 将二进制数据看作一个Unicode字符串。 它会指向您HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\ENUM\
。 但是,XP和Vista的确切区别在哪些子键,以及如何。 (Vista更容易,所以先尝试一下)。
有一个官方API来做到这一点。 看到这个例子: http : //www.codeproject.com/KB/system/RemoveDriveByLetter.aspx
原则是Windows上的每个存储卷都被分配一个全局编号。 首先,你问你的驱动器号码(打开“\ X:”并发送一个IOCTL_STORAGE_GET_DEVICE_NUMBER
请求)。 其次,你会遍历所有的磁盘设备,并询问每个磁盘设备的编号(通过打开它,通过不同的路径,所以你不能只是字符串比较)。
一旦找到与您查询驱动器时携带相同编号的磁盘设备,就知道您有赢家。