DRIVER_POWER_STATE_FAILURE 错误检查的值为 0x0000009F。
此错误检查表明驱动程序处于不一致或者无效的电源状态。
原因
有关可能原因的说明,请参阅参数部分中每个代码的说明。
说明
如果我们不具备使用上述技术调试此问题的能力,我们可以使用一些基本的故障排除技术。
- 如果最近添加了新的设备驱动程序或者系统服务,请尝试删除或者更新它们。尝试确定系统中导致新错误检查代码出现的更改。
- 在设备管理器中查看是否有任何设备标有感叹号 (!)。查看驱动程序属性中显示的任何故障驱动程序的事件日志。尝试更新相关驱动程序。
- 检查事件查看器中的系统日志以获取可能有助于查明导致错误的设备或者驱动程序的其他错误消息。有关更多信息,请参阅打开事件查看器。
在系统日志中查找与蓝屏在同一时间窗口中发生的严重错误。
- 要尝试找出原因,请使用控制面板、电源选项暂时禁用省电功能。一些驱动程序问题与系统休眠的各种状态以及电源的暂停和恢复有关。
- 如果我们最近向系统添加了硬件,请尝试移除或者更换它。或者与制造商联系以查看是否有可用的补丁。
- 我们可以尝试运行系统制造商提供的硬件诊断程序。
- 请与制造商联系以查看是否有更新的系统 ACPI/BIOS 或者其他固件可用。
解决方法
参数 1 等于 0x3 时调试错误检查 0x9F
- 在内核调试器中,使用 !analyze -v 命令执行初始错误检查分析。
详细分析显示了 nt!TRIAGE_9F_POWER 结构的地址,它在 Arg3 中。
kd>!analyze -v *** * * * Bugcheck Analysis * * * *** DRIVER_POWER_STATE_FAILURE (9f) A driver has failed to complete a power IRP within a specific time. Arguments: Arg1: 0000000000000003, A device object has been blocking an Irp for too long a time Arg2: fffffa8007b13440, Physical Device Object of the stack Arg3: fffff8000386c3d8, nt!TRIAGE_9F_POWER on Win7 and higher, otherwise the Functional Device Object of the stack Arg4: fffffa800ab61bd0, The blocked IRP
nt!TRIAGE_9F_POWER 结构提供了另外的错误检查信息,可以确定此错误检查的原因。
该结构可以提供所有未完成的电源 IRP 的列表、所有电源 IRP 工作线程的列表以及指向延迟系统工作队列的指针。
- 使用 dt(显示类型)命令并使用来自 Arg3 的地址指定 nt!TRIAGE_9F_POWER 结构。
0: kd> dt nt!TRIAGE_9F_POWER fffff8000386c3d8 +0x000 Signature : 0x8000 +0x002 Revision : 1 +0x008 IrpList : 0xfffff800`01c78bd0 _LIST_ENTRY [ 0xfffffa80`09f43620 - 0xfffffa80`0ad00170 ] +0x010 ThreadList : 0xfffff800`01c78520 _LIST_ENTRY [ 0xfffff880`009cdb98 - 0xfffff880`181f2b98 ] +0x018 DelayedWorkQueue : 0xfffff800`01c6d2d8 _TRIAGE_EX_WORK_QUEUE
dt(显示类型)命令显示结构。
我们可以使用各种调试器命令跟随 LIST_ENTRY 字段来检查未完成的 IRP 列表和强大的 IRP 工作线程。
- 使用 !irp 命令检查被阻止的 IRP。
这个 IRP 的地址在 Arg4 中。
0: kd> !irp fffffa800ab61bd0 Irp is active with 7 stacks 6 is current (= 0xfffffa800ab61e08) No Mdl: No System Buffer: Thread 00000000: Irp stack trace. cmd flg cl Device File Completion-Context [N/A(0), N/A(0)] 0 0 00000000 00000000 00000000-00000000 Args: 00000000 00000000 00000000 00000000 [N/A(0), N/A(0)] 0 0 00000000 00000000 00000000-00000000 Args: 00000000 00000000 00000000 00000000 [N/A(0), N/A(0)] 0 0 00000000 00000000 00000000-00000000 Args: 00000000 00000000 00000000 00000000 [N/A(0), N/A(0)] 0 0 00000000 00000000 00000000-00000000 Args: 00000000 00000000 00000000 00000000 [N/A(0), N/A(0)] 0 0 00000000 00000000 00000000-00000000 Args: 00000000 00000000 00000000 00000000 >[IRP_MJ_POWER(16), IRP_MN_SET_POWER(2)] 0 e1 fffffa800783f060 00000000 00000000-00000000 pending \Driver\HidUsb Args: 00016600 00000001 00000004 00000006 [N/A(0), N/A(0)] 0 0 00000000 00000000 00000000-fffffa800ad00170 Args: 00000000 00000000 00000000 00000000
- 使用 !devstack 命令和 Arg2 中的 PDO 地址,显示与故障驱动程序相关的信息。
0: kd> !devstack fffffa8007b13440 !DevObj !DrvObj !DevExt ObjectName fffffa800783f060 \Driver\HidUsb fffffa800783f1b0 InfoMask field not found for _OBJECT_HEADER at fffffa800783f030 > fffffa8007b13440 \Driver\usbhub fffffa8007b13590 Cannot read info offset from nt!ObpInfoMaskToOffset !DevNode fffffa8007ac8a00 : DeviceInst is "USB\VID_04D8&PID_0033&46fa7b7&0&1" ServiceName is "HidUsb"
- 使用 !poaction 命令显示处理电源操作和任何分配的电源 IRP 的线程。
3: kd> !poaction PopAction: fffff801332f3fe0 State..........: 0 - Idle Updates........: 0 Action.........: None Lightest State.: Unspecified Flags..........: 10000003 QueryApps|UIAllowed Irp minor......: ?? System State...: Unspecified Hiber Context..: 0000000000000000 Allocated power irps (PopIrpList - fffff801332f44f0) IRP: ffffe0001d53d8f0 (wait-wake/S0), PDO: ffffe00013cae060 IRP: ffffe0001049a5d0 (wait-wake/S0), PDO: ffffe00012d42050 IRP: ffffe00013d07420 (set/D3,), PDO: ffffe00012daf840, CURRENT: ffffe00012dd5040 IRP: ffffe0001e5ac5d0 (wait-wake/S0), PDO: ffffe00013d33060 IRP: ffffe0001ed3e420 (wait-wake/S0), PDO: ffffe00013c96060 IRP: ffffe000195fe010 (wait-wake/S0), PDO: ffffe00012d32050 Irp worker threads (PopIrpThreadList - fffff801332f3100) THREAD: ffffe0000ef5d040 (static) THREAD: ffffe0000ef5e040 (static), IRP: ffffe00013d07420, DEVICE: ffffe00012dd5040 PopAction: fffff801332f3fe0 State..........: 0 - Idle Updates........: 0 Action.........: None Lightest State.: Unspecified Flags..........: 10000003 QueryApps|UIAllowed Irp minor......: ?? System State...: Unspecified Hiber Context..: 0000000000000000 Allocated power irps (PopIrpList - fffff801332f44f0) IRP: ffffe0001d53d8f0 (wait-wake/S0), PDO: ffffe00013cae060 IRP: ffffe0001049a5d0 (wait-wake/S0), PDO: ffffe00012d42050 IRP: ffffe00013d07420 (set/D3,), PDO: ffffe00012daf840, CURRENT: ffffe00012dd5040 IRP: ffffe0001e5ac5d0 (wait-wake/S0), PDO: ffffe00013d33060 IRP: ffffe0001ed3e420 (wait-wake/S0), PDO: ffffe00013c96060 IRP: ffffe000195fe010 (wait-wake/S0), PDO: ffffe00012d32050 Irp worker threads (PopIrpThreadList - fffff801332f3100) THREAD: ffffe0000ef5d040 (static) THREAD: ffffe0000ef5e040 (static), IRP: ffffe00013d07420, DEVICE: ffffe00012dd5040
- 如果我们使用的是 KMDF 驱动程序,请使用 Windows 驱动程序框架扩展 (!wdfkd) 来收集其他信息。
使用 !wdfkd.wdflogdump<your driver="" name="">,查看 KMDF 是否正在等待我们确认任何挂起的请求。
使用 !wdfkd.wdfdevicequeues<your wdfdevice="">检查所有未完成的请求以及它们处于什么状态。 - 使用 !stacks 扩展检查每个线程的状态并查找可能阻止电源状态转换的线程。
- 为确定错误原因,请考虑以下问题:
- 物理设备对象 (PDO) 驱动程序 (Arg2) 的特征是什么?
- 你能找到被阻塞的线程吗?当我们使用 !thread debugger 命令检查线程时,线程由什么组成?
- 是否有与阻塞它的线程相关的 IO?堆栈上有哪些符号?
- 当我们检查被阻止的电源 IRP 时,我们会注意到什么?
- 电源 IRP 的 PnP 次要功能码是什么?
当参数 1 等于 0x4 时,调试错误检查 0x9F
- 在内核调试器中,使用 !analyze -v 命令执行初始错误检查分析。
详细分析显示了 nt!TRIAGE_9F_PNP 结构的地址,它在参数 4 (arg4) 中。
kd> !analyze -v *** * * * Bugcheck Analysis * * * *** DRIVER_POWER_STATE_FAILURE (9f) A driver has failed to complete a power IRP within a specific time (usually 10 minutes). Arguments: Arg1: 00000004, The power transition timed out waiting to synchronize with the Pnp subsystem. Arg2: 00000258, Timeout in seconds. Arg3: 84e01a70, The thread currently holding on to the Pnp lock. Arg4: 82931b24, nt!TRIAGE_9F_PNP on Win7
nt!TRIAGE_9F_PNP 结构提供了另外的错误检查信息,可以确定错误的原因。
nt!TRIAGE_9F_PNP 结构提供一个指向包含已调度(但未完成)PnP IRP 列表的结构的指针,并提供指向延迟系统工作队列的指针。
- 使用 dt(显示类型)命令并指定 nt!TRIAGE_9F_PNP 结构和我们在 Arg4 中找到的地址。
kd> dt nt!TRIAGE_9F_PNP 82931b24 +0x000 Signature : 0x8001 +0x002 Revision : 1 +0x004 CompletionQueue : 0x82970e20 _TRIAGE_PNP_DEVICE_COMPLETION_QUEUE +0x008 DelayedWorkQueue : 0x829455bc _TRIAGE_EX_WORK_QUEUE
dt(显示类型)命令显示结构。
我们可以使用调试器命令跟随 LIST_ENTRY 字段来检查未完成的 PnP IRP 列表。
为了确定错误的原因,请考虑以下问题:
- 是否有与线程关联的 IRP?
- CompletionQueue 中有 IO 吗?
- 堆栈上有哪些符号?
- 请参阅上述参数 0x3 下描述的其他技术。
DRIVER_POWER_STATE_FAILURE 参数
参数 1 表示违规类型。
Parameter 1 | 参数2 | 参数3 | 参数4 | 原因 |
---|---|---|---|---|
0x1 | 设备对象 | 保留 | 保留 | 被释放的设备对象仍有未完成的未完成电源请求。 |
0x2 | 目标设备的设备对象,如果可用 | 设备对象 | 驱动程序对象,如果可用 | 设备对象完成了系统电源状态请求的 I/O 请求包 (IRP),但它没有调用 PoStartNextPowerIrp。 |
0x3 | 堆栈 | nt!TRIAGE_9F_POWER的物理设备对象 (PDO) 。 | 阻塞的 IRP | 设备对象阻塞 IRP 的时间过长。 |
0x4 | 超时值,以秒为单位。 | 当前持有即插即用 (PnP) 锁的线程。 | nt!TRIAGE_9F_PNP。 | 等待与 PnP 子系统同步的电源状态转换超时。 |
0x5 | 堆栈 | 的物理设备对象POP_FX_DEVICE 对象 | 保留 - 0 | 设备未能在所需的时间内完成定向电源转换。 |
0x6 | POP_FX_DEVICE 对象 | 指示这是定向掉电(1) 还是上电(0) 完成。 | 保留 - 0 | 设备未成功完成其定向电源转换回调。 |
0x500 | 保留 | 目标设备的设备对象,如果可用 | 设备对象 | 设备对象完成了系统电源状态请求的 IRP,但它没有调用 PoStartNextPowerIrp。 |