Bug 检查 0x9F:DRIVER_POWER_STATE_FAILURE

DRIVER_POWER_STATE_FAILURE bug 检查的值为0x0000009F。 此 bug 检查表明驱动程序处于不一致或处于无效状态。

重要

本主题面向程序员。 如果您是在使用计算机时收到蓝屏错误代码的客户,请参阅蓝屏错误疑难解答

DRIVER_POWER_STATE_FAILURE 参数

参数1指示违规类型。

参数 1 参数 2 参数3 参数4 原因
0x1 Device 对象 预留 预留 正在释放的设备对象的电源请求仍未完成。
0x2 目标设备的设备对象(如果可用) Device 对象 驱动程序对象(如果可用) 设备对象已完成系统电源状态请求的 i/o 请求数据包 (IRP) ,但未调用 PoStartNextPowerIrp。
0x3 堆栈 (PDO) 的物理设备对象 nt!TRIAGE_9F_POWER。 阻止的 IRP 设备对象已阻止 IRP 太长时间。
0x4 超时值(以秒为单位)。 当前保存在即插即用 (PnP) 锁的线程。 nt!TRIAGE_9F_PNP。 等待与 PnP 子系统同步时,电源状态转换超时。
0x5 堆栈的物理设备对象 POP_FX_DEVICE 对象 已保留 - 0 设备在所需的时间段内未能完成定向的电源转换。
0x6 POP_FX_DEVICE 对象 指示这是否是 (1) 或通电 (0) 完成的定向关机。 已保留 - 0 设备未成功完成其定向的电源转换回拨。
0x500 保留 目标设备的设备对象(如果可用) 设备对象 设备对象已完成系统电源状态请求的 IRP,但未调用 PoStartNextPowerIrp。

原因

有关可能的原因的说明,请参阅 Parameters 部分中每个代码的说明。 常见原因包括:

  • 设备对象释放了未完成的未完成电源请求
  • 电源状态转换超时
  • 阻止 IRP 的设备对象
  • 已完成 IRP,但未调用 PoStartNextPowerIrp

解决方法

若要确定具体原因并创建代码修复,需要对错误模块的源代码进行编程体验和访问。

当参数1等于0x3 时,调试 bug 检查0x9F

  • 在内核调试器中,使用 !分析-v 命令执行初始 bug 检查分析。 详细分析显示 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

如果可以识别负责错误的驱动程序,则其名称将打印在蓝色屏幕上,并存储在内存中位置 (PUNICODE_STRING) KiBugCheckDriver。 可以使用一个调试器命令 dx(显示调试器对象模型表达式)来显示此内容:dx KiBugCheckDriver

Nt!TRIAGE_9F_POWER 结构提供其他 bug 检查信息,这些信息可能会帮助你确定此错误检查的原因。 此结构可以提供所有未完成的电源 Irp 的列表、所有电源 IRP 工作线程的列表以及指向延迟的系统工作线程队列的指针。

  • 使用 dt (显示类型) 命令,并指定 nt!使用 Arg3 中的地址 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 和 power 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
  • 使用带有 Arg2 地址的 ! devstack 命令来显示与错误驱动程序关联的信息。
    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\5&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 driver Framework extension (! wdfkd) 来收集更多的信息。

    使用! wdfkd. wdflogdump< 驱动程序名称 > ,查看 KMDF 是否正在等待确认任何挂起的请求。

    使用! wdfkd. WDFDEVICEQUEUES< WDFDEVICE > 来检查所有未完成的请求及其所处状态。

  • 使用 stack 扩展来检查每个线程的状态,并查找可能会保持电源状态转换的线程。

  • 为了帮助你确定错误的原因,请考虑以下问题:

    • (PDO) 驱动程序 (Arg2) 的物理设备对象的特征是什么?
    • 是否可以找到被阻止的线程? 当你检查带有 ! thread 调试器命令的线程时,该线程包含哪些内容?
    • 是否存在与阻止它的线程关联的 IO? 堆栈上有哪些符号?
    • 检查已阻止的电源 IRP 后,你会注意到什么?
    • Power IRP 的 PnP 次要功能代码是什么?

当参数1等于0x4 时调试 bug 检查0x9F

  • 在内核调试器中,使用 !分析-v 命令执行初始 bug 检查分析。 详细分析显示 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 结构提供可帮助您确定错误原因的其他 bug 检查信息。 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。

备注

如果尚未具备使用上述技术调试此问题的能力,可以使用一些基本的故障排除技术。

  • 如果最近添加了新的设备驱动程序或系统服务,请尝试删除或更新它们。 尝试确定系统中导致新 Bug 检查代码出现的原因。

  • 查看设备管理器,查看是否有设备标有感叹号 (!) 。 查看任何出错驱动程序的驱动程序属性中显示的事件日志。 请尝试更新相关驱动程序。

  • 检查事件查看器中的系统日志,以获取可能有助于查明导致错误的设备或驱动程序的其他错误消息。 有关详细信息,请参阅打开事件查看器。 在系统日志中查找与蓝屏同时出现的严重错误。

  • 若要尝试找出原因,请暂时使用控制面板、电源选项禁用省电。 某些驱动程序问题与系统休眠的各种状态以及电源的挂起和恢复有关。

  • 如果最近向系统添加了硬件,请尝试删除或替换它。 或与制造商联系,查看是否有可用的修补程序。

  • 你可尝试运行系统制造商提供的硬件诊断。

  • 请咨询制造商,看更新的系统 ACPI/BIOS 或其他固件是否可用。

另请参阅

使用 Windows 调试器 (WinDbg) 进行故障转储分析

使用 WinDbg 分析内核模式转储文件

Bug 检查代码参考