Программное безопасное извлечение USB (06.10.2013). Печать
2013 - Октябрь
06.10.2013 12:25
Save & Share

Написал модуль на VB6, используя функции API: безопасное извлечение флешки (с физическим отключением питания, естественно). Публикую код по той причине, что если пытаться впервые решить такую задачу - человек будет терять время. Сначала будет изучать функции API CreateFile и DeviceIoControl с их особенностями, затем его занесет в дебри функции Cm_Request_Device_Eject (а там параметров и зависимостей...). И все это не только не даст результатов положительных, но и породит ложноположительные (когда флешка исчезает, а питание с нее не снимается).

 

 

Модуль USB.bas я разместил в полезных исходниках. Прекрасно работает в Windows XP x64 и Windows XP. В Windows 7 x64 код не работает из-за того, что функция CM_Get_DevNode_Status возвращает ошибку 5 (в файле cfgmgr32.h значится как "CR_INVALID_DEVNODE"; при тех же входных параметрах, с которыми в XP все успешно работает).

(добавлено 23.04.2021) Чтобы заработало в ОС Windows 7, нужно в строке "If Left$(strBuffer, 4) = "\??\"" заменить "\??\" на "_??_". Соответственно, объединив оба значения для старых и новых ОС через OR - получится универсальное решение. В исходниках поправил.

Обновлено ( 23.04.2021 18:11 )