Программирование драйверов Windows


Новые рабочие процедуры в WDM драйверах - часть 3


Процедура завершения ввода/вывода регистрируется вызовом IoSetCompletionRoutine (см. таблицу 9.8).

Таблица 9.8. Прототип макроопределения IoSetCompletionRoutine

VOID IoSetCompletionRoutine IRQL &#60= DISPATCH_LEVEL
Параметры Выполняет регистрацию callback-функции завершения обработки IRP пакета
IN PIRP pIrp Указатель на отслеживаемый IRP пакет
IN PIO_COMPLETE_ROUTINE CompletionRoutine Функция, которая должна получить управление, когда обработка IRP будет завершена
IN PVOID pContext Параметр, который получит регистрируемая callback функция CompletionRoutine
IN BOOLEAN doCallOnSuccess

Вызывать CompletionRoutine в случае успешного завершения обработки данного IRP пакета

IN BOOLEAN doCallOnError Вызывать CompletionRoutine в случае завершения обработки данного IRP с ошибкой
IN BOOLEAN doCallOnCancel Вызывать CompletionRoutine в случае прерванной обработки данного IRP пакета
Возвращаемое значение void


Подключать собственные процедуры CompletionRoutine для детектирования окончания обработки IRP пакетов можно не только к пакетам с кодом IRP_MJ_PNP, но также ко всем остальным, отправляемым драйверам нижних слоев.

Вызов IoSetCompletionRoutine помещает регистрируемую функцию в ячейке стека IRP пакета, соответствующую нижнему драйверу. Поэтому, за исключением драйвера, находящегося в самом низу стека, каждый драйвер в иерархии может подключить свою собственную процедуру окончания ввода/вывода к обработке данного IRP пакета. Процедуры завершения выполняются в порядке помещения драйверных объектов в стек, то есть снизу к вершине стека.

Таблица 9.9. Прототип функции завершения ввода/вывода CompletionRoutine

NTSTATUS CompletionRoutine IRQL == см. текст ниже
Параметры Перехватывает пакет IRP после завершения работы нижнего драйверного слоя
IN PDEVICE_OBJECT pDevObj Объект устройства (в составе данного драйвера), которому был ранее адресован данный IRP пакет
IN PIRP pIrp Указатель на IRP пакет, обработка которого только что завершена
IN PVOID pContext Аргумент, указанный в IoSetCompleteRoutine
Возвращаемое значение

STATUS_MORE_PROCESSING_REQUIRED

STATUS_SUCCESS

<


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