大多数驱动程序的调度例程在 IRQL = PASSIVE_LEVEL 的任意线程上下文中调用,但有以下例外:
在发起 I/O 请求的线程(通常是用户模式应用程序线程)的上下文中调用任何最高级别驱动程序的调度例程。
换句话说,在 IRQL = PASSIVE_LEVEL 的非比特线程上下文中调用文件系统驱动程序和其他最高级别的驱动程序的调度例程。
可以在 IRQL = APC_LEVEL 和任意线程上下文中调用最低级别设备驱动程序的 DispatchRead、DispatchWrite 和 DispatchDeviceControl 例程,以及在系统分页路径中分层于它们之上的中间驱动程序的例程。
DispatchRead 和/或 DispatchWrite 例程以及处理此类最低级别设备或中间驱动程序中的读取和/或写入请求的任何其他例程必须随时驻留。 这些驱动程序例程既不能可分页,也不能是驱动程序可分页图像部分的一部分;它们不得访问任何可分页内存。 此外,它们不应依赖于任何阻塞调用(例如,具有非零超时的 KeWaitForSingleObject )。
驱动程序在休眠和/或分页路径中的DispatchPower例程可以在 IRQL = DISPATCH_LEVEL 调用。 必须准备好此类驱动程序的 DispatchPnP 例程来处理 PnP IRP_MN_DEVICE_USAGE_NOTIFICATION 请求。
可以在 IRQL = DISPATCH_LEVEL 调用启动时需要浪涌电流的驱动程序的 DispatchPower 例程。
有关详细信息,请参阅 管理硬件优先级。