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

注意

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

若要在不设置完成例程的情况下将 IRP 向下传递到较低级别的驱动程序,调度例程必须执行以下操作:

  • 调用 IoSkipCurrentIrpStackLocation 以删除当前 IRP 堆栈位置,以便 I/O 管理器在对 IRP 执行完成处理时不会在那里查找完成例程。
  • 调用 IoCallDriver 将 IRP 向下传递到下一个较低级别的驱动程序。

以下代码示例演示了此方法:

IoSkipCurrentIrpStackLocation ( Irp ); 
return IoCallDriver ( NextLowerDriverDeviceObject, Irp ); 

或者,等效地:

IoSkipCurrentIrpStackLocation ( Irp ); 
status = IoCallDriver ( NextLowerDriverDeviceObject, Irp ); 
/* log or debugprint the status value here */
return status; 

在这些示例中,调用 IoCallDriver 中的第一个参数是指向下一个较低级别筛选器驱动程序的设备对象的指针。 第二个参数是指向 IRP 的指针。

此方法的优点

调用 IoSkipCurrentIrpStackLocation 简单高效,应在驱动程序不注册完成例程的情况下将 IRP 传递到驱动程序堆栈的所有情况下使用。

此方法的缺点

调用 IoCallDriver 后,传递给 IoCallDriver 的 IRP 指针不再有效,并且无法安全地取消引用。 如果驱动程序需要在较低级别的驱动程序处理 IRP 后执行进一步处理或清理,则必须在将 IRP 发送到驱动程序堆栈之前设置完成例程。 有关编写和设置完成例程的详细信息,请参阅 使用完成例程

如果为 IRP 调用 IoSkipCurrentIrpStackLocation ,则无法为其设置完成例程。