设备电源 IRP 的 IoCompletion 例程

总线驱动程序完成 IRP 后,I/O 管理器在将 IRP 向下传递堆栈时调用由更高级别的驱动程序注册的 IoCompletion 例程。

每当设备进入 D0 状态时,其每个驱动程序都应设置一个 IoCompletion 例程,该例程执行将其返回到工作状态所需的大部分任务。 驱动程序应设置 IoCompletion 例程,以便任何转换到 D0 状态,无论设备是从睡眠状态返回还是在系统启动时进入 D0。 下图显示了 IoCompletion 例程应执行的任务。

说明设备启动 iocompletion 例程的示意图。

这些任务包括:

  • 根据需要还原设备电源状态或重新初始化设备,并准备在设备未处于工作状态时处理驱动程序排队的任何 I/O

  • 调用 PoSetPowerState 以通知电源管理器设备处于 D0 电源状态。

  • 如果驱动程序最初未发送当前电源 IRP,则调用 PoStartNextPowerIrp 以接收下一个电源 IRP。 (Windows Server 2003、Windows XP 和 Windows 2000 仅) 。

  • 释放为设备上下文分配的内存。

  • 调用 IoReleaseRemoveLock 以释放驱动程序在收到 IRP 时在其 DispatchPower 例程中获取的锁。

  • 返回STATUS_SUCCESS。

在总线驱动程序或更高版本的驱动程序必须与设备通信之前,它不会启动设备。

当设备进入睡眠状态时,驱动程序应设置一个 IoCompletion 例程,该例程调用 PoStartNextPowerIrp (Windows Server 2003、Windows XP 和 Windows 2000 仅) 并释放删除锁。 请记住,当设备处于睡眠状态时,驱动程序无法访问其设备。