Функция FltDoCompletionProcessingWhenSafe (fltkernel.h)

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

Синтаксис

BOOLEAN FLTAPI FltDoCompletionProcessingWhenSafe(
  [in]           PFLT_CALLBACK_DATA           Data,
  [in]           PCFLT_RELATED_OBJECTS        FltObjects,
  [in, optional] PVOID                        CompletionContext,
  [in]           FLT_POST_OPERATION_FLAGS     Flags,
  [in]           PFLT_POST_OPERATION_CALLBACK SafePostCallback,
  [out]          PFLT_POSTOP_CALLBACK_STATUS  RetPostOperationStatus
);

Параметры

[in] Data

Указатель на структуру данных обратного вызова (FLT_CALLBACK_DATA) для операции ввода-вывода. Обычно это то же самое, что и указатель данных , переданный в подпрограмму обратного вызова после операции (PFLT_POST_OPERATION_CALLBACK), которая называется FltDoCompletionProcessingWhenSafe.

[in] FltObjects

Указатель на структуру связанных объектов (FLT_RELATED_OBJECTS) для операции ввода-вывода. Обычно это тот же указатель FltObjects , который был передан в подпрограмму обратного вызова после операции, которая называется FltDoCompletionProcessingWhenSafe.

[in, optional] CompletionContext

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

[in] Flags

Битовая маска флагов, которые указывают, как будет выполняться обработка завершения. Обычно это значение совпадает со значением Flags , которое было передано в подпрограмму обратного вызова после операции, которая называется FltDoCompletionProcessingWhenSafe. Дополнительные сведения см. в разделе "Примечания".

[in] SafePostCallback

Указатель на предоставленную вызывающей PFLT_POST_OPERATION_CALLBACK типизированной процедуре обратного вызова, которую операционная система вызывает, когда это безопасно.

[out] RetPostOperationStatus

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

Возвращаемое значение

FltDoCompletionProcessingWhenSafe возвращает значение TRUE , если обработка завершения операции ввода-вывода может быть выполнена немедленно или операция ввода-вывода была успешно отправлена в рабочий поток; в противном случае возвращается значение FALSE.

Комментарии

FltDoCompletionProcessingWhenSafe немедленно выполняет SafePostCallback , если вызывающий объект выполняется в IRQL <= APC_LEVEL. В противном случае, если можно безопасно отправить операцию в рабочий поток, обработка SafePostCallback откладывается до тех пор, пока она не может быть вызвана в контексте потока, где IRQL <= APC_LEVEL.

Если DISPATCH_LEVEL IRQL < :

  • FltDoCompletionProcessingWhenSafe немедленно вызывает подпрограмму обратного вызова SafePostCallback .
  • Параметр RetPostOperationStatus получает значение FLT_POSTOP_CALLBACK_STATUS, возвращаемое SafePostCallback.
  • FltDoCompletionProcessingWhenSafe возвращает значение TRUE.

Если IRQL >= DISPATCH_LEVEL:

  • FltDoCompletionProcessingWhenSafe пытается отправить операцию ввода-вывода в рабочий поток, а затем вызвать подпрограмму SafePostCallback из рабочего потока.
  • Если операция ввода-вывода может быть безопасно размещена:
    • Диспетчер фильтров задает для RetPostOperationStatus значение FLT_POSTOP_MORE_PROCESSING_REQUIRED.
    • FltDoCompletionProcessingWhenSafe возвращает значение TRUE.
  • Если операция ввода-вывода не может быть безопасно размещена:
    • Диспетчер фильтров задает для RetPostOperationStatus значение FLT_POSTOP_FINISHED_PROCESSING.
    • FltDoCompletionProcessingWhenSafe возвращает значение FALSE.

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

FltDoCompletionProcessingWhenSafe нельзя использовать для завершения операции ввода-вывода по страницам в рабочем потоке.

FltDoCompletionProcessingWhenSafe можно вызывать только из процедуры обратного вызова драйвера минифильтра после операции (PFLT_POST_OPERATION_CALLBACK). Обратите внимание, что fltDoCompletionProcessingWhenSafe никогда не следует вызывать, если параметр Flags обратного вызова после операции имеет FLTFL_POST_OPERATION_DRAINING бит.

Если мини-фильтр вызывает FltDoCompletionProcessingWhenSafe , а SafePostCallback вызывается в рабочем потоке, так как его небезопасно вызывать в контексте текущего потока, диспетчер фильтров возобновит обработку завершения до тех пор, пока минифильтр не вернет FLT_POSTOP_MORE_PROCESSING_REQUIRED из SafePostCallback.

Если мини-фильтр возвращает FLT_POSTOP_MORE_PROCESSING_REQUIRED из SafePostCallback, он должен вызвать FltCompletePendedPostOperation , чтобы возобновить обработку завершения.

Требования

Требование Значение
Минимальная версия клиента Доступно в пакете обновления 1 для Microsoft Windows 2000 с пакетом обновления 1 для операционных систем с пакетом обновления 4 (SP4), Windows XP с пакетом обновления 2 (SP2), Windows Server 2003 с пакетом обновления 1 (SP1) и более поздних версий. Недоступно в Операционных системах Windows 2000 с пакетом обновления 4 (SP4) и более ранних версий.
Целевая платформа Универсальное
Верхняя часть fltkernel.h (включая Fltkernel.h)
Библиотека Fltmgr.lib
IRQL Любой.

См. также раздел

FLT_CALLBACK_DATA

FLT_IS_IRP_OPERATION

FLT_RELATED_OBJECTS

FltCancelIo

FltCompletePendedPostOperation

PFLT_POST_OPERATION_CALLBACK