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作注册预作回调例程。 微型筛选器将此结构作为参数传递给 FltRegisterFilter 在其 DriverEntry 例程中。 微型筛选器可以为给定类型的 I/O作注册预作回调例程,而无需注册作后回调(PFLT_POST_OPERATION_CALLBACK)例程,反之亦然。

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

此泛型回调例程的 IRQL 取决于其特定的 IO 路径。 如果需要了解当前的 IRQL,可以快速且廉价地调用 KeGetCurrentIRQL。 有关 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 字段设置为 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时,FltMgr 在微筛选器驱动程序调用 FltCompletePendedPreOperation之前,不会进一步处理 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。 这样做可能会严重降低微型筛选器驱动程序和系统性能。

要求

要求 价值
最低支持的客户端 Microsoft适用于 SP4、Windows XP SP2、Windows Server 2003 SP1 及更高版本的 Windows作系统的 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