функция обратного вызова PFLT_PRE_OPERATION_CALLBACK (fltkernel.h)

Подпрограмма PFLT_PRE_OPERATION_CALLBACK драйвера минифильтра выполняет предварительную обработку операций ввода-вывода.

Синтаксис

PFLT_PRE_OPERATION_CALLBACK PfltPreOperationCallback;

FLT_PREOP_CALLBACK_STATUS PfltPreOperationCallback(
  [in, out] PFLT_CALLBACK_DATA Data,
  [in]      PCFLT_RELATED_OBJECTS FltObjects,
  [out]     PVOID *CompletionContext
)
{...}

Параметры

[in, out] Data

Указатель на структуру данных обратного вызова (FLT_CALLBACK_DATA) для операции ввода-вывода.

[in] FltObjects

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

[out] CompletionContext

Если эта подпрограмма обратного вызова возвращает FLT_PREOP_SUCCESS_WITH_CALLBACK или FLT_PREOP_SYNCHRONIZE, этот параметр является необязательным указателем контекста, передаваемым в соответствующую подпрограмму обратного вызова после операции. В противном случае он должен иметь значение NULL.

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

Эта подпрограмма обратного вызова возвращает одно из следующих FLT_PREOP_CALLBACK_STATUS значений.

Код возврата Описание
FLT_PREOP_COMPLETE Минифильтр завершает операцию ввода-вывода. Дополнительные сведения см. в разделе "Примечания".
FLT_PREOP_DISALLOW_FASTIO Операция является быстрой операцией ввода-вывода, а минифильтр не позволяет использовать быстрый путь ввода-вывода для этой операции. Дополнительные сведения см. в разделе "Примечания".
FLT_PREOP_PENDING Минифильтр завершил операцию ввода-вывода, и операция по-прежнему находится в состоянии ожидания. Дополнительные сведения см. в разделе "Примечания".
FLT_PREOP_SUCCESS_NO_CALLBACK Минифильтр возвращает операцию ввода-вывода в FltMgr для дальнейшей обработки. В этом случае FltMgr не будет вызывать обратный вызов драйвера минифильтра после операции, если он существует, во время завершения ввода-вывода.
FLT_PREOP_SUCCESS_WITH_CALLBACK Минифильтр возвращает операцию ввода-вывода в FltMgr для дальнейшей обработки. В этом случае FltMgr вызывает обратный вызов минифильтра после операции во время завершения ввода-вывода.
FLT_PREOP_SYNCHRONIZE Минифильтр возвращает операцию ввода-вывода в FltMgr для дальнейшей обработки, но не завершает операцию. Дополнительные сведения см. в разделе "Примечания".
FLT_PREOP_DISALLOW_FSFILTER_IO Минифильтр запрещает быструю операцию QueryOpen и вынуждает операцию отключать медленный путь. Это приводит к тому, что диспетчер ввода-вывода обслуживает запрос, выполняя открытие, запрос или закрытие файла. Драйверы минифильтра должны возвращать это состояние только для Параметра QueryOpen.

Комментарии

Дополнительные сведения см. в статье Написание процедур обратного вызова перед операцией .

Подпрограмма обратного вызова перед операцией минифильтра обрабатывает один или несколько типов операций ввода-вывода. (Эта процедура обратного вызова похожа на подпрограмму диспетчеризации в устаревшей модели фильтра.)

Минифильтр регистрирует подпрограмму обратного вызова перед операцией для определенного типа операций ввода-вывода, сохраняя точку входа подпрограммы обратного вызова в массиве OperationRegistrationструктуры FLT_REGISTRATION . Минифильтр передает эту структуру в качестве параметра в FltRegisterFilter в своей подпрограмме DriverEntry . Минифильтр может зарегистрировать подпрограмму обратного вызова перед операцией для определенного типа операции ввода-вывода без регистрации процедуры обратного вызова после операции (PFLT_POST_OPERATION_CALLBACK) и наоборот.

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

IrQL для этой универсальной процедуры обратного вызова зависит от конкретных путей ввода-вывода. Вы можете быстро и дешево вызвать KeGetCurrentIRQL , если вам нужно знать текущий IRQL. Дополнительные сведения о IRQL см. в статье Написание процедур обратного вызова перед операцией .

