Задержка обработки запросов IRP и постановка запросов IRP в очередь
Задержка обработки запросов IRP и постановка запросов IRP в очередь
Когда немедленное завершение запроса ввода/вывода в диспетчерской функции невозможно, драйвер должен указать Диспетчеру ввода/вывода, что обработка запроса продолжается. Для этого возвращаемым значением диспетчерской функции должно быть значение STATUS_PENDING. Перед этим в самом пакете IRP в текущем стеке размещения ввода/вывода должен быть установлен флаг SL_PENDING_RETURNED, помечающий запрос как неоконченный. Для этого служит функция IoMarkIrpPending().
VOID IoMarkIrpPending(IN PIRP Irp);
Установка этого флага указывает, что IRP будет освобожден драйвером с помощью вызова loCompleteRequest() когда-то потом.
Для постановки пакета IRP в очередь диспетчерская функция должна:
NT предусматривает два способа организации очередей пакетов IRP: