编写 IRP 调度例程

备注

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

文件系统筛选器驱动程序使用类似于设备驱动程序中使用的调度例程。 调度例程处理一个或多个 IRP 类型。 (IRP 的类型 由其主要函数代码决定。) 驱动程序的 DriverEntry 例程通过将它们存储在驱动程序对象的调度表中来 注册 调度例程入口点。 将 IRP 发送到驱动程序时,I/O 子系统会根据 IRP 的主要函数代码调用相应的调度例程。

每个 IRP 调度例程都定义如下:

NTSTATUS
(*PDRIVER_DISPATCH) (
    IN PDEVICE_OBJECT DeviceObject,
    IN PIRP Irp
    );

文件系统筛选器驱动程序调度例程最常在 IRQL PASSIVE_LEVEL(在发起 I/O 请求的线程的上下文中调用),这通常是用户模式应用程序线程。 但是,此规则存在一些例外情况。 例如,页面错误会导致在 IRQL APC_LEVEL调用读取和写入调度例程。 这些异常汇总在 Dispatch 例程 IRQL 和线程上下文中的表中。 遗憾的是,目前无法阻止筛选器链中的驱动程序在 IRQL > PASSIVE_LEVEL (调用 IoCallDriver,例如,无法释放旋转锁或快速互斥) 。 不过,强烈建议筛选调度例程始终在调用 IoCallDriver 时调用它们所在的同一 IRQL。

调度例程可以进行分页,前提是它们符合Kernel-Mode驱动程序体系结构设计指南的 “使驱动程序可分页 ”部分中所述的条件。

如果文件系统筛选器驱动程序具有控制设备对象 (CDO) ,则其调度例程必须能够检测和处理 IRP 的目标设备对象是 CDO 的情况,而不是卷设备对象 (VDO) 装载卷。 有关 CDO 的详细信息,请参阅 筛选器驱动程序的控制设备对象

本部分讨论以下主题:

完成 IRP

将 IRP 向下传递到Lower-Level驱动程序

从 Dispatch 例程返回状态

示例:在不设置完成例程的情况下向下传递 IRP

调度例程的约束

调度例程 IRQL 和线程上下文