使用电源管理器例程进行空闲检测
电源管理器通过 PoRegisterDeviceForIdleDetection 和 PoSetDeviceBusy 例程为空闲检测提供支持。
若要为其设备启用空闲检测,设备电源策略所有者调用 PoRegisterDeviceForIdleDetection 并指定:
系统优化性能时要应用的空闲超时值。
系统针对保护进行优化时要应用的空闲超时值。
设备空闲时应转换到的设备电源状态。
PoRegisterDeviceForIdleDetection 返回指向空闲计数器的指针,驱动程序稍后使用该指针来禁用空闲检测。 PoRegisterDeviceForIdleDetection 的调用方必须在 IRQL < DISPATCH_LEVEL运行。
驱动程序可以在设备启动并准备好处理设备电源 IRP 后随时注册其设备进行空闲检测。 例如,驱动程序可能会在其 IoCompletion 例程中为 PnP 启动设备 IRP 启用空闲检测。
任何给定设备的超时值应与设备的通电延迟成正比,并基于观察到的设备行为。 对于某些类型的设备,驱动程序可以将保护和性能超时值指定为 -1,以使用设备类的标准电源策略超时值。 有关详细信息,请参阅特定于设备的文档。
使用设备时,驱动程序必须调用 PoSetDeviceBusy,传递 由 PoRegisterDeviceForIdleDetection 返回的指针。 PoSetDeviceBusy 重置空闲计数器,从而重启设备的空闲倒计时。 驱动程序应在每个 I/O 操作上调用 PoSetDeviceBusy 。
为了确定设备是否处于空闲状态,电源管理器会将空闲计数器的值与当前系统电源策略的驱动程序指定的空闲超时值进行比较, (保护或性能) 。 有关与系统电源策略相关的函数,请参阅Microsoft Windows SDK。
当设备满足超时值时,电源管理器会发送设备设置电源 IRP,指定驱动程序在调用 PoRegisterDeviceForIdleDetection 时传递的设备电源状态。 电源管理器不会在发送设置电源 IRP 之前发送查询 IRP。 堆栈中的驱动程序处理设置功率 IRP,就像处理任何其他驱动程序一样;他们必须及时完成它,并且不能失败。 (请参阅 处理设备Power-Down IRP.)
当驱动程序不再需要空闲检测或未准备好处理设备断电 IRP 时,它应再次调用 PoRegisterDeviceForIdleDetection ,同时为两个超时值传递零。 将超时设置为零会禁用对保护 (电池) 和性能 (交流) 电源策略的空闲检测。 驱动程序可以快速重新启动空闲检测;它只需使用非零超时值调用 PoRegisterDeviceForIdleDetection 。 驱动程序注册设备后,即使设备已关闭并重新唤醒,也可以通过更改超时值来启用和禁用空闲检测。