在WinXP中如何找到哪个驱动器对应哪个USB存储设备

9
我有几个USB驱动器连接到WinXP SP3计算机,我需要在程序中区分它们 - 我需要找出哪个驱动器盘符对应哪个设备(在这种情况下,一个设备对应一个卷)。我可以使用mountvol获取它们的卷ID和驱动器盘符,看起来像这样:
C:\WINDOWS\> mountvol
\\?\Volume{bdb681b2-1ddf-11dd-bf71-806d6172696f}\
    C:\

\\?\Volume{6a8784f8-7406-11dd-a8c3-001e8c829b67}\
    A:\

此外,使用devcon或设备管理器,我可以看到设备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

然而,我还没有找到链接设备ID和卷ID/字母的方法,就像“安全地移除硬件”对话框所做的那样(因此我认为这是可能的):

Generic volume - A:
(来源:piskvor.org

正如您所看到的,这些是我在devcon中看到的相同设备以及mountvol所看到的相同卷;但到目前为止,我还没有发现它们之间的联系。

我找到了一些相关的问题,但这些问题似乎使用“无论您首先找到的是您的USB设备”的方法,这在我的情况下不是非常有用,因为将连接几个类似的设备(同一供应商,通常具有相同的产品类型)。

编辑:

@MSalters 的回答看起来很有前途:在XP上,HKEY_LOCAL_MACHINE\SYSTEM\MountedDevicesREG_BINARY\DosDevices\x: (其中 x 是 [A-Z]);注释是正确设备的名称(例如
\DosDevices\A: = "\??\STORAGE#RemovableMedia#7&190c24e5&0&RM#{53f5630d-b6bf-11d0-94f2-00a0c91efb8b}\",对应于设备列表中上面看到的
STORAGE\REMOVABLEMEDIA\7&190C24E5&0&RM)。

将看看这是否是正确的方法。


你有找到解决这个问题的方法吗?我也在尝试确定USB大容量存储设备的挂载卷。谢谢。 - Stephen Nutt
@Stephen Nutt:不是很需要,因为它太复杂了——相比整个任务而言,我花费了太多时间在这上面;使用未记录的API可能会变得非常混乱。(此外,整个任务的变化使我不再需要这个) - Piskvor left the building
@Stephen Nutt:尽管我已经放弃在Windows上的尝试,但我现在找到了一种在Linux中实现此目的的方法,如果您感兴趣的话:https://dev59.com/-FDTa4cB1Zd3GeqPNvvL - Piskvor left the building
2个回答

5
这是一个不容易解决的问题。据我所知,官方没有提供相关API。因此,您需要使用未公开的API:注册表。 HKEY_LOCAL_MACHINE\SYSTEM\MountedDevices 包含驱动器字母和卷标的条目。如果您查看实际数据,您会发现它可以识别驱动器。将二进制数据作为Unicode字符串查看,它将指向HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\ENUM\。但是,XP和Vista在引用哪些子键以及如何引用方面存在差异(Vista更容易,因此请先尝试Vista)。

2
这是不正确的。有官方API可以做到这一点。它使用IOCTL_STORAGE_GET_DEVICE_NUMBER完成。这是一个公平的示例:http://www.codeproject.com/KB/system/RemoveDriveByLetter.aspx - Ilya

3

有一个官方API可以做到这一点。请参阅此示例:http://www.codeproject.com/KB/system/RemoveDriveByLetter.aspx

原理是,Windows上的每个存储卷都被分配一个全局号码。首先,通过打开“\X:”并发送 IOCTL_STORAGE_GET_DEVICE_NUMBER请求来询问驱动器的编号。其次,遍历所有磁盘设备,并向每个设备询问其编号(通过不同路径打开它,因此您不能只进行字符串比较)。

一旦找到携带与您查询驱动器相同的编号的磁盘设备,您就知道您已经找到了正确的设备。


嗯,那个链接看起来很有趣。你能否在回答中编辑一个简短的摘要呢?谢谢。 - Piskvor left the building

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接