Поделиться через


Ожидание операции ввода-вывода в подпрограмме обратного вызова перед операцией

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

Подпрограмма обратного вызова драйвера минифильтра перед операцией выполняет операцию ввода-вывода, выполнив следующие действия.

  1. Публикация операции ввода-вывода в системную рабочую очередь путем вызова подпрограммы, например FltQueueDeferredIoWorkItem.

  2. Возврат FLT_PREOP_PENDING.

Драйвер минифильтра, который должен выполнять все (или большинство) входящих операций ввода-вывода, не должен использовать подпрограммы, такие как FltQueueDeferredIoWorkItem , для выполняемых операций, так как вызов этой подпрограммы может привести к переполнению системных рабочих очередей. Вместо этого такой драйвер минифильтра должен использовать очередь с безопасной отменой. Дополнительные сведения об использовании очередей отмены безопасности см. в разделе FltCbdqInitialize.

Обратите внимание, что вызов FltQueueDeferredIoWorkItem завершится ошибкой , если выполняется одно из следующих условий:

  • Операция не является операцией ввода-вывода на основе IRP.

  • Операция является операцией ввода-вывода подкачки.

  • Поле TopLevelIrp текущего потока не равно NULL. (Дополнительные сведения о том, как найти значение этого поля, см. в разделе IoGetTopLevelIrp.)

  • Целевой экземпляр операции ввода-вывода сносится.

Если подпрограмма обратного вызова драйвера минифильтра перед работой возвращает FLT_PREOP_PENDING, она должна возвращать ЗНАЧЕНИЕ NULL в выходном параметре CompletionContext .

Драйвер минифильтра может возвращать FLT_PREOP_PENDING только для операций ввода-вывода на основе IRP. Чтобы определить, является ли операция операцией ввода-вывода на основе IRP, используйте макрос FLT_IS_IRP_OPERATION .

Рабочая подпрограмма, которая выводит из очереди и обрабатывает операцию ввода-вывода, должна вызвать FltCompletePendedPreOperation , чтобы возобновить обработку операции.