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


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

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

  1. Вызов метода FltAllocateDeferredIoWorkItem для выделения рабочего элемента для операции ввода-вывода.

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

  3. Возврат FLT_POSTOP_MORE_PROCESSING_REQUIRED.

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

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

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

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

  • Целевой экземпляр операции ввода-вывода сносится. (Диспетчер фильтров указывает на эту ситуацию, устанавливая флаг FLTFL_POST_OPERATION_DRAINING во входном параметре Flags для подпрограммы обратного вызова после операции.)

Драйверы минифильтра должны быть готовы к этому сбою. Если драйвер минифильтра не может обрабатывать такие сбои, следует использовать метод, описанный в разделе Возврат FLT_PREOP_SYNCHRONIZE , вместо ожидания операции ввода-вывода.

После того как подпрограмма обратного вызова драйвера минифильтра после операции вернет FLT_POSTOP_MORE_PROCESSING_REQUIRED, диспетчер фильтров не будет выполнять дальнейшую обработку завершения операции ввода-вывода до тех пор, пока рабочая процедура драйвера минифильтра не вызовет FltCompletePendedPostOperation , чтобы вернуть управление операцией диспетчеру фильтров. Диспетчер фильтров не будет выполнять дальнейшую обработку в этой ситуации, даже если рабочая процедура устанавливает значение NTSTATUS сбоя в поле IoStatus.Status структуры данных обратного вызова для операции.

Рабочая подпрограмма, которая выводит из очереди и выполняет обработку завершения операции ввода-вывода, должна вызывать FltCompletePendedPostOperation , чтобы вернуть управление операцией диспетчеру фильтров.