调用 PoStartNextPowerIrp

从 Windows Vista 开始,不需要调用 PoStartNextPowerIrp ,并且调用此例程不会执行电源管理操作。 但是,在 Windows Server 2003、Windows XP 和 Windows 2000 中,在驱动程序处理查询电源 IRP 或设置电源 IRP 后,驱动程序必须调用 PoStartNextPowerIrp 以通知电源管理器它已准备好接收另一个电源 IRP。 驱动程序必须在 IRP 堆栈位置指向当前驱动程序时调用 PoStartNextPowerIrp ,然后再调用 PoCallDriver

驱动程序必须为它收到的每个 IRP_MN_QUERY_POWERIRP_MN_SET_POWER 请求调用此例程一次。 处理IRP_MN_WAIT_WAKEIRP_MN_POWER_SEQUENCE请求时,驱动程序不需要调用 PoStartNextPowerIrp

当驱动程序调用 PoStartNextPowerIrp 时,当前 IRP 堆栈位置必须指向当前驱动程序。 一般情况下,此调用最好通过 IoCompletion 例程进行。 必须在 IoCompleteRequestIoSkipCurrentIrpStackLocationPoCallDriver 之前调用 PoStartNextPowerIrp。 按其他顺序调用例程可能会导致系统死锁。

即使驱动程序未能通过 IRP,它也必须调用 PoStartNextPowerIrp 来通知电源管理器它已准备好处理另一个电源 IRP。

以下部分阐明了每种驱动程序何时应调用此例程:

从筛选器驱动程序调用 PoStartNextPowerIrp

从设备电源策略所有者调用 PoStartNextPowerIrp

从总线驱动程序调用 PoStartNextPowerIrp