等待/唤醒 IRP 完成概述

当唤醒信号到达时,等待/唤醒 IRP 完成。 唤醒信号特定于设备,但通常是设备的正常服务事件。 例如,传入的环可能会导致睡眠调制解调器唤醒。

下图显示了完成等待/唤醒 IRP 的步骤。

完成等待/唤醒 irp 的步骤。

当信号发生时,控制会在总线检测到设备已唤醒的位置重新进入总线驱动程序。 总线驱动程序根据需要为事件提供服务,并调用 IoCompleteRequest 以完成其 PDO 的IRP_MN_WAIT_WAKE IRP。

然后,I/O 管理器调用由设备堆栈中更高级的驱动程序设置的 IoCompletion 例程。 在 IoCompletion 例程中,该驱动程序根据需要为唤醒信号提供服务,并调用 IoCompleteRequest 来完成 IRP。 I/O 管理器继续调用 IoCompletion 例程,这些例程会备份设备堆栈,直到所有驱动程序完成 IRP。

在其 IoCompletion 例程中,枚举多个子设备的任何驱动程序 (创建多个 PDO) 并从多个此类设备收到等待/唤醒请求的任何驱动程序都必须向自身发送等待/唤醒 IRP,以重新配置自身,以便在另一个子级上等待/唤醒。 有关详细信息,请参阅 了解通过设备树等待/唤醒 IRP 的路径

调用驱动程序在将 IRP 传递到堆栈时设置的 IoCompletion 例程后,I/O 管理器在请求等待/唤醒 IRP 时调用由电源策略所有者设置的回调例程。 在回调例程中,策略所有者应将其设备返回到工作状态,并完成其子级 PDO 的挂起等待/唤醒 IRP(如果有)。

完成子项的 IRP 会导致 I/O 管理器调用由子设备堆栈中的驱动程序设置的 IoCompletion 例程,等等。 最终,在开发节点上启动原始等待/唤醒 IRP 的策略所有者确定其设备断言唤醒信号,并且所有挂起的等待/唤醒 IRP 都将完成。