PFLT_PRE_OPERATION_CALLBACK回调函数 (fltkernel.h)

微筛选器驱动程序的 PFLT_PRE_OPERATION_CALLBACK 例程执行 I/O 操作的预操作处理。

语法

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

指向回调数据的指针 (I/O 操作 FLT_CALLBACK_DATA) 结构。

[in] FltObjects

指向 FLT_RELATED_OBJECTS 结构的指针,该结构包含与当前 I/O 请求相关的对象的不透明指针。

[out] CompletionContext

如果此回调例程返回FLT_PREOP_SUCCESS_WITH_CALLBACK或FLT_PREOP_SYNCHRONIZE,则此参数是一个可选上下文指针,要传递给相应的操作后回调例程。 否则,它必须为 NULL。

返回值

此回调例程返回以下FLT_PREOP_CALLBACK_STATUS值之一。

返回代码 说明
FLT_PREOP_COMPLETE 微筛选器正在完成 I/O 操作。 有关详细信息,请参阅“备注”。
FLT_PREOP_DISALLOW_FASTIO 该操作是快速 I/O 操作,而微筛选器不允许将快速 I/O 路径用于此操作。 有关详细信息,请参阅“备注”。
FLT_PREOP_PENDING 微筛选器已插入 I/O 操作,并且该操作仍处于挂起状态。 有关详细信息,请参阅“备注”。
FLT_PREOP_SUCCESS_NO_CALLBACK 微筛选器正在将 I/O 操作返回到 FltMgr 以供进一步处理。 在这种情况下, FltMgr 不会在 I/O 完成期间调用微筛选器驱动程序的操作后回调(如果存在)。
FLT_PREOP_SUCCESS_WITH_CALLBACK 微筛选器正在将 I/O 操作返回到 FltMgr 以供进一步处理。 在这种情况下, FltMgr 在 I/O 完成期间调用微筛选器的操作后回调。
FLT_PREOP_SYNCHRONIZE 微筛选器正在将 I/O 操作返回到 FltMgr 以供进一步处理,但它没有完成该操作。 有关详细信息,请参阅“备注”。
FLT_PREOP_DISALLOW_FSFILTER_IO 微筛选器不允许快速 QueryOpen 操作,并强制操作沿着慢速路径运行。 这样做会导致 I/O 管理器通过对文件执行打开/查询/关闭来为请求提供服务。 微筛选器驱动程序应仅返回 QueryOpen 的此状态。

注解

有关其他信息 ,请参阅编写操作前回调例程

微筛选器的操作前回调例程处理一个或多个类型的 I/O 操作。 (此回调例程类似于 旧筛选器模型中的调度例程。)

微筛选器通过将回调例程的入口点存储在 FLT_REGISTRATION 结构的 OperationRegistration 数组中,为特定类型的 I/O 操作注册操作前回调例程。 微筛选器将此结构作为参数传递给其 DriverEntry 例程中的 FltRegisterFilter。 微筛选器可以为给定类型的 I/O 操作注册操作前回调例程,而无需注册操作后回调 (PFLT_POST_OPERATION_CALLBACK) 例程,反之亦然。

微筛选器驱动程序的操作前或操作后回调例程可以修改操作的回调数据结构的内容。 如果存在,则必须调用 FltSetCallbackDataDirty,除非它已更改回调数据结构的 IoStatus 字段的内容。

此泛型回调例程的 IRQL 取决于其特定的 IO 路径。 如果需要了解当前的 IRQL,可以快速且廉价地调用 KeGetCurrentIRQL 。 有关 IRQL 的其他信息 ,请参阅编写操作前回调例程

文件系统将文件末尾的写入和读取操作舍入为基础文件存储设备扇区大小的倍数。 处理预读取或预写入操作时,分配和交换缓冲区的筛选器需要将已分配缓冲区的大小舍入到关联设备的扇区大小的倍数。 否则,从基础文件系统传输的数据长度将超过分配的缓冲区长度。 有关交换缓冲区的详细信息,请参阅 SwapBuffers Minifilter 示例

从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 字段设置为 I/O 操作的最终 NTSTATUS 值。 无法STATUS_PENDING此 NTSTATUS 值。 对于清理或关闭操作,它必须是非STATUS_PENDING的成功 NTSTATUS 值,因为清理和关闭操作不会失败。

当此例程返回FLT_PREOP_COMPLETE时, FltMgr 不会将 I/O 操作发送到驱动程序堆栈中调用方下方的任何微筛选器驱动程序或文件系统。 在这种情况下, FltMgr 仅调用驱动程序堆栈中调用方上方的微筛选器驱动程序的操作后回调例程。

返回FLT_PREOP_DISALLOW_FASTIO

如果此例程返回FLT_PREOP_DISALLOW_FASTIO,则它不应设置回调数据结构的 IoStatus.Status 字段,因为 FltMgr 会自动将此字段设置为STATUS_FLT_DISALLOW_FAST_IO。

只能为快速 I/O 操作返回FLT_PREOP_DISALLOW_FASTIO。 若要确定给定的回调数据结构是否表示快速 I/O 操作,请使用 FLT_IS_FASTIO_OPERATION 宏。

当此例程返回FLT_PREOP_DISALLOW_FASTIO时, FltMgr 不会将快速 I/O 操作发送到驱动程序堆栈中调用方下方的任何微筛选器驱动程序或文件系统。 在这种情况下, FltMgr 仅调用驱动程序堆栈中调用方上方的微筛选器驱动程序的操作后回调例程。

返回FLT_PREOP_PENDING

只能为基于 IRP 的 I/O 操作返回FLT_PREOP_PENDING,因为只能插入基于 IRP 的 I/O 操作。 若要确定给定的回调数据结构是否表示基于 IRP 的 I/O 操作,请使用 FLT_IS_IRP_OPERATION 宏。

当此例程返回FLT_PREOP_PENDING时,在微筛选器驱动程序调用 FltCompletePendedPreOperation 之前,FltMgr 不会进一步处理 I/O 操作。

返回 FLT_PREOP_SYNCHRONIZE

如果微筛选器的操作前回调例程返回FLT_PREOP_SYNCHRONIZE,则微筛选器必须为该操作注册相应的操作后回调。 当此例程返回FLT_PREOP_SYNCHRONIZE时, FltMgr 在当前线程的上下文中调用微筛选器的操作后回调(IRQL <= APC_LEVEL)。

应仅针对基于 IRP 的 I/O 操作返回FLT_PREOP_SYNCHRONIZE。 如果返回的 I/O 操作不是基于 IRP 的操作, 则 FltMgr 会将此返回值视为FLT_PREOP_SUCCESS_WITH_CALLBACK。

微筛选器驱动程序不应返回创建操作FLT_PREOP_SYNCHRONIZE,因为这些操作已由 FltMgr 同步。

对于异步读取和写入操作,微筛选器不得返回FLT_PREOP_SYNCHRONIZE。 这样做可能会严重降低微筛选器驱动程序和系统性能。

要求

要求
最低受支持的客户端 适用于 SP4、Windows XP SP2、Windows Server 2003 SP1 和更高版本的 Windows 操作系统的 Microsoft Windows 2000 更新汇总 1。
目标平台 桌面
标头 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