9

我有几个 USB 驱动器连接到 WinXP SP3 计算机,我需要以编程方式区分它们 -我需要找到哪个驱动器号对应于哪个设备(在这种情况下,一个设备〜一个卷)。我可以使用 获取他们的卷 ID 和驱动器mountvol号,如下所示:

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/字母,就像“安全删除硬件”对话框一样(因此我认为这是可能的):

通用卷 - A:
(来源:piskvor.org

如您所见,这些设备与我在 devcon 中看到的设备相同,并且与 mountvol 看到的卷相同;但到目前为止,我还没有找到它们之间的联系。

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


编辑:

@MSalters的回答看起来很有希望:在 XP 上,HKEY_LOCAL_MACHINE\SYSTEM\MountedDevicesREG_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上面在设备列表中看到的)。

会看看这是否是要走的路。

4

2 回答 2

5

这是一个不平凡的问题。据我所知,它没有官方的 API。因此,您需要一个未记录的 API:注册表。HKEY_LOCAL_MACHINE\SYSTEM\MountedDevices包含驱动器号和卷 ID 的条目。如果您查看实际数据,您会发现它可以识别驱动器。将二进制数据视为 Unicode 字符串。它将指向您HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\ENUM\。但是,XP 和 Vista 的不同之处在于其中引用了哪些子项以及如何引用。(Vista 更容易,所以先试试吧)。

于 2009-04-09T08:05:30.717 回答
3

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

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

一旦你找到一个与你查询驱动器的编号相同的磁盘设备,你就知道你赢了。

于 2011-08-21T13:05:32.157 回答