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

微筛选器驱动程序的 预操作回调例程 可以通过将操作发布到系统工作队列并返回FLT_PREOP_PENDING来写入 I/O 操作。 返回此状态值表示微筛选器驱动程序将保留对 I/O 操作的控制,直到它调用 FltCompletePendedPreOperation 以继续处理 I/O 操作。

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

  1. 通过调用 FltQueueDeferredIoWorkItem 等例程,将 I/O 操作发布到系统工作队列。

  2. 返回FLT_PREOP_PENDING。

必须插入所有 (或大多数) 传入 I/O 操作的微筛选器驱动程序不应将 FltQueueDeferredIoWorkItem 等例程用于笔式操作,因为调用此例程可能会导致系统工作队列被淹没。 相反,此类微筛选器驱动程序应使用取消安全队列。 有关使用取消安全队列的详细信息,请参阅 FltCbdqInitialize

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

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

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

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

  • I/O 操作的目标实例正在被拆除。

如果微筛选器驱动程序的预操作回调例程返回FLT_PREOP_PENDING,则必须在 CompletionContext 输出参数中返回 NULL

微筛选器驱动程序只能针对基于 IRP 的 I/O 操作返回FLT_PREOP_PENDING。 若要确定操作是否是基于 IRP 的 I/O 操作,请使用 FLT_IS_IRP_OPERATION 宏。

取消排队和处理 I/O 操作的工作例程必须调用 FltCompletePendedPreOperation 以继续处理该操作。