在总线驱动程序完成 IRP 后,I/O 管理器会在将 IRP 传递到堆栈中时调用由更高级别的驱动程序注册的 IoCompletion 例程。
每当设备进入 D0 状态时,其每个驱动程序都应设置一个 IoCompletion 例程,该例程执行将它返回到工作状态所需的大部分任务。 驱动程序应为任何转换到 D0 状态的情况设置 IoCompletion 例程,无论设备是从睡眠状态返回还是在系统启动时切换到 D0。 下图显示了此类 IoCompletion 例程应执行的任务。
这些任务包括:
根据需要恢复设备电源状态或重新初始化设备,并准备处理在设备非工作状态时由驱动程序排队的任何输入/输出。
调用 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)并释放删除锁。 请记住,当设备处于睡眠状态时,驱动程序无法访问其设备。