Найдите, какой накопитель соответствует какому USB-накопителю в WinXP

У меня есть несколько USB-накопителей, подключенных к компьютеру WinXP SP3, и мне нужно программно их различать - мне нужно найти, какая буква диска соответствует какому устройству (в данном случае одно устройство ~ один том). Я могу получить их идентификаторы тома и буквы диска, используя mountvolвыглядит примерно так:

C:\WINDOWS\> mountvol
\\?\Volume{bdb681b2-1ddf-11dd-bf71-806d6172696f}\
    C:\

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

Также, используя devcon или диспетчер устройств, я могу видеть идентификаторы устройств:

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

Однако я не нашел способа связать идентификатор устройства и идентификатор тома / букву, как в диалоговом окне "Безопасное извлечение устройства" (поэтому я предполагаю, что это возможно):

http://stuff.piskvor.org/safely_remove.png

Как вы можете видеть, это те же устройства, которые я вижу в devcon, и тот же том, что видит mountvol; но до сих пор я не нашел связи между ними.

Я нашел несколько связанных вопросов, но они, похоже, используют подход "все, что вы сначала найдете, это ваше USB-устройство", что не очень полезно в моем случае, так как будет несколько похожих устройств (одного поставщика, часто одного типа продукта).) связано.


Редактировать:

Ответ @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 видно выше в списке устройств).

Посмотрим, так ли это.

2 ответа

Решение

Это нетривиальный вопрос. Насколько я могу судить, официального API для него нет. Итак, вам нужен недокументированный API: реестр. HKEY_LOCAL_MACHINE\SYSTEM\MountedDevices содержит записи для букв дисков и томов. Если вы посмотрите на фактические данные, вы обнаружите, что они идентифицируют диск. Посмотрите на двоичные данные в виде строки 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 запрос). Во-вторых, вы просматриваете все дисковые устройства и спрашиваете у каждого его номер (открывая его по другому пути, чтобы вы не могли просто сравнить строки).

Когда вы найдете дисковое устройство с тем же номером, что и запросили ваш диск, вы знаете, что у вас есть победитель.

Другие вопросы по тегам