Вверх ↑
Разработчик
Ответов: 26163
Рейтинг: 2127
#1: 2008-07-02 22:00:59 ЛС | профиль | цитата
Да я припоминаю твои изыскания в этой области

Задал ты оригинальную задачу, просто так она не решается. Удаляется устройство не сложно, сложно получить хандл этого устройства по букве диска -- вот там такая @па, что я уже какой час над этим бьюсь

------------ Дoбавленo:


Для тех, кому интересно:

Формально для безопасного извлечения USB-накопителя достаточно сделать вызов CM_Query_And_Remove_SubTree() для родительского экземпляра устройства (Device Instance) нужного диска.
Однако проблема получения кода экземпляра устройства по букве диска достаточно нетривиальна.

Один из вариантов решения:
1) получить номер устройства в своём классе по имени устройства:
DeviceIoControl() c кодом операции IOCTL_STORAGE_GET_DEVICE_NUMBER для хэндла,
полученного с помощью CreateFile('\\.\X:', .... ) (где X - имя нужного диска)
Запомним найденный номер, например, в DeviceNumber.

2) Далее, путём перебора всех устройств в классе GUID_DEVINTERFACE_DISK (в случае USB-Flash), определяем номер устройства по имени:
DeviceIoControl() c кодом операции IOCTL_STORAGE_GET_DEVICE_NUMBER для хэндла, полученного с помощью CreateFile(Path, .... )
(где Path - SP_DEVICE_INTERFACE_DETAIL_DATA.DevicePath, которое возвращает SetupDiGetDeviceInterfaceDetail() )
Если полученный номер совпал с DeviceNumber (из п.1), то найденное устройство это то, которое нам нужно - запоминаем код экземпляра в DeviceInstance ( SP_DEVINFO_DATA.DevInst, которое возвращает SetupDiGetDeviceInterfaceDetail() )
Для перебора используем SetupDiGetClassDevs(), SetupDiEnumDeviceInterfaces().

Теперь, имея в наличии DeviceInstance, получаем код экземпляра родительского устройства с помощью CM_Get_Parent(DevInstParent, DeviceInstance) и выполняем CM_Query_And_Remove_SubTree() для DevInstParent.


------------ Дoбавленo:


Вроде ничего сложного, но получить вот это

Path - SP_DEVICE_INTERFACE_DETAIL_DATA.DevicePath

таааакой геморрой...
карма: 22

0