Dispatch 例程和于 IRQL

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

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

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

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

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

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

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

有关详细信息,请参阅 管理硬件优先级