Преобразование пути GUID тома в путь устройства - PullRequest
2 голосов
/ 18 августа 2011

Моя задача - отслеживать добавление и удаление дисков из службы Windows. Я использую RegisterServiceCtrlHandlerEx и RegisterDeviceNotification для реализации этого. Моя подпрограмма обработчика управления службами успешно получает управляющий код SERVICE_CONTROL_DEVICEEVENT и обрабатывает события DBT_DEVICEARRIVAL и DBT_DEVICEREMOVECOMPLETE для классов GUID_DEVINTERFACE_VOLUME. Кстати, окна не отправляют события DBT_DEVICEQUERYREMOVE, DBT_DEVICEQUERYREMOVEFAILED, DBT_DEVICEREMOVEPENDING в мою программу, но теперь я хочу решить другую проблему.

Когда я получаю события DBT_DEVICEARRIVAL и DBT_DEVICEREMOVECOMPLETE, а dbch_devicetype равен DBT_DEVTYP_DEVICEINTERFACE, я могу прочитать имя устройства из поля dbcc_name структуры DEV_BROADCAST_DEVICEINTERFACE. Это выглядит так: \? \ STORAGE # RemovableMedia # 7 & 331a4e33 & 0 & RM # {53f5630d-b6bf-11d0-94f2-00a0c91efb8b}

Я могу преобразовать эту строку в путь guid тома, используя процедуру GetVolumeNameForVolumeMountPoint, только для события DBT_DEVICEARRIVAL. При событии DBT_DEVICEREMOVECOMPLETE GetVolumeNameForVolumeMountPoint возвращает ошибку 3 (система не может найти указанный путь).

С другой стороны, во время запуска службы я сканирую все тома в системе с помощью FindFirstVolume / FindNextVolume, которая возвращает мне список путей GUID томов всех томов.

Таким образом, если том существует, когда моя служба запускается, я могу получить путь к GUID тома. И если этот том будет удален во время работы моей службы, я получу имя устройства (например, \? \ STORAGE # RemovableMedia # 7 & 331a4e33 & 0 & RM # {53f5630d-b6bf-11d0-94f2-00a0c91efb8b}) от Событие DBT_DEVICEREMOVECOMPLETE.

Как я уже писал выше, я не могу использовать GetVolumeNameForVolumeMountPoint во время события DBT_DEVICEREMOVECOMPLETE для получения пути GUID тома. Поэтому я хотел бы найти способ преобразовать путь GUID тома, полученный из FindFirstVolume / FindNextVolume, в имя устройства. Мне нужно это, чтобы поддерживать мой собственный список существующих съемных дисков в системе.

Пожалуйста, дайте мне несколько советов по этой проблеме.

Ответы [ 2 ]

1 голос
/ 19 августа 2011

Таким образом, я не нашел способа получить пути к устройствам из путей GUID тома, возвращаемых FindFisrtVolume / FindNextVolume. Вместо этого я заменю FindFisrtVolume / FindNextVolume перечислением интерфейсов устройства с помощью SetupApi.

Вот шаги для этого:

  1. Вызовите SetupDiGetClassDevs (& GUID_DEVINTERFACE_VOLUME, NULL, NULL, DIGCF_INTERFACEDEVICE | DIGCF_PRESENT) для получения набора информации об устройстве.
  2. Перечисление устройств взаимодействует с SetupDiEnumDeviceInterfaces (devinfoset, NULL и GUID_DEVINTERFACE_VOLUME, idx и & devitf).
  3. Для каждого интерфейса устройства вызовите SetupDiGetDeviceInterfaceDetail, чтобы получить путь к устройству.

К сожалению, путь к устройству, полученный таким образом, отличается в случае от пути к устройству, окна которого проходят в событиях DBT_DEVICEARRIVAL и DBT_DEVICEREMOVECOMPLETE. Поэтому нам нужно нормализовать пути к устройствам при их сравнении.

1 голос
/ 19 августа 2011

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

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

Сначала вы вызываете SetupDiGetClassDevs с соответствующим GUID для вашего класса устройства, например, GUID_DEVINTERFACE_VOLUME, затем вызываете SetupDiEnumDeviceInfo несколько раз для итерации устройств.

Пример кода, показывающего, как это сделать:

  • Статья базы знаний , показывающая все это
  • Другое описание процесса можно найти здесь , посмотрите раздел Используйте следующие шаги для создания дескриптора файла для устройства USB.

Отдельные устройства могут быть запрошены для свойств (путь среди них), используя SetupDiGetDeviceRegistryProperty .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...