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

StackOverflow https://stackoverflow.com/questions/733206

Вопрос

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

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

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

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

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

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

Generic volume - A:
(источник: piskvor.org)

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

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


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

@MSalters' ответ выглядит многообещающе:На ХР, HKEY_LOCAL_MACHINE\SYSTEM\MountedDevices имеет REG_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 см. выше в списке устройств).

Посмотрим, подойдет ли это.

Это было полезно?

Решение

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top