WdfDeviceAssignS0IdleSettings 函数 (wdfdevice.h)

[适用于 KMDF 和 UMDF]

WdfDeviceAssignS0IdleSettings 方法提供驱动程序提供的信息,框架在设备处于空闲状态且系统处于工作状态时使用该信息。

语法

NTSTATUS WdfDeviceAssignS0IdleSettings(
  [in] WDFDEVICE                              Device,
  [in] PWDF_DEVICE_POWER_POLICY_IDLE_SETTINGS Settings
);

参数

[in] Device

框架设备对象的句柄。

[in] Settings

指向调用方提供的 WDF_DEVICE_POWER_POLICY_IDLE_SETTINGS 结构的指针。

返回值

如果作成功,WdfDeviceAssignS0IdleSettings 返回STATUS_SUCCESS。 其他返回值包括:

返回代码 描述
STATUS_INVALID_DEVICE_REQUEST
调用驱动程序不是设备的电源策略所有者。
STATUS_INVALID_PARAMETER
检测到无效 设置 值。
STATUS_INFO_LENGTH_MISMATCH
WDF_DEVICE_POWER_POLICY_IDLE_SETTINGS 结构的大小不正确。
STATUS_POWER_STATE_INVALID
如果出现以下情况之一,则返回此值:
  • WDF_DEVICE_POWER_POLICY_IDLE_SETTINGS 结构包含无效的设备电源状态。
  • WDF_DEVICE_POWER_POLICY_IDLE_SETTINGS 结构的 IdleCaps 成员表示设备可以唤醒自身,但总线驱动程序指示设备无法唤醒自身。
  • 从在 Windows 8 上运行的 KMDF 版本 1.11 开始,框架会检查系统固件是否可以在系统完全处于(S0)电源状态时处理唤醒信号。 如果计算机未通过此检查,WdfDeviceAssignS0IdleSettings 返回 STATUS_POWER_STATE_INVALID,只要系统保留在 S0 中,设备就完全处于电源状态。

    在这种情况下,驱动程序不应从 EvtDriverDeviceAdd 或任何其他运行时回调返回错误状态值。 大多数情况下,驱动程序可能会记录一个错误,指示设备消耗的功率比平常多。

 

此方法可能会返回其他 NTSTATUS 值

如果驱动程序提供无效的对象句柄,则会发生 bug 检查。

言论

如果驱动程序将 WDF_DEVICE_POWER_POLICY_IDLE_SETTINGSIdleTimeoutType 成员设置为 SystemManagedIdleTimeoutSystemManagedIdleTimeoutWithHint,则必须先调用 WdfDeviceAssignS0IdleSettings,然后才能从 EvtDeviceD0Entry返回。 通常,驱动程序首先从 EvtDriverDeviceAdd调用 WdfDeviceAssignS0IdleSettings

可以随时调用 WdfDeviceAssignS0IdleSettings。 但是,驱动程序在其第一次调用 WdfDeviceAssignS0IdleSettings中设置 IdleTimeoutType 成员的值后,在稍后调用此方法时,它不得更改此值。

如果驱动程序在 EvtDriverDeviceAdd 注册异步通知(例如,通过调用 PoRegisterPowerSettingCallbackIoRegisterPlugPlayNotification),驱动程序不得随后从注册的驱动程序回调例程中调用 WdfDeviceAssignS0IdleSettings

有关详细信息,请参阅 支持空闲停电

例子

下面的代码示例初始化 WDF_DEVICE_POWER_POLICY_IDLE_SETTINGS 结构,设置空闲超时值 10 秒,并调用 WdfDeviceAssignS0IdleSettings

WDF_DEVICE_POWER_POLICY_IDLE_SETTINGS  idleSettings;
NTSTATUS  status = STATUS_SUCCESS;

WDF_DEVICE_POWER_POLICY_IDLE_SETTINGS_INIT(
                                           &idleSettings,
                                           IdleCanWakeFromS0
                                           );
idleSettings.IdleTimeout = 10000;

status = WdfDeviceAssignS0IdleSettings(
                                       device,
                                       &idleSettings
                                       );
if (!NT_SUCCESS(status)) {
    return status;
}

要求

要求 价值
目标平台 普遍
最低 KMDF 版本 1.0
最低 UMDF 版本 2.0
标头 wdfdevice.h (包括 Wdf.h)
Wdf01000.sys(KMDF):WUDFx02000.dll (UMDF)
IRQL <= DISPATCH_LEVEL
DDI 符合性规则 DriverCreate(kmdf)FDOPowerPolicyOwnerAPI(kmdf)KmdfIrql(kmdf)KmdfIrql2(kmdf)、KmdfIrqlExplicit(kmdf)、NonFDONotPowerPolicyOwnerAPI(kmdf)

另请参阅

WDF_DEVICE_POWER_POLICY_IDLE_SETTINGS

WdfDeviceAssignSxWakeSettings