2017-01-11 8 views
1

Я разрабатываю драйвер фильтра под Windows. Драйвер является PnP-уведомлением для получения уведомлений устройства, а также создает управляющее устройство для связи с сопутствующей службой usermode через IOCTL.Как остановить драйвер фильтра Plug-and-Play по требованию?

Насколько я понимаю, время жизни водителя контролируется PnP-менеджером. Драйвер выгружается после обработки следующего уведомления устройства, учитывая, что к этому моменту никакие объекты устройства не принадлежат драйверу.

Что мне нужно сделать, так это остановить драйвер по требованию, а не при следующем приходе/выезде следующего устройства. Пока я не думаю, что так оно и должно работать, с другой стороны, я не вижу никакой логики, которая запрещает разгружать драйверы фильтров по требованию. Я исследовал отправку контроля STOP, и я не понимаю, как это можно обрабатывать в PnP-драйвере (работает только для устаревших драйверов).

Сейчас я собираюсь добавить специальный обработчик IOCTL, который закроет все объекты устройства. Но этого недостаточно, жизнь водителя управляется PnP-менеджером, поэтому мне нужно как-то «привлечь внимание» менеджера к моему драйверу. Любая помощь приветствуется!

Если вам интересно, мне нужно, чтобы драйвер был остановлен, поэтому для деинсталляции не требуется перезагрузка.

ответ

0

WDM Драйвер фильтра всегда прикрепляет собственное устройство к стеке устройства. после этого некоторое другое устройство может присоединяться к этому стеку - поэтому оно будет прикреплено к вашему устройству. после того, как этот драйвер уже не может быть выгружен вообще.

водитель может быть выгружен только в том случае, если ссылки на него отсутствуют. DRIVER_OBJECT Для этого вам необходимо отсоединиться от устройства и уничтожить все ваши DEVICE_OBJECTs. только один правильный способ для драйвера фильтра WDM это сделать - когда вы обрабатываете IRP_MN_REMOVE_DEVICE - читаете Removing a Device in a Filter Driver или в качестве альтернативы вы можете зарегистрировать FAST_IO_DISPATCH с FastIoDetachDevice в драйвере - в результате будет вызываться FastIoDetachDevice, когда будет называться IoDeleteDevice для DeviceObject, к которому вы прикреплены (это также в процессе IRP_MN_REMOVE_DEVICE). в этот момент вам нужно позвонить IoDetachDevice и IoDeleteDevice - только после этого ваш драйвер может быть выгружен, а PnP-менеджер автоматически сделает это, если не больше DeviceObjects или других ссылок на ваш драйвер.

поэтому только один вариант для разгрузки WDM-драйвера - полный уничтожить device stack - не все стеки могут быть остановлены во время выполнения. но некоторые могут - по вызову CM_Request_Device_Eject - подготавливает экземпляр локального устройства для безопасного удаления, если устройство является съемным. Если устройство может быть физически выбрано, это произойдет.