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