呼叫 IoCallDriver 与呼叫 PoCallDriver

从 Windows Vista 开始,驱动程序应调用 IoCallDriver 而不是 PoCallDriver,以便将电源 IRP 传递给下一个较低的驱动程序。 在 Windows Server 2003、Windows XP 和 Windows 2000 中,驱动程序必须调用 PoCallDriver,而不是 IoCallDriver,才能将电源 IRP 传递给下一个较低的驱动程序。 但请注意,使用相同代码在 Windows Vista 和早期 Windows 版本中运行的驱动程序必须调用 PoCallDriver,而不是 IoCallDriver

从 Windows Vista 开始, PoRequestPowerIrpIoCallDriver 可确保电源管理器在整个系统中正确同步电源 IRP。 在 Windows Server 2003、Windows XP 和 Windows 2000、 PoRequestPowerIrpPoCallDriverPoStartNextPowerIrp 中,确保电源管理器在整个系统中正确同步电源 IRP。

系统限制活动电源 IRP 的数量,如下所示:

  • (IRP_MN_SET_POWER系统电源 IRP 不超过一个, IRP_MN_QUERY_POWER) 在任何给定时间 (PDO) 的每个物理设备对象都可以处于活动状态。

  • 在任何给定时间,每个 PDO 都不能有一个以上的设备设置电源 IRP (IRP_MN_SET_POWER) 处于活动状态。

  • 在任何给定时间,系统中的任何位置都不能有一个需要大功率的设备电源 IRP 处于活动状态。

为了确保两个浪涌设备不会同时尝试开机,电源管理器会跟踪整个系统中活动的浪涌电源 IRP,并且一次只允许一个设备处于活动状态。 在活动浪涌 IRP 完成之前,无法启动其他浪涌 IRP。

由于对浪涌 IRP 的这些限制,当另一个设备的浪涌 IRP 完成时,设备电源 IRP 可能会阻止。 驱动程序编写器在调试时应注意此行为。