管理设备电源策略

正如电源管理器维护和管理系统的电源策略一样,每个设备的设备堆栈中的一个驱动程序会维护和管理设备的电源策略。 此驱动程序是 设备的设备电源策略所有者

设备电源策略所有者是具有最多设备使用情况和电源状态信息的驱动程序。 它不需要在物理上能够设置设备寄存器来打开和关闭设备电源,但它必须能够确定设备何时处于使用状态、何时处于空闲状态以及何时应更改电源状态。

通常,设备的函数驱动程序是其电源策略所有者,尽管对于某些设备,其他驱动程序或系统组件可能承担此角色。 有关电源管理中涉及的驱动程序类型的详细信息,请参阅 WDM 驱动程序的类型

某些驱动程序充当一个设备的函数驱动程序 (创建 FDO) ,而总线驱动程序 (为枚举的子设备创建 PDO) 。 在其电源和 PnP IRP 的调度例程中,此类驱动程序必须区分其处理发送到 FDO 的 IRP 和发送到 PDO 的 IRP。

例如,SCSI 适配器的驱动程序可能会执行函数驱动程序的角色 (为适配器本身创建 FDO) ,而总线驱动程序 (为连接到适配器的磁盘创建 PDO) 。 作为 SCSI 适配器的功能驱动程序/策略所有者,此驱动程序接收系统 IRP 并请求 SCSI 适配器的设备 IRP。 在其作为磁盘的总线驱动程序的容量中,它处理并完成指定其创建的磁盘 PDO 的设备 IRP。 仅仅因为驱动程序拥有一个设备的电源策略 (FDO) 并不意味着它拥有子设备的电源策略 (PDO) 。

设备电源策略所有者负责以下事项:

  • 在处理即插即用管理器的IRP_MN_START_DEVICE请求时调用 PoSetPowerState,将设备的初始电源状态设置为 D0。

    设备应根据需要开机;例如,设备必须开机才能处理 I/O 请求。 设备电源策略所有者负责确定何时需要其设备,确保设备电源处于打开状态,并设置正确的设备电源状态。 典型设备应在 PnP 启动设备 IRP 完成时开机。

    一般情况下,大多数设备应在不使用时关闭电源,即使系统处于工作状态也是如此。

  • 通过调用 PoRequestPowerIrp 发送设备电源请求以响应系统电源请求。

    例如,当策略所有者收到系统设置电源 IRP 时,它会发送设备设置电源 IRP。 大多数设备在系统进入任何睡眠状态时进入 D3。 DEVICE_CAPABILITIES 结构中的 DeviceState 数组列出了设备可以为每个系统电源状态保持的最高功率状态。 (请参阅 报告设备电源功能。)

  • 检测设备何时处于空闲状态,并将其置于睡眠状态以节省能源。

    电源管理器或设备策略所有者可以检测空闲设备,并发送设备电源 IRP 以更改其状态。 有关详细信息,请参阅 检测空闲设备

  • 在需要时将其设备返回到工作状态。

    当 I/O 请求到达睡眠设备时,设备的驱动程序应将其返回到工作状态。

  • 在请求时为其设备启用和禁用唤醒。

    设备电源策略所有者发送和取消等待/唤醒 IRP,如 支持具有Wake-Up功能的设备中所述。