使用 IRP 完成例程

注意

为了获得最佳可靠性和性能,请使用支持筛选器管理器的 文件系统微筛选器驱动程序 ,而不是旧的文件系统筛选器驱动程序。 若要将旧驱动程序移植到微筛选器驱动程序,请参阅 移植旧版筛选器驱动程序指南

文件系统筛选器驱动程序使用类似于设备驱动程序使用的完成例程。 完成例程对 IRP 执行完成处理。 将 IRP 向下传递到下一级别驱动程序的任何驱动程序例程都可以选择通过在调用 IoCallDriver 之前调用 IoSetCompletionRoutine 来注册 IRP 的完成例程。

每个 IRP 完成例程的定义如下:

NTSTATUS
(*PIO_COMPLETION_ROUTINE) (
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp,
    IN PVOID Context
    );

在任意线程上下文中,在 IRQL <= DISPATCH_LEVEL 处调用完成例程。

由于可以在 IRQL DISPATCH_LEVEL调用它们,因此完成例程无法调用必须在较低 IRQL(如 IoDeleteDevice)下调用的内核模式例程。 出于同一原因,必须在完成例程中使用的任何数据结构从非分页池中分配。

本部分讨论以下主题:

如何执行完成处理

检查 PendingReturned 标志

从完成例程返回状态

示例:简单Pass-Through调度和完成

对完成例程的约束