次の方法で共有


バグ チェック 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 オブジェクト これが Directed Power Down (1) の完了だったか、Power Up (0) の完了だったかを示します。 予約済み - 0 デバイスが Directed Power Transition コールバックを正常に完了しませんでした。
0x500 予約されています。 ターゲット デバイスのデバイス オブジェクト (利用可能な場合) Device オブジェクト デバイス オブジェクトがシステム電源状態要求の IRP を完了しましたが、PoStartNextPowerIrp を呼び出しませんでした。

原因

考えられる原因については、「パラメーター」セクションの各コードの説明を参照してください。 一般的な原因には、次のようなものがあります。

  • 完了していない未処理の電源要求がある状態でデバイス オブジェクトが解放された
  • 電源状態の遷移中にタイムアウトが発生した
  • デバイス オブジェクトが IRP をブロックしている
  • IRP は完了したが、PoStartNextPowerIrp が呼び出されなかった

解決方法

特定の原因を特定し、コード修正を作成するには、エラーが発生しているモジュールのソース コードへのプログラミング エクスペリエンスとアクセスが必要です。

パラメーター 1 が 0x3 の場合のバグ チェック 0x9F のデバッグ

  • カーネル デバッガーで、!analyze -v コマンドを使用して、初期バグ チェック分析を実行します。 詳細分析により、Arg3 に nt!TRIAGE_9F_POWER 構造体のアドレスが表示されます。
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 構造体は、バグ チェックの原因を特定するために役立つ可能性のある追加のバグ チェック情報を提供します。 この構造体には、すべての未処理の電源 IRP のリスト、すべての電源 IRP ワーカー スレッドのリスト、遅延システム ワーカー キューへのポインターが含まれています。

  • dt (型の表示) コマンドを使用し、nt!TRIAGE_9F_POWER 構造体を Arg3 のアドレスで指定します。
    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
  • 障害が発生しているドライバーに関連付けられている情報を表示するには、Arg2 の PDO アドレスを指定して !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"
  • 電源操作を処理するスレッドと割り当てられた電源 IRP を表示するには、!poaction コマンドを使用します。
    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) を使用して追加情報を収集します。

    KMDF が保留中の要求に対する ACK を待機しているかどうかを確認するには、!wdfkd.wdflogdump<ドライバー名> を使用します。

    すべての未処理の要求とそれらの状態を調べるには、!wdfkd.wdfdevicequeues<WDFDEVICE> を使用します。

  • 各スレッドの状態を調べ、電源状態の遷移を妨げている可能性のあるスレッドを特定するには、!stacks 拡張機能を使用します。

  • エラーの原因を特定するには、次の質問を検討してください。

    • 物理デバイス オブジェクト (PDO) のドライバー (Arg2) にはどのような特性がありますか?
    • ブロックされたスレッドを特定できますか? !thread デバッガー コマンドを使用してそのスレッドを調べた場合、スレッドの構成はどのようになっていますか?
    • スレッドに関連付けられていて、ブロックしている IO はありますか? スタックにはどのようなシンボルがありますか?
    • ブロックされた電源 IRP を調べると、何がわかりますか?
    • 電源 IRP の PnP マイナー ファンクション コードは何ですか?

パラメーター 1 が 0x4 の場合のバグ チェック 0x9F のデバッグ

  • カーネル デバッガーで、!analyze -v コマンドを使用して、初期バグ チェック分析を実行します。 詳細分析により、パラメーター 4 (Arg4) に nt!TRIAGE_9F_PNP 構造体のアドレスが表示されます。
    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 の場合の追加の手法を参照してください。

解説

上記の手法を使用してこの問題をデバッグできる環境がない場合は、いくつかの基本的なトラブルシューティング手法を使用できます。

  • 新しいデバイス ドライバーまたはシステム サービスが最近追加された場合は、それらを削除または更新してみてください。 新しいバグ チェック コードが表示される原因となったシステムの変更内容を確認します。

  • デバイス マネージャーで、感嘆符 (!) が付いているデバイスがないかどうかを確認します。 障害が発生しているドライバーのプロパティに表示されたイベント ログを確認します。 関連するドライバーを更新してみます。

  • イベント ビューアーを使用してシステム ログで追加のエラー メッセージを確認すると、エラーの原因になっているデバイスやドライバーを特定できる可能性があります。 詳しくは、イベント ビューアーの使用に関するページをご覧ください。 ブルー スクリーンと同じ時間帯に発生した重大なエラーをシステム ログで探します。

  • 原因の分離を試みるために、コントロール パネルの [電源オプション] を使用して、電力節約機能を一時的に無効にします。 一部のドライバーの問題は、システムのさまざまな休止状態および電源の一時停止と再開に関連しています。

  • 最近システムにハードウェアを追加した場合は、削除または交換してみてください。 または、利用可能なパッチがないか、製造元に確認します。

  • システムの製造元から提供されているハードウェア診断を実行してみることができます。

  • 製造元に問い合わせて、更新されたシステム ACPI/BIOS やその他のファームウェアがないかどうかを確認します。

関連項目

Windows デバッガー (WinDbg) を使用したクラッシュ ダンプ分析

WinDbg によるカーネルモード ダンプ ファイルの分析

バグ チェック コード リファレンス