找到哪个驱动器对应于WinXP中的哪个USB大容量存储设备

问题描述 投票:9回答:2

我有几个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看到的相同的设备;但到目前为止我还没有找到它们之间的联系。

我发现了一些related questions,但那些似乎使用的方法“无论你先找到的是你的USB设备”,这在我的情况下不是很有用,因为会有几个类似的设备(相同的供应商,通常是相同的产品类型) ) 连接的。


编辑:

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

将会看到这是否可行。

windows usb device usb-mass-storage
2个回答
5
投票

这是一个非常重要的问题。据我所知,它没有正式的API。因此,您需要一个未记录的API:注册表。 HKEY_LOCAL_MACHINE\SYSTEM\MountedDevices包含驱动器号和卷ID的条目。如果查看实际数据,您会发现它标识了驱动器。将二进制数据视为Unicode字符串。它会指向你HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\ENUM\。但是,XP和Vista确切地区别了那些子键,以及如何引用它们。 (Vista更容易,所以先试试)。


3
投票

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

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

一旦找到一个与查询驱动器号码相同的磁盘设备,就知道你有一个胜利者。

© www.soinside.com 2019 - 2024. All rights reserved.