Файловые системы округляет операции записи и чтения в конце файла до размера сектора базового устройства хранения файлов. При обработке операций предварительного чтения или предварительной записи фильтры, которые выделяют буферы и подкачки, должны округлить размер выделенного буфера до размера сектора связанного устройства. В противном случае длина данных, передаваемых из базовой файловой системы, превысит выделенную длину буфера. Дополнительные сведения о переключении буферов см. в разделе Пример минифильтра SwapBuffers.

Начиная с Windows 8, в Приложении CompletionContext используется заметка Flt_CompletionContext_Outptr, которая определяет допустимые значения контекста на основе результата операции. Ниже приведен пример использования обратного вызова с заметкой для CompletionContext.

FLT_PREOP_CALLBACK_STATUS
SwapPreReadBuffers(
    _Inout_ PFLT_CALLBACK_DATA Data,
    _In_ PCFLT_RELATED_OBJECTS FltObjects,
    _Flt_CompletionContext_Outptr_ PVOID *CompletionContext
    );


Возврат FLT_PREOP_COMPLETE

Если эта подпрограмма возвращает FLT_PREOP_COMPLETE, она должна задать в поле IoStatus.Status структуры данных обратного вызова окончательное значение NTSTATUS для операции ввода-вывода. Это значение NTSTATUS не может быть STATUS_PENDING. Для операции очистки или закрытия она должна иметь значение NTSTATUS, отличное от STATUS_PENDING так как операции очистки и закрытия не могут завершаться сбоем.

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

Возврат FLT_PREOP_DISALLOW_FASTIO

Если эта подпрограмма возвращает FLT_PREOP_DISALLOW_FASTIO, она не должна задавать поле IoStatus.Status структуры данных обратного вызова, так как FltMgr автоматически устанавливает для этого поля значение STATUS_FLT_DISALLOW_FAST_IO.

FLT_PREOP_DISALLOW_FASTIO можно вернуть только для быстрой операции ввода-вывода. Чтобы определить, представляет ли данная структура данных обратного вызова быструю операцию ввода-вывода, используйте макрос FLT_IS_FASTIO_OPERATION .

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

Возврат FLT_PREOP_PENDING

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

Когда эта подпрограмма возвращает FLT_PREOP_PENDING, FltMgr не будет обрабатывать операцию ввода-вывода далее, пока драйвер минифильтра не вызовет FltCompletePendedPreOperation.

Возврат FLT_PREOP_SYNCHRONIZE

Если подпрограмма обратного вызова перед операцией минифильтра возвращает FLT_PREOP_SYNCHRONIZE, минифильтр должен зарегистрировать соответствующий обратный вызов после операции. Когда эта подпрограмма возвращает FLT_PREOP_SYNCHRONIZE, FltMgr вызывает обратный вызов минифильтра после операции в контексте текущего потока в IRQL <= APC_LEVEL.

FLT_PREOP_SYNCHRONIZE должны возвращаться только для операций ввода-вывода на основе IRP. Если он возвращается для операции ввода-вывода, которая не является операцией на основе IRP, FltMgr обрабатывает это возвращаемое значение так, как если бы оно было FLT_PREOP_SUCCESS_WITH_CALLBACK.

Драйверы минифильтров не должны возвращать FLT_PREOP_SYNCHRONIZE для операций создания, так как эти операции уже синхронизированы FltMgr.

Минифильтры никогда не должны возвращать FLT_PREOP_SYNCHRONIZE для асинхронных операций чтения и записи. Это может серьезно снизить производительность драйвера минифильтра и производительности системы.

Требования

Требование Значение
Минимальная версия клиента Накопительный пакет обновления 1 для Microsoft Windows 2000 с пакетом обновления 1 (SP4), Windows XP с пакетом обновления 2 (SP2), Windows Server 2003 с пакетом обновления 1 (SP1) и более поздних версий операционных систем Windows.
Целевая платформа Персональный компьютер
Верхняя часть fltkernel.h (включая FltKernel.h)
IRQL См. раздел "Примечания"

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

FLT_CALLBACK_DATA

FLT_IO_PARAMETER_BLOCK

FLT_IS_FASTIO_OPERATION

FLT_IS_IRP_OPERATION

FLT_IS_REISSUED_IO

FLT_IS_SYSTEM_BUFFER

FLT_REGISTRATION

FLT_RELATED_OBJECTS

FltCompletePendedPostOperation

FltCompletePendedPreOperation

FltQueueDeferredIoWorkItem

FltRegisterFilter

FltSetCallbackDataDirty

PFLT_POST_OPERATION_CALLBACK

Flt_CompletionContext_Outptr

KeGetCurrentIRQL