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