Здравствуйте. Возникла задача осуществить контроль сменных USB-носителей (флешек), и через некоторое время возникла проблема: а как собственно блокировать устройство если мы не хотим разрешить работу с ним пользователю? Я пришел к выводу, что решается эта проблема путем создания драйвера фильтра, однако при реализации возникли кое-какие проблемы/вопросы. Итак, вот мои действия: 1. По имени устройства делаю IoGetDeviceObjectPointer; 2. Нахожу указатель на PDO (полученный указатель на PDO верен, проверял в WinObjEx); 3. Создаю свой девайс, заполняю в нем массив MajorFunction; 4. Затем делаю IoAttachDeviceToDeviceStack, фильтр аттачится успешно (это видно в WinObjEx и я успешно получаю IRP'ы). Исходя из того, что IRP'ы предназначенные фильтруемому девайсу я получаю, я делаю вывод что все сделано правильно. Делаю при получении запроса IoSkipCurrentIrpStackLocation и return IoCallDriver(...), все работает норм (это в случае если работа с этим устройством разрешена), когда же я хочу заблокировать устройство, то мне надо не пустить IRP дальше по стеку фильтров, для этого я делаю IoCompleteRequest(...) и НЕ вызываю IoCallDriver, однако фильтруемое устройство все равно получает IRP'ы! В чем же моя ошибка и как мне следует делать чтобы IRP'ы не шли дальше по стеку, подскажите пожалуйста. Буду признателен любой помощи.
Получает IRP или общается с высокоуровневыми драйверами? Перехват IRP не гарантирует полного контроля за USB-устройствами. Начиная с Win XP высокоуровневые драйверы могут использовать для общения с драйверами шины и порта механизм интерфейсов. Как в этом случае обслуживаются драйверы-фильтры не знаю. Но если по стеку проходят IRP типа IRP_MN_QUERY_INTERFACE, то попробуй копнуть в эту сторону
В таком случае подскажите пожалуйста, каким образом возможно осуществить контроль и соответственно блокировку флешки. Также буду признателен линкам которые могут помочь мне в решении сей задачи.