структура FLT_CALLBACK_DATA (fltkernel.h)

Структура FLT_CALLBACK_DATA представляет операцию ввода-вывода. Диспетчер фильтров и минифильтры используют эту структуру для запуска и обработки операций ввода-вывода.

Синтаксис

typedef struct _FLT_CALLBACK_DATA {
  FLT_CALLBACK_DATA_FLAGS     Flags;
  PETHREAD                    Thread;
  PFLT_IO_PARAMETER_BLOCK     Iopb;
  IO_STATUS_BLOCK             IoStatus;
  struct _FLT_TAG_DATA_BUFFER *TagData;
  union {
    struct {
      LIST_ENTRY QueueLinks;
      PVOID      QueueContext[2];
    };
    PVOID FilterContext[4];
  };
  KPROCESSOR_MODE             RequestorMode;
} FLT_CALLBACK_DATA, *PFLT_CALLBACK_DATA;

Члены

Flags

Битовая маска флагов, описывающих операцию ввода-вывода.

Минифильтры могут установить следующий флаг.

Flag Значение
FLTFL_CALLBACK_DATA_DIRTY Минифильтр устанавливает этот флаг (путем вызова FltSetCallbackDataDirty), чтобы указать, что он изменил содержимое структуры данных обратного вызова. (Дополнительные сведения см. в следующем разделе Примечаний.)

Примечание

Только диспетчер фильтров может установить следующие флаги.

Когда диспетчер фильтров инициализирует структуру данных обратного вызова, он устанавливает один из следующих флагов, чтобы указать тип операции ввода-вывода, которую представляет структура данных обратного вызова.

Flag Значение
FLTFL_CALLBACK_DATA_FAST_IO_OPERATION Структура данных обратного вызова представляет собой быструю операцию ввода-вывода.
FLTFL_CALLBACK_DATA_FS_FILTER_OPERATION Структура данных обратного вызова представляет операцию обратного вызова минифильтра файловой системы.
FLTFL_CALLBACK_DATA_IRP_OPERATION Структура данных обратного вызова представляет операцию на основе пакета запроса ввода-вывода (IRP).

Примечание

Только диспетчер фильтров может установить следующие флаги.

Когда диспетчер фильтров инициализирует структуру данных обратного вызова, он также может установить следующие флаги.

Flag Значение
FLTFL_CALLBACK_DATA_GENERATED_IO Структура данных обратного вызова представляет операцию ввода-вывода, созданную минифильтром. Этот флаг действителен только для операций на основе IRP.
FLTFL_CALLBACK_DATA_REISSUED_IO Структура данных обратного вызова представляет операцию ввода-вывода, которую перезаписывает минифильтр. (Чтобы повторно выполнить операцию ввода-вывода, минифильтр вызывает FltReissueSynchronousIo.) Этот флаг действителен только для операций на основе IRP.
FLTFL_CALLBACK_DATA_SYSTEM_BUFFER Буфер для операции ввода-вывода был выделен из непагрегированного пула. Этот флаг можно задать для любого типа операций ввода-вывода. Минифильтры никогда не должны устанавливать этот флаг.

Примечание

Только диспетчер фильтров может установить следующие флаги.

Когда диспетчер фильтров выполняет обработку завершения операции ввода-вывода, которую представляет структура данных обратного вызова, он устанавливает один или оба из следующих флагов.

Flag Значение
FLTFL_CALLBACK_DATA_DRAINING_IO Диспетчер фильтров устанавливает этот флаг, чтобы указать, что он в настоящее время очищает узел завершения для операции ввода-вывода. Этот флаг действителен только во время завершения ввода-вывода.
FLTFL_CALLBACK_DATA_POST_OPERATION Диспетчер фильтров задает этот флаг, чтобы указать, что он в настоящее время вызывает зарегистрированные подпрограммы обратного вызова после операции (PFLT_POST_OPERATION_CALLBACK). Этот флаг действителен только во время завершения ввода-вывода.

Thread

Указатель на поток, который инициировал операцию ввода-вывода. Это поле может иметь значение NULL.

