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

       

Задержка обработки запросов IRP и постановка запросов IRP в очередь



Задержка обработки запросов IRP и постановка запросов IRP в очередь

Когда немедленное завершение запроса ввода/вывода в диспетчерской функции невозможно, драйвер должен указать Диспетчеру ввода/вывода, что обработка запроса продолжается. Для этого возвращаемым значением диспетчерской функции должно быть значение STATUS_PENDING. Перед этим в самом пакете IRP в текущем стеке размещения ввода/вывода должен быть установлен флаг SL_PENDING_RETURNED, помечающий запрос как неоконченный. Для этого служит функция IoMarkIrpPending().

VOID IoMarkIrpPending(IN PIRP Irp);

Установка этого флага указывает, что IRP будет освобожден драйвером с помощью вызова loCompleteRequest() когда-то потом.

Для постановки пакета IRP в очередь диспетчерская функция должна:

  • 1. пометить IRP как неоконченный;
  • 2. установить функцию отмены IRP;
  • 3. использовать один из нижеприведенных способов для постановки IRP в очередь;
  • 4. завершиться со статусом STATUS_PENDING.
  • NT предусматривает два способа организации очередей пакетов IRP:

  • Использование диспетчера ввода/вывода для постановки запросов в управляемую им очередь (Системная Очередь).
  • Создание и управление очередью самостоятельно (Очереди, управляемые драйвером).


  • Содержание раздела