структура 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

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

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

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

Заметка

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

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

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

Заметка

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

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

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

Заметка

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

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

Флаг Значение
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 (include 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