Iopb

Указатель на структуру FLT_IO_PARAMETER_BLOCK , содержащую параметры для операции ввода-вывода.

IoStatus

Структура IO_STATUS_BLOCK , содержащая состояние и сведения для операции ввода-вывода. Минифильтр может изменять содержимое этой структуры только в процедуре обратного вызова перед операцией (PFLT_PRE_OPERATION_CALLBACK), из которой он будет возвращать FLT_PREOP_COMPLETE или в подпрограмме обратного вызова после операции (PFLT_POST_OPERATION_CALLBACK), из которой он будет возвращать FLT_POSTOP_FINISHED_PROCESSING. В противном случае содержимое этой структуры обычно задается диспетчером фильтров.

TagData

Указатель на структуру FLT_TAG_DATA_BUFFER , содержащую данные точки повторного анализа для операции ввода-вывода. Этот указатель действителен только в пути после создания. Таким образом, только подпрограмма обратного вызова после операции минифильтра может изменить значение этого элемента. Подпрограмма обратного вызова после создания минифильтра может изменить этот элемент, чтобы указать на другую структуру FLT_TAG_DATA_BUFFER . Однако если элемент изменится, чтобы он указывал на другую структуру, он должен сначала вызвать ExFreePool , чтобы освободить существующую структуру, чтобы предотвратить утечку памяти пула.

QueueLinks

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

QueueContext[2]

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

FilterContext[4]

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

RequestorMode

Указывает режим выполнения процесса, который инициировал операцию ввода-вывода, либо KernelMode , либо UserMode.

Комментарии

Минифильтр регистрирует процедуры обратного вызова до операции (PFLT_PRE_OPERATION_CALLBACK) и после операции (PFLT_POST_OPERATION_CALLBACK) для одного или нескольких типов операций ввода-вывода. Когда диспетчер фильтров вызывает одну из этих подпрограмм обратного вызова, он передает структуру данных обратного вызова (FLT_CALLBACK_DATA) в качестве первого параметра. Эта структура представляет операцию ввода-вывода.

Подпрограмма перед операцией или после операции обратного вызова минифильтра может изменять содержимое структуры данных обратного вызова, за исключением членов Thread и RequestorMode . Если это так, он должен вызвать Метод FltSetCallbackDataDirty, если только он не изменил содержимое элемента IoStatus . В противном случае измененные значения игнорируются.

Минифильтр может инициировать операцию ввода-вывода, вызвав подпрограмму поддержки , например FltReadFile , или метод FltAllocateCallbackData для выделения структуры данных обратного вызова; инициализация параметров ввода-вывода структуры и передача структуры в FltPerformSynchronousIo или FltPerformAsynchronousIo.

Инициированная минифильтром операция ввода-вывода отправляется только в экземпляры минифильтра, подключенные под вызывающим экземпляром, и в файловую систему. Минифильтры, подключенные над указанным экземпляром, не получают операцию ввода-вывода.

Минифильтры могут инициировать только операции ввода-вывода на основе IRP. Они не могут инициировать операции обратного вызова быстрого ввода-вывода или фильтра файловой системы (FSFilter).

Требования

Требование Значение
Заголовок fltkernel.h (включая Fltkernel.h)

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

FLT_IO_PARAMETER_BLOCK

FLT_IS_FASTIO_OPERATION

FLT_IS_FS_FILTER_OPERATION

FLT_IS_IRP_OPERATION

FLT_IS_REISSUED_IO

FLT_IS_SYSTEM_BUFFER

FLT_REGISTRATION

FLT_RELATED_OBJECTS

FLT_TAG_DATA_BUFFER

FltAllocateCallbackData

FltFreeCallbackData

FltPerformAsynchronousIo

FltPerformSynchronousIo

FltReadFile

FltReissueSynchronousIo

FltReuseCallbackData

FltSetCallbackDataDirty

IO_STACK_LOCATION

IO_STATUS_BLOCK

IRP

PFLT_POST_OPERATION_CALLBACK

PFLT_PRE_OPERATION_CALLBACK