Самоучитель по программированию систем защиты


Обработка запросов IRP стеком драйверов - часть 3


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

Создание новых ассоциированных пакетов IRP для передачи драйверу нижележащего уровня. Немного другой подход к созданию нового пакета IRP для передачи драйверу нижележащего уровня состоит в создании ассоциированного пакета IRP с помощью функции loMsakeAssociatedlrp()

PIRP loMakeAssociatedlrp (IN PIRP Masterlrp, IN CCHAR StackSize);

Где: StackSize - Число Стеков размещения Ввода/вывода, требуемых в IRP;

Masterlrp - Указатель на IRP, с которым должен быть связан создаваемый пакет IRP.

loMakeAssociatedlrp() позволяет создавать IRP, которые "связаны» с некоторым "главным" IRP. Драйвер, который вызывает loMakeAssociatedlrp()» должен вручную инициализировать поле Irp.IrpCount главного IRP счетчиком ассоциированных с ним IRP, которые созданы до вызова loMakeAssociatedlrp. Ассоциированные IRP являются особым видом пакетовIRP, при завершении которых значение поля IrpCount в главном IRP уменьшается. Когда значение поля IrpCount в главномIRP становится равным нулю, Диспетчер ввода/вывода автоматически завершает главныйIRP.

Ассоциированные пакеты IRP могут создаваться только драйвером высшего уровня. Драйвер высшего уровня, использующий ассоциированные пакеты IRP, может вернуть управление диспетчеру ввода/вывода после вызова IoCallDriver() для каждого из ассоциированных IRP и вызова IoMarklrpPending() для главного IRP. Если такой драйвер устанавливает процедуру завершения для созданного им ассоциированного IRP (с помощью вызова loSetCompletion Routine(), описанного ниже), Диспетчер ввода/вывода не завершит автоматически главный IRP. В этом случае процедура завершения должна напрямую завершить главный IRP посредством вызова IoCompleteRequest().




Начало  Назад  Вперед



Книжный магазин