确保在安全的 IRQL 上执行完成处理
如 编写后操作回调例程中所述,可以在 IRQL = DISPATCH_LEVEL调用基于 IRP 的 I/O 操作的后操作回调 例程 ,除非微筛选器驱动程序的预操作回调例程通过返回FLT_PREOP_SYNCHRONIZE来同步操作,或者该操作是创建操作,这本质上是同步的。 (有关此返回值的详细信息,请参阅 返回 FLT_PREOP_SYNCHRONIZE.)
但是,对于尚未同步的基于 IRP 的 I/O 操作,微筛选器驱动程序可以使用两种方法来确保在 IRQL <= APC_LEVEL执行完成处理。
第一种方法是让操作后回调例程在 IRQL <= APC_LEVEL 执行完成处理之前,对 I/O 操作进行笔划。 在 Postoperation 回调例程中挂起 I/O 操作中介绍了此方法。
第二种方法是让微筛选器驱动程序的后操作回调例程调用 FltDoCompletionProcessingWhenSafe。 仅当当前 IRQL >= DISPATCH_LEVEL 时,FltDoCompletionProcessingWhenSafe 才会执行 I/O 操作。 否则,此例程会立即执行微筛选器驱动程序的 SafePostCallback 例程。 FltDoCompletionProcessingWhenSafe 中介绍了此方法。