Есть такая функция CM_Request_Device_Eject, осуществляющая подготовку USB, SATA и прочих внешних девайсов к безопасному извлечению. Что она в действительности делает внутри себя - какие выполняет операции? Интересует эмулировать ее работу - но сделать так чтобы она устройство принудительно отключалось даже если есть блокирующие процессы.
Функция отправляет запрос серверу на Inject device ... - не чего не даст, какая раздница какой код отправляет сообщения ... Из User mode нормально этого не сделать ... Filter дров ...
Один запрос и только? Какой именно запрос и к какому серверу? Мне не обязательно из User Mode. Хотелось бы понять как это в принципе сделать - в какую сторону копать.
difusion Короче filter driver на класс устройств ... Или конкретный тип устройство нужен(Mass storage)? тогда для него дров ...
difusion Что тут не понятного? пишешь lower usb mass storage filter. Фильтровать надо будет запрос IRP_MJ_INTERNAL_DEVICE_CONTROL. Dispatchers для AddDevice, DriverUnload.(из toaster filter). корректный обработчик для IRP_MJ_POWER и IRP_MJ_PNP.(из toaster filter). Все остальные запросы FilterPass(из toaster filter). Потом либо из дрова обращаешься к приложению, либо из приложения к дрову(это более правильный подход) приложения к дрову: IoRegisterDeviceInterface GUID_MY_FILTER из приложения RegisterDeviceNotification with GUID_MY_FILTER SetupDiGetClassDevsW with GUID_MY_FILTER после чего можно будет слать запрос к драверу на отключения или включения устройств .... П.С. Может возникнуть проблемы, при которых диск к винде приаттаченый , но он пустой и на него не чего нельзя записать, и система больше не посылает запросов, тогда enable\disable будет проходить успешно(из приложения), и девайс можно будет перегрузить ...
Большое спасибо за информацию! К сожалению, это не совсем то, что я хочу узнать. Прежде чем что-то делать хотелось бы понять какие именно действия делает функция cm_request_device_eject? Я конечно представляю, что именно она делает, но довольно смутно: скидывает кэши на устройство, опрашивает драйвера устройства (какие?) на предмет того, могут ли они отключаться ну и потом посылает (кому?) собственно комманду остановки (какую?). Хотелось бы знать что именно она делает, какие команды посылает и в какой последовательности. Ну и главная цель этого выяснения - понять что именно мешает тормознуть девайс (а его иногда нельзя тормознуть, даже если нет программ, имеющих открытые хэндлы к девайсу), и решить как с этим бороться наиболее простым и эффективным способом. P.S. Перебирать и закрывать хэндлы файлового типа открытые к девайсу я умею, увы это не всегда помогает.
А что прояснить ? Ведь очевидно что дров имеет право отказатся от выгрузки темболее по запросам от "CM_Request_Device_Eject". Да и сделать вминяемую защиту от mass storage только через дров, что есть не так уж и сложно. Там только вопрос будет с inf файлом и подписями . Куча чего может мешать тормазнуть девайс. Суть вопроса не раскрыта .
scsi = Small Computer System Interface? так это уже другой класс устройств (или конвертер scsi to usb ). А с устройством не чего осебного попытка остановить и удалить.
да нет, я неправильно выразился. меня интересует какая команда из SCSI transparent command set приходит в устройство Mass-storage, то есть ее номер? если такая команда вообще приходит. интересует, как устройство узнает о том, что его "выкидывают" из системы?