较高级驱动程序中的 StartIo 例程
任何更高级别的驱动程序都可以有 StartIo 例程。 但是,此类驱动程序不太可能与现有的较低级别驱动程序互操作,并且可能表现出性能不佳的特征。
更高级别驱动程序中的 StartIo 例程具有以下效果:
传入的 IRP 可以通过从驱动程序的 DispatchXxx 例程调用 IoStartPacket () 和 IoStartNextPacket 从其 IoCompletion 例程 () 调用 IoStartPacket 排队,从而导致通过 StartIo 例程一次处理一个 IRP。
在 I/O 需求繁重期间,驱动程序的 I/O 吞吐量可能会明显变慢,因为其 StartIo 例程可能会成为瓶颈。
驱动程序的 StartIo 例程调用 IoCallDriver ,每个 IRP 的 IRQL = DISPATCH_LEVEL,从而导致所有较低级别驱动程序的调度例程也以 IRQL = DISPATCH_LEVEL运行。 这会限制低级驱动程序在其调度例程中调用的支持例程集。 由于大多数驱动程序编写者假定其驱动程序的调度例程在 IRQL < DISPATCH_LEVEL运行,因此较高级别的驱动程序不太可能与许多现有的低级别驱动程序互操作。
StartIo 例程会降低整体系统吞吐量,因为它及其链中所有较低级别驱动程序的调度例程在 IRQL = DISPATCH_LEVEL运行。
有关运行标准驱动程序例程的 IRQL 的详细信息,请参阅 管理硬件优先级。
系统提供的更高级别的驱动程序都没有 StartIo 例程,因为它可能会减慢驱动程序本身、其上方和下方的所有驱动程序以及整个系统的 IRP 处理速度。
大多数较高级别的驱动程序只需从其调度例程将 IRP 发送到较低级别的驱动程序,并在其 IoCompletion 例程中执行任何必要的清理处理。
但是,更高级别的驱动程序可以为请求特定类型操作的 IRP 设置内部队列,或者设置内部队列来保留一组异类基础设备(如 SCSI 端口驱动程序)的 IRP。 有关详细信息,请参阅 排队和取消排队 IRP。