Dispatch 例程和于 IRQL

大多数驱动程序的调度例程在 IRQL = PASSIVE_LEVEL的任意线程上下文中调用,但以下例外:

  • 在发起 I/O 请求的线程的上下文中调用任何最高级别驱动程序的调度例程,该线程通常为用户模式应用程序线程。

    换句话说,文件系统驱动程序和其他最高级别驱动程序的调度例程在 IRQL = PASSIVE_LEVEL 的非位线程上下文中调用。

  • 可以在 IRQL = APC_LEVEL 和任意线程上下文中调用最低级别设备驱动程序的 DispatchRead、 DispatchWriteDispatchDeviceControl 例程,以及分层在系统分页路径中位于这些驱动程序之上的中间驱动程序。

    DispatchRead 和/或 DispatchWrite 例程以及任何其他也处理此类最低级别设备或中间驱动程序中的读取和/或写入请求的例程必须随时驻留。 这些驱动程序例程既不能是可分页的,也不能是驱动程序的可分页映像部分的一部分;它们不得访问任何可分页内存。 此外,它们不应依赖于任何阻塞调用, (如 KeWaitForSingleObject ,具有非零的) 。

  • 可以在 IRQL = DISPATCH_LEVEL 调用休眠和/或分页路径中的驱动程序 的 DispatchPower 例程。 此类驱动程序的 DispatchPnP 例程必须准备好处理 PnP IRP_MN_DEVICE_USAGE_NOTIFICATION请求。

  • 可以在 IRQL = DISPATCH_LEVEL 调用在启动时需要 inrush 电源的驱动程序 的 DispatchPower DISPATCH_LEVEL。

有关其他信息,请参阅 管理硬件优先级