バグ チェック 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 やその他のファームウェアがないかどうかを確認します。