调用 IoCallDriver 与调用 PoCallDriver

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

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

系统按如下方式限制活动电源 IRP 的数量:

  • 在任意给定时间, (IRP_MN_SET_POWER IRP_MN_QUERY_POWER) PDO (每个物理设备对象 ) 多个系统电源 IRP。

  • 在任何给定时间,每个 PDO (IRP_MN_SET_POWER) 设备集电源 IRP 设备。

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

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

由于对 inrush IRP 的这些限制,设备电源 IRP 可能会阻塞,同时另一台设备的 IRP 的内向 IRP 完成。 驱动程序编写器在调试时应注意此行为。