编写 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调用读取和写入调度例程。 这些异常汇总在 调度例程 IRQL 和线程上下文中的表中。 遗憾的是,目前无法阻止筛选器链中的驱动程序在 IRQL > PASSIVE_LEVEL (调用 IoCallDriver,例如,无法释放旋转锁或快速互斥) 。 不过,强烈建议筛选器调度例程始终在调用它们的同一 IRQL 上调用 IoCallDriver

如果调度例程符合Kernel-Mode驱动程序体系结构设计指南的 “使驱动程序可分页 ”部分中所述的条件,则可以使调度例程可分页。

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

本部分讨论以下主题:

完成 IRP

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

从调度例程返回状态

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

调度例程的约束

调度例程 IRQL 和线程上下文