Моя задача - отслеживать добавление и удаление дисков из службы 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, в имя устройства. Мне нужно это, чтобы поддерживать мой собственный список существующих съемных дисков в системе.
Пожалуйста, дайте мне несколько советов по этой проблеме.