在后操作回调例程中挂起 I/O 操作

微筛选器驱动程序的 后操作回调例程 可以通过执行以下步骤来写入 I/O 操作:

  1. 调用 FltAllocateDeferredIoWorkItem 为 I/O 操作分配工作项。

  2. 调用 FltQueueDeferredIoWorkItem 将 I/O 操作发布到系统工作队列。

  3. 返回FLT_POSTOP_MORE_PROCESSING_REQUIRED。

请注意,如果满足以下任一条件,则对 FltQueueDeferredIoWorkItem 的调用将失败:

  • 该操作不是基于 IRP 的 I/O 操作。

  • 该操作是分页 I/O 操作。

  • 当前线程的 TopLevelIrp 字段不为 NULL。 (有关如何查找此字段的值的详细信息,请参阅 IoGetTopLevelIrp.)

  • I/O 操作的目标实例正在被拆掉。 (筛选器管理器通过将 Flags 输入参数中的 FLTFL_POST_OPERATION_DRAINING 标志设置为操作后回调例程来指示这种情况。)

微筛选器驱动程序必须准备好处理此故障。 如果微筛选器驱动程序无法处理此类故障,应考虑使用 返回FLT_PREOP_SYNCHRONIZE 中所述的技术,而不是挂起 I/O 操作。

在微筛选器驱动程序的后操作回调例程返回FLT_POSTOP_MORE_PROCESSING_REQUIRED后,筛选器管理器将不会对 I/O 操作执行任何进一步的完成处理,直到微筛选器驱动程序的工作例程调用 FltCompletePendedPostOperation 将操作控制权返回给筛选器管理器。 在这种情况下,即使工作例程在操作的回调数据结构的 IoStatus.Status 字段中设置了失败 NTSTATUS 值,筛选器管理器也不会执行任何进一步处理。

为 I/O 操作取消排队并执行完成处理的工作例程必须调用 FltCompletePendedPostOperation ,以便将操作的控制权返回给筛选器管理器。