Ожидание операции ввода-вывода в подпрограмме обратного вызова после операции
Подпрограмма обратного вызова драйвера минифильтра после операции может выполнять операцию ввода-вывода, выполнив следующие действия.
Вызов метода FltAllocateDeferredIoWorkItem для выделения рабочего элемента для операции ввода-вывода.
Вызов FltQueueDeferredIoWorkItem для отправки операции ввода-вывода в системную рабочую очередь.
Возврат 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 , чтобы вернуть управление операцией диспетчеру фильтров.