在后操作回调例程中让 I/O 操作失败

微筛选器驱动程序的操作 后回调例程 可能会使成功的 I/O 操作失败,但只是 I/O 操作失败并不能撤消操作的效果。 微筛选器驱动程序负责执行撤消操作所需的任何处理。

例如,通过执行以下步骤,微筛选器驱动程序的创建后回调例程可能会使成功的IRP_MJ_CREATE操作失败:

  1. 调用 FltCancelFileOpen 关闭创建操作创建或打开的文件。 请注意, FltCancelFileOpen 不会撤消对文件的任何修改。 例如, FltCancelFileOpen 不会删除新创建的文件,也不会将截断的文件还原到其以前的大小。

  2. 将回调数据结构的 IoStatus.Status 字段设置为操作的最终 NTSTATUS 值。 此值必须是有效的错误 NTSTATUS 值,例如 STATUS_ACCESS_DENIED。

  3. 将回调数据结构的 IoStatus.Information 字段设置为零。

  4. 返回FLT_POSTOP_FINISHED_PROCESSING。

将回调数据结构的 IoStatus.Status 字段设置为操作的最终 NTSTATUS 值时,微筛选器驱动程序必须指定有效的错误 NTSTATUS 值。 请注意,微筛选器驱动程序无法指定STATUS_FLT_DISALLOW_FAST_IO;只有筛选器管理器才能使用此 NTSTATUS 值。

FltCancelFileOpen 的调用方必须在 IRQL <= APC_LEVEL 运行。 但是,微筛选器驱动程序可以从创建后回调例程安全地调用此例程,因为对于IRP_MJ_CREATE操作,在发起创建操作的线程的上下文中,将在 IRQL = PASSIVE_LEVEL 调用操作后回调例程。