WdfDeviceStopIdle 宏 (wdfdevice.h)

[适用于 KMDF 和 UMDF]

WdfDeviceStopIdle 方法通知框架,指定的设备必须置于其工作 (D0) 电源状态中。

语法

NTSTATUS WdfDeviceStopIdle(
   _In_ WDFDEVICE Device,
   _In_ BOOLEAN WaitForD0
);

参数

[in] Device

框架设备对象的句柄。

[in] WaitForD0

一个布尔值,指示 何时返回 WdfDeviceStopIdle 。 如果 为 TRUE,则仅在指定设备进入 D0 设备电源状态后返回。 如果 为 FALSE,该方法将立即返回。

返回值

备注

此宏可以返回以下值:

返回值 含义
STATUS_PENDING 设备正在异步启动。
STATUS_INVALID_DEVICE_STATE 驱动程序不是设备的电源策略所有者。
STATUS_POWER_STATE_INVALID 发生设备故障,设备无法进入其 D0 电源状态。

该方法可能会返回其他 NTSTATUS 值。

注意

对于在 WDF_POWER_POLICY_IDLE_TIMEOUT_TYPE 枚举中指定 SystemManagedIdleTimeoutSystemManagedIdleTimeoutWithHint 的设备, 调用 WdfDeviceStopIdleWaitForD0 设置为 FALSE 时,如果设备仍在 D0 中,并且空闲超时期限尚未过,则从 WDF 版本 1.33/2.33 开始,WdfDeviceStopIdle 在早期版本中返回STATUS_SUCCESS (,这会导致返回值STATUS_PENDING) 。

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

如果设备在空闲时可以进入低功耗状态,驱动程序可能需要偶尔调用 WdfDeviceStopIdle ,使设备恢复工作 (D0) 状态或阻止其进入低功耗状态。

当系统更改为 Sx 睡眠状态时,WdfDeviceStopIdle 不会阻止框架将设备转换为睡眠状态。 它的唯一效果是在系统处于 S0 工作状态时防止转换为 Dx 睡眠状态。 同样,如果设备支持 定向电源管理则 WdfDeviceStopIdle 不会阻止设备进入定向断电。

警告

在关机期间,请勿直接或间接调用具有 WaitForD0 = TRUEWdfDeviceStopIdle。 例如,如果 EvtDeviceArmWakeFromS0 回调在另一个调用 WdfDeviceStopIdle(TRUE)的线程上等待,则会阻止电源转换,并且系统崩溃。

当设备处于空闲状态并且框架将 I/O 请求置于设备的电源托管 I/O 队列中时,驱动程序 不必 调用 WdfDeviceStopIdle 。 此外,当设备处于空闲状态并且检测到唤醒信号时,驱动程序 不必 调用 WdfDeviceStopIdle 。 在这两种情况下,框架都请求总线驱动程序将设备的电源状态还原为 D0。

尽管驱动程序在处理从电源管理的 I/O 队列获取的 I/O 请求时通常不需要调用 WdfDeviceStopIdle ,但允许调用。 但是,驱动程序在处理来自电源管理的 I/O 队列的 I/O 请求时,不得将 WaitForD0 参数设置为 TRUE

如果 驱动程序必须 访问设备,则驱动程序必须调用 WdfDeviceStopIdle ,因为驱动程序已在电源管理的 I/O 队列之外收到请求。 例如,驱动程序可能支持驱动程序定义的接口或需要访问设备的 WMI 请求。 在这种情况下,必须确保设备在驱动程序访问设备之前处于其工作状态,并且设备在驱动程序完成访问设备之前保持其工作状态。

如果系统处于工作 (S0) 状态,则调用 WdfDeviceStopIdle 会强制设备进入其工作 (D0) 状态。 设备将保持工作状态,直到驱动程序调用 WdfDeviceResumeIdle,此时,如果设备保持空闲状态,框架可以将设备置于低功耗状态。

在框架首次调用驱动程序的 EvtDeviceD0Entry 回调函数之前,请勿调用 WdfDeviceStopIdle

仅当系统处于工作 (S0) 状态时,对 WdfDeviceStopIdle 的调用才能将空闲设备还原到其工作状态。 如果系统正在转换为低功耗状态,或者设备已关闭电源以响应 Sx (其中 x > 0) 当驱动程序调用 WdfDeviceStopIdle 并将 WaitForD0 参数设置为 TRUE 时,函数不会返回,直到系统返回到其 S0 状态。

每次成功调用 WdfDeviceStopIdle 后,最终都必须调用 WdfDeviceResumeIdle,否则设备在再次变为空闲状态时永远不会返回到低功耗状态。 对 WdfDeviceStopIdle 的调用可以嵌套,因此对 WdfDeviceResumeIdle 的调用次数必须等于对 WdfDeviceStopIdle 的调用数。 如果对 WdfDeviceStopIdle 的调用失败,请不要调用 WdfDeviceResumeIdle

如果系统在 WdfDeviceStopIdle 返回后进入低功耗状态,则设备也会进入低功耗状态。 当系统返回到其工作 (S0) 状态时,设备也会返回到其工作 (D0) 状态。 调用 WdfDeviceStopIdle 的电源参考将保持活动状态,并阻止设备进入低功耗状态,直到对 WdfDeviceResumeIdle 进行匹配调用。

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

如果 WaitForD0TRUE,则必须在 IRQL = PASSIVE_LEVEL调用 WdfDeviceStopIdle 。 如果 WaitForD0FALSE,则必须在 IRQL <= DISPATCH_LEVEL 调用此方法。

调用 WdfDeviceStopIdleWithTag 而不是 WdfDeviceStopIdle 可提供可在 Microsoft 调试器中查看 (标记值、行号和文件名) 的其他信息。

示例

在下面的代码示例中, WdfDeviceStopIdle 在指定设备进入 D0 设备电源状态后返回。

NTSTATUS  status;

status = WdfDeviceStopIdle(Device, TRUE);

要求

要求
目标平台 通用
最低 KMDF 版本 1.0
最低 UMDF 版本 2.0
标头 wdfdevice.h (包括 Wdf.h)
Library Wdf01000.sys (KMDF) ;WUDFx02000.dll (UMDF)
IRQL 请参见“备注”部分。
DDI 符合性规则 DriverCreate (kmdf) KmdfIrql (kmdf) KmdfIrql2 (kmdf) 、 KmdfIrqlExplicit (kmdf)

另请参阅