Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
203
Добавлен:
20.02.2016
Размер:
95.23 Кб
Скачать

[9.3] Реализация драйверов-фильтров

Диспетчер в/в предоставляет возможность одному драйверу “подключить” один из своих объектов-устройств к объекту-устройству другого драйвера. Результатом будет перенаправление пакетов IRP, предназначавшихся некоторому объекту-устройство, объекту-устройство драйвера-фильтра. Драйвер-фильтр может просмотреть, модифицировать, завершить или передать полученный IRP первоначальному драйверу. Драйвера-фильтры могут быть подключены к любому драйверу в стеке драйверов.

[9.3.1] Подключение фильтра к устройству

Имеется пара различных способов подключения драйвера-фильтра к другому драйверу. Первый способ – вначале получить указатель на объект-устройство, к которому необходимо подключиться, с помощью функции IoGetDeviceObjectPointer() (см. п. [9.2.1] Объединение драйверов в стек и освобождение драйверов стека). Подключение драйвера-фильтра к найденному устройству производится с помощью вызова функции IoAttachDeviceToDeviceStack().

PDEVICE_OBJECT IoAttachDeviceToDeviceStack (

IN PDEVICE_OBJECT SourceDevice, IN PDEVICE_OBJECTTargetDevice),

SourceDevice: Указатель на Объект-устройство фильтра;

TargetDevice: Указатель на первоначальный Объект-устройств, к которому будем прикреплять фильтр.

Каждый объект-устройство имеет поле AttachedDevice, которое указывает на объект-устройство первого драйвера-фильтра, который был прикреплен к этому объекту-устройство. Если поле AttachedDevice объекта-устройство нулевое, нет никаких прикрепленных устройств. Если поле AttachedDevice не нулевое, оно указывает на объект-устройство драйвера-фильтра. IoAttachDeviceToDeviceStack() находит конец списка AttachedDevice для объекта-устройство, указанного параметром TargetDevice, и устанавливает в поле AttachedDevice этого конечного объекта-устройство указатель на объект-устройство драйвера-фильтра.

Возвращаемым значением функции IoAttachDeviceToDeviceStack() является указатель на объект-устройство, к которому был прикреплен объект-устройство драйвера фильтра. Драйвер Фильтра может использовать этот указатель, чтобы передавать запросы первоначальному устройству. Хотя этот указатель обычно указывает на то же устройство, что и SourceDevice, он может быть указателем на другой драйвер-фильтр, прикрепленный к устройству SourceDevice.

Другим способом прикрепления фильтра к устройству является вызов функции IoAttachDevice(). Эта функция просто объединяет функциональные возможности, обеспечиваемые функциями IoGetDeviceObjectPointer() и IoAttachDeviceToDeviceStack().

NTSTATUS IoAttachDevice (IN PDEVICE_OBJECT SourceDevice,

IN PUNICODE_STRING TargetDevice,

OUT PDEVICE_OBJECT *AttachedDevice);

SourceDevice: Указатель на Объект-устройство драйвера Фильтра.

TargetDevice: строка Unicode с именем устройства, к которому будет прикреплено устройство SourceDevice.

AttachedDevice: Указатель на объект-устройство, к которому был прикреплено устройство SourceDevice.

Эффект подсоединения фильтра заключается в том, что при запросе на открытие некоторого устройства (например, через CreateFile()) для этого устройства просматривается список присоединенных устройств. Если он пуст, как обычно, открывается запрошенное устройство. Если он не пуст, открывается последнее устройство в списке. После этого все запросы в/в направляются именно этому устройству.

Из сказанного следует, что для успешного подключения фильтра к некоторому устройству в стеке, подключение нужно делать до того момента, когда вышележащий драйвер вызовет функцию IoGetDeviceObjectPointer(), и, тем самым, пошлет запрос на открытие нижележащего устройства.

Соседние файлы в папке Лабы по драйверам