共用方式為


錯誤檢查0x9F:DRIVER_POWER_STATE_FAILURE

DRIVER_POWER_STATE_FAILURE錯誤檢查的值為 0x0000009F。 這個錯誤檢查指出驅動程式處於不一致或不正確電源狀態。

重要

本文適用于程式設計人員。 如果您是在使用電腦時收到藍色螢幕錯誤碼的客戶,請參閱 針對藍色畫面錯誤進行疑難排解

DRIVER_POWER_STATE_FAILURE參數

參數 1 表示違規類型。

參數 1 參數 2 參數 3 參數 4 原因
0x1 裝置物件 保留 保留 正在釋放的裝置物件仍有尚未完成的未完成電源要求。
0x2 如果目標裝置的裝置物件可用,則為 裝置物件 如果驅動程式物件可用,則為 裝置物件已完成系統電源狀態要求的 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 一節中的每個程式碼描述。 常見的原因包括:

  • 裝置物件釋放 w/ 未完成的電源要求
  • 電源狀態轉換逾時
  • 封鎖 IRP 的裝置物件
  • 已完成 IRP,但未呼叫 PoStartNextPowerIrp

解決方案

若要判斷特定原因並建立程式碼修正,需要程式設計體驗和存取錯誤模組的原始程式碼。

當參數 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

如果可以識別負責錯誤的驅動程式,則會在藍色畫面上列印其名稱,並儲存在 kiBugCheckDriver位置 (PUNICODE_STRING) 記憶體中。 您可以使用dx (顯示偵錯工具物件模型運算式) ,這是偵錯工具命令,以顯示下列專案: dx KiBugCheckDriver

nt!TRIAGE_9F_POWER 結構提供其他錯誤檢查資訊,可協助您判斷這個錯誤檢查的原因。 結構可以提供所有未處理電源 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 清單和電源 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\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 驅動程式架構延伸 模組 (!wdfkd) 來收集其他資訊。

    使用!wdfkd.wdflogdump< 驅動程式名稱 > ,查看 KMDF 是否正在等候您 ACK 任何擱置的要求。

    使用!wdfkd.wdfdevicequeues< 您的 WDFDEVICE > 來檢查所有未處理的要求及其狀態。

  • 使用 !stacks 延伸模組來檢查每個執行緒的狀態,並尋找可能按住電源狀態轉換的執行緒。

  • 若要協助您判斷錯誤的原因,請考慮下列問題:

    • 實體裝置物件 (PDO) 驅動程式 (Arg2) 的特性為何?
    • 您是否可以找到封鎖的執行緒? 當您使用 !thread 偵錯工具命令檢查執行緒時,執行緒包含什麼?
    • 是否有 IO 與封鎖它的執行緒相關聯? 堆疊上有哪些符號?
    • 當您檢查封鎖的電源 IRP 時,您會注意到什麼?
    • Power 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?

  • 完成佇列中是否有任何 IO?

  • 堆疊上有哪些符號?

  • 請參閱上述參數0x3底下所述的其他技術。

備註

如果您未使用上述技術對此問題進行偵錯,您可以使用一些基本的疑難排解技術。

  • 如果最近有新增裝置驅動程式或系統服務,請嘗試加以移除或更新。 嘗試判斷系統中造成新錯誤檢查程式碼出現什麼變更。

  • 查看裝置管理員,以查看是否有任何裝置以驚嘆號標示 (!) 。 檢閱驅動程式屬性中顯示的事件記錄檔,以取得任何錯誤驅動程式。 請嘗試更新相關驅動程式。

  • 檢查系統登入事件檢視器是否有其他錯誤訊息,以協助找出造成錯誤的裝置或驅動程式。 如需詳細資訊,請參閱開啟事件檢視器。 在系統記錄中尋找與藍色畫面發生時相同的時間範圍內,是否有發生嚴重錯誤。

  • 若要嘗試並隔離原因,請使用控制台電源選項暫時停用電源儲存。 某些驅動程式問題與各種系統休眠狀態以及電源暫停和繼續有所關聯。

  • 如果最近有在系統中新增硬體,請嘗試予以移除或更換。 或向製造商確認是否有任何可用的修補檔。

  • 您可以試著執行系統製造商所提供的硬體診斷功能。

  • 請洽詢製造商,以查看是否有更新的系統 ACPI/BIOS 或其他韌體可用。

另請參閱

使用 Windows 偵錯工具進行損毀傾印分析 (WinDbg)

使用 WinDbg 分析 Kernel-Mode 傾印檔案

錯誤檢查代碼參考