ドライバーの検証ツールが有効な場合のバグ チェックの処理
ドライバー検証 は、実行時にドライバー エラーを検出します。 ドライバー検証 を !analyze デバッガー コマンドと組み合わせて使用すると、ドライバー内のエラーを検出して情報を表示できます。
Windows 8 では、ドライバー検証は、DDI コンプライアンス チェック などの新機能で強化されています。 ここでは、DDI コンプライアンス チェックを示す例を示します。
セットアップするには、次の手順を使用します。
- ホスト コンピューターとターゲット コンピューターの間でカーネル モード デバッグ セッションを確立します。
- ターゲット コンピューターにドライバーをインストールします。
- ターゲット コンピュータでコマンド プロンプト ウィンドウを開き、コマンド「検証」を入力します。 ドライバー検証 マネージャーを使用して、ドライバーのドライバー検証ツールを有効にします。
- ターゲット コンピューターを再起動します。
ドライバー検証ツールは、エラーを検出すると、バグ チェックを生成します。 その後、Windows はデバッガーに分割され、エラーの簡単な説明が表示されます。 ドライバー検証ツールでバグ チェック DRIVER_VERIFIER_DETECTED_VIOLATION (C4) が生成される例を次に示します。
Driver Verifier: Extension abort with Error Code 0x20005
Error String ExAcquireFastMutex should only be called at IRQL <= APC_LEVEL.
*** Fatal System Error: 0x000000c4
(0x0000000000020005,0xFFFFF88000E16F50,0x0000000000000000,0x0000000000000000)
Break instruction exception - code 80000003 (first chance)
A fatal system error has occurred.
Debugger entered on first try; Bugcheck callbacks have not been invoked.
A fatal system error has occurred.
nt!DbgBreakPointWithStatus:
fffff802`a40ef930 cc int 3
デバッガーで、「!analyze -v」と入力して、エラーの詳細な説明を取得します。
0: kd> !analyze -v
Connected to Windows 8 9200 x64 target at (Thu Oct 11 13:48:31.270 2012 (UTC - 7:00)), ptr64 TRUE
Loading Kernel Symbols
...............................................................
................................................................
...................
Loading User Symbols
..................................................
Loading unloaded module list
............
*******************************************************************************
* *
* Bugcheck Analysis *
* *
*******************************************************************************
DRIVER_VERIFIER_DETECTED_VIOLATION (c4)
A device driver attempting to corrupt the system has been caught. This is
because the driver was specified in the registry as being suspect (by the
administrator) and the kernel has enabled substantial checking of this driver.
If the driver attempts to corrupt the system, bugchecks 0xC4, 0xC1 and 0xA will
be among the most commonly seen crashes.
Arguments:
Arg1: 0000000000020005, ID of the 'IrqlExApcLte1' rule that was violated.
Arg2: fffff88000e16f50, A pointer to the string describing the violated rule condition.
Arg3: 0000000000000000, An optional pointer to the rule state variable(s).
Arg4: 0000000000000000, Reserved (unused)
## Debugging Details:
...
DV_VIOLATED_CONDITION: ExAcquireFastMutex should only be called at IRQL <= APC_LEVEL.
DV_MSDN_LINK: !url https://go.microsoft.com/fwlink/p/?linkid=216022
DV_RULE_INFO: !ruleinfo 0x20005
BUGCHECK_STR: 0xc4_IrqlExApcLte1_XDV
DEFAULT_BUCKET_ID: WIN8_DRIVER_FAULT
PROCESS_NAME: TiWorker.exe
CURRENT_IRQL: 9
上記の出力では、違反したルール IrqlExApcLte1 の名前と説明を確認でき、IrqlExApcLte1 ルール (wdm) を説明する参照ページへのリンクを選択できます。 デバッガー コマンド リンク !ruleinfo 0x20005を選択して、ルールに関する情報を取得することもできます。 この場合、割り込み要求レベル (IRQL) がAPC_LEVELより大きい場合、ExAcquireFastMutex を呼び出すことができないというルールが示されます。 出力は、現在の IRQL が 9 であることを示し、wdm.h では、APC_LEVELの値が 1 であることがわかります。 IRQL の詳細については、「ハードウェア優先度の管理」を参照してください。
!analyze -v の出力は、スタック トレースと、エラーの原因となったコードに関する情報で続行されます。 次の出力では、MyDriver.sys の OnInterrupt ルーチンが ExAcquireFastMutex を呼び出していることがわかります。 OnInterrupt は、APC_LEVELより大きい IRQL で実行される割り込みサービス ルーチンであるため、ExAcquireFastMutex を呼び出すには、このルーチンの違反です。
LAST_CONTROL_TRANSFER: from fffff802a41f00ea to fffff802a40ef930
STACK_TEXT:
... : nt!DbgBreakPointWithStatus ...
... : nt!KiBugCheckDebugBreak+0x12 ...
... : nt!KeBugCheck2+0x79f ...
... : nt!KeBugCheckEx+0x104 ...
... : VerifierExt!SLIC_abort+0x47 ...
... : VerifierExt!SLIC_ExAcquireFastMutex_entry_irqlexapclte1+0x25 ...
... : VerifierExt!ExAcquireFastMutex_wrapper+0x1a ...
... : nt!ViExAcquireFastMutexCommon+0x1d ...
... : nt!VerifierExAcquireFastMutex+0x1a ...
... : MyDriver!OnInterrupt+0x69 ...
... : nt!KiScanInterruptObjectList+0x6f ...
... : nt!KiChainedDispatch+0x19a ...
...
STACK_COMMAND: kb
FOLLOWUP_IP:
MyDriver!OnInterrupt+69 ...
fffff880`16306649 4c8d0510040000 lea r8,[MyDriver! ?? ::FNODOBFM::`string' (fffff880`16306a60)]
FAULTING_SOURCE_LINE: c:\MyDriverwdm03\cpp\MyDriver\pnp.c
FAULTING_SOURCE_FILE: c:\MyDriverwdm03\cpp\MyDriver\pnp.c
FAULTING_SOURCE_LINE_NUMBER: 26
FAULTING_SOURCE_CODE:
22: if(1 == interruptStatus)
23: {
24: ...
25: ExAcquireFastMutex( &(fdoExt->fastMutex) );
> 26: ...
27: ExReleaseFastMutex( &(fdoExt->fastMutex) );
28: ...
29: return TRUE;
30: }
31: else
SYMBOL_STACK_INDEX: 9
SYMBOL_NAME: MyDriver!OnInterrupt+69
FOLLOWUP_NAME: ...
MODULE_NAME: MyDriver
IMAGE_NAME: MyDriver.sys
DEBUG_FLR_IMAGE_TIMESTAMP: 50772f37
BUCKET_ID_FUNC_OFFSET: 69
FAILURE_BUCKET_ID: 0xc4_IrqlExApcLte1_XDV_VRF_MyDriver!OnInterrupt
BUCKET_ID: 0xc4_IrqlExApcLte1_XDV_VRF_MyDriver!OnInterrupt