ドライバー検証ツールを使用して上級ユーザー向けの Windows ドライバーに関する問題を特定する
ドライバー検証ツールは、Windows 2000 以降のすべてのバージョンの Windows に含まれています。 これは、システムの破損、障害、またはその他の予期しない動作を引き起こすことがわかっている多くのドライバーの問題を検出してトラブルシューティングするために使用されます。 この記事では、ドライバー検証ツールを使用して、システム内のドライバーを分離およびトラブルシューティングする方法について説明します。
適用対象: Windows Server 2012 Foundation、Windows Server 2012 Essentials、Windows Server 2012 Standard、Windows Server 2012 Datacenter
元の KB 番号: 244617
ドライバー検証ツールの機能
ドライバー検証ツールを使用するには、Verifier.exeを実行し、コンピューターを再起動します。 システム内のドライバーの分析を開始するために、他の変更を加える必要はありません。 Verifier.exeを実行するには、ユーザー アカウントに管理者特権が必要です。
ドライバー検証ツールは、ドライバーの動作のさまざまな側面を確認できます。 これらの機能は、フラグを使用して有効にするオプションまたは設定にグループ化されます。 (通常、用語のオプション、設定、フラグは、ドライバー検証ツールのドキュメントで交換可能です。これらは同様の概念を表します。
各フラグの詳細については、「 Driver Verifier のオプションとルール クラスを参照してください。
標準オプション
次のオプションは、システム内のすべてのドライバーが違反してはならないルールを一緒に表します。 これらのオプションは、ドライバー検証ツール GUI で標準設定を有効にするか、コマンド ラインを使用してドライバー検証ツールを構成するときに /standard
スイッチを指定するときに有効になります。
自動チェック
これらのチェックは、選択されているオプションに関係なく、検証中のドライバーで常に実行されます。
自動チェックの例:
- IRQL チェック
- 発生した IRQL (現在の IRQL がターゲット IRQL より小さいことを意味します)。
- 低い IRQL (現在の IRQL がターゲット IRQL を超えているという意味)。
- SpinLocks:
- スピン ロックの二重リリース。
- スピン ロックの取得/リリースは、適切な IRQL で行われます。
- メモリ割り当て:
- ページ プールの割り当て/解放は、適切な IRQL (APC_LEVEL 以下) で行われます。
- ページ以外のプールの割り当て/解放は、適切な IRQL (DISPATCH_LEVEL 以下) で行われます。
- これらのアプリケーション プログラミング インターフェイス (API) にランダム (初期化されていない) 値は指定されません。
- 解放された割り当ては、アクティブなタイマー オブジェクトを指していません。
- ドライバーのアンロード チェック:
- 保留中の DPC やワーカー スレッドなど、アンロード中にドライバーに保留中の操作がないことを確認します。
- その他のドライバーの動作:
- スレッド スタックを不適切に切り替える。
- IRQL >= DISPATCH_LEVEL で KeWaitXxx を呼び出そうとしています。
- 参照カウントが 0 であるオブジェクトを逆参照します。
特別なプール
このオプションがアクティブな場合、ドライバー検証はドライバーのメモリ要求のほとんどを特別なプールから割り当てます。 この特別なプールは、解放された後にアクセスされるメモリ オーバーラン、メモリ アンダーラン、およびメモリを監視します。
強制 IRQL 検査
このオプションがアクティブな場合、ドライバー検証はページング可能なコードを無効にすることにより、ドライバーに極度のメモリ負荷をかけます。 ドライバーが間違った IRQL で、またはスピン ロックを保持しているときにページ メモリにアクセスしようとすると、ドライバー検証はこの動作を検出します。
プールのトラック
このオプションがアクティブな場合、ドライバー検証ツールは、ドライバーがアンロードされたときにすべてのメモリ割り当てを解放したかどうかを確認します。 メモリ リークが明らかになります。
I/O の検証
このオプションがアクティブな場合、ドライバー検証ツールは、特別なプールからドライバーの IRP を割り当て、ドライバーの I/O 処理を監視します。 I/O ルーチンの不正な使用または一貫性のない使用を検出します。
I/O 検証ツールが有効になっている場合:
- IoAllocateIrp を介して割り当てられたすべての IRP は、特殊なプール (使用可能な場合) から割り当てられます。
- ドライバーのエラー メッセージをキャッチするために、IoCallDriver、IoCompleteRequest、IoFreeIrp でチェックが行われます。
- コード DRIVER_VERIFIER_IOMANAGER_VIOLATION (0xC9) を使用して、すべての I/O 検証ツールエラーのバグ チェックを行います。
Note
Windows 7 以降のバージョンの Windows オペレーティング システムでは、拡張 I/O 検証のすべての機能が I/O 検証の一部として含まれており、ドライバー検証マネージャーまたはコマンド ラインから [拡張 I/O 検証] オプションを選択する必要もなくなりました。
デッドロックの検出
このオプションがアクティブな場合、ドライバー検証ツールは、ドライバーによるスピン ロック、ミューテックス、および高速ミューテックスの使用を監視します。 ドライバーのコードが、ある時点でデッドロックを引き起こす可能性があるかどうかを検出します。
拡張 I/O 検証
このオプションがアクティブな場合、ドライバー検証ツールは、いくつかの I/O マネージャー ルーチンの呼び出しを監視し、PnP IRP、電源 IRP、および WMI IRP のストレス テストを実行します。
Note
Windows 7 以降のバージョンでは、拡張 I/O 検証のすべての機能が I/O 検証の一部として含まれています。 このオプションは、ドライバー検証ツール マネージャーまたはコマンド ラインでは使用できなくなりました。また、必須ではありません。
DMA 検証
このオプションがアクティブな場合、ドライバー検証ツールは、ドライバーによる DMA ルーチンの使用を監視します。 DMA バッファー、アダプター、マップ レジスタの不適切な使用を検出します。
セキュリティの検査
このオプションがアクティブな場合、ドライバー検証は、カーネル モード ルーチンによるユーザー モード アドレスへの参照など、セキュリティの脆弱性を引き起こす可能性のある一般的なエラーを探します。
その他の検査
このオプションがアクティブな場合、ドライバー検証は、解放されたメモリの誤った処理など、ドライバー クラッシュの一般的な原因を探します。
DDI 準拠の検査
このオプションがアクティブな場合、ドライバー検証ツールは、ドライバーとオペレーティング システムのカーネル インターフェイス間の適切な相互作用をチェックする一連のデバイス ドライバー インターフェイス (DDI) ルールを適用します。
DDI コンプライアンス チェック オプションは、VerifierExt.sysと呼ばれるカーネル モード ライブラリを使用して実装されます。 いずれかの DDI コンプライアンス チェック規則の違反が見つかった場合、VerifierExt.sysは、システムバグチェックを実行するために呼び出されたモジュールになります。
追加のオプション
これらのオプションは、特定のシナリオ テスト用に設計されているか、極端なストレス状態をシミュレートするために特定の DDI ルーチンに障害や遅延を挿入するオプションです。
ドライバー検証ツールの要件
唯一の要件は、Windows Server 2012 をインストールする必要があるということです。 Windows の製品版と確認済みバージョンの両方でドライバー検証ツールを有効にすることができます。 Norton ウイルス対策がインストールされている場合は、ドライバー検証ツールのデッドロック検出を有効にしないでください。
Enable Driver Verifier (ドライバーの検証ツールの有効化)
Verifier.exeを使用してドライバー検証ツールを有効にすることができます。 Verifier.exeは、Windows のすべてのコピーに含まれています。 System32 フォルダーに自動的にインストールされます。 Verifier.exeにはコマンド ライン インターフェイスとグラフィカル ユーザー インターフェイス (GUI) インターフェイスの両方があるため、ドライバーと適切なレベルの検証を指定できます。 リアルタイムでドライバー検証ツールの統計情報を表示することもできます。 詳細については、「 Driver Verifier Manager (Verifier.exe) 」セクションを参照してください。
ドライバー検証ツール違反のデバッグ
ドライバー検証ツールが違反を検出した場合、標準的な動作は、問題のデバッグに関して可能な限り多くの情報を提供するようにシステムをバグ チェックすることです。 デバッガーに接続されているシステムは、バグ チェックが発生すると停止します。
すべてのドライバー検証ツール違反の結果、バグ チェックが発生します。最も一般的なものは次のとおりです (必ずしもすべてではありません)。
- 0xC1: SPECIAL_POOL_DETECTED_MEMORY_CORRUPTION
- 0xC4: DRIVER_VERIFIER_DETECTED_VIOLATION
- 0xC6: DRIVER_CAUGHT_MODIFYING_FREED_POOL
- 0xC9: DRIVER_VERIFIER_IOMANAGER_VIOLATION
- 0xD6: DRIVER_PAGE_FAULT_BEYOND_END_OF_ALLOCATION
- 0xE6: DRIVER_VERIFIER_DMA_VIOLATION
!analyze -v
は、新しいデバッグ セッションを開始するときに使用する最適なコマンドです。 このコマンドは有用な情報を返し、障害が発生しているドライバーを特定しようとします。
ドライバー検証ツールに固有のデバッガー拡張機能:
!verifier
では、キャプチャされたドライバー検証ツールの統計情報がダンプされます。!verifier -?
は、使用可能なすべてのオプションを表示します。!deadlock
は、デッドロック検出によって追跡されるロックまたはオブジェクトに関連する情報をダンプします。!deadlock -?
は、使用可能なすべてのオプションを表示します。!iovirp [address]
は、I/O 検証ツールによって追跡される IRP に関連する情報をダンプします。!ruleinfo [RuleID]
は、違反した DDI コンプライアンス チェック ルールに関連する情報をダンプします (RuleID は常にバグ チェックの最初の引数であり、すべての DDI コンプライアンス チェック ルール ID は 0x200nn の形式です)。
ドライバー検証ツールとグラフィックス ドライバー
プリンターやディスプレイ ドライバー DLL などの Windows カーネル モードのグラフィックス ドライバーは、プール エントリ ポイントを直接呼び出すことから制限されます。 プールの割り当ては、グラフィックス デバイス ドライバー インターフェイス (DDI) コールバックを使用してWin32k.sysに間接的に実行されます。 たとえば、EngAllocMem は、グラフィックス ドライバーがプール メモリを明示的に割り当てるために呼び出すコールバックです。 EngCreatePalette や EngCreateBitmap などの他の特殊なコールバックでも、プール メモリが返されます。
グラフィックス ドライバーに対して同じ自動テストを提供するために、ドライバー検証機能の一部のサポートがWin32k.sysに組み込まれています。 グラフィックス ドライバーは他のカーネル モード ドライバーよりも制限されているため、ドライバー検証ツール機能のサブセットのみが必要です。 具体的には、IRQL のチェックと I/O 検証は必要ありません。 その他の機能 (特殊なプールの使用、プール割り当てのランダムな失敗、プールの追跡) は、さまざまなグラフィックス DDI コールバックでさまざまな程度までサポートされています。
ランダム エラーは、次のグラフィックス DDI コールバック関数でサポートされています。
- EngAllocMem
- EngAllocUserMem
- EngCreateBitmap
- EngCreateDeviceSurface
- DrvCreateDeviceBitmap
- EngCreatePalette
- EngCreateClip
- EngCreatePath
- EngCreateWnd
- EngCreateDriverObj
- BRUSHOBJ_pvAllocRbrush
- CLIPOBJ_ppoGetPath
また、EngAllocMem では、特別なプールとプールの追跡の使用もサポートされています。
グラフィックス ドライバーのドライバー検証ツールの有効化は、他のドライバーと同じです。 詳細については、「 有効なドライバー検証ツール 」セクションを参照してください。 IRQL チェックなどのサポートされていないフラグは無視されます。 さらに、 !gdikdx.verifier
カーネル デバッガー コマンドを使用して、グラフィックス ドライバーの現在のドライバー検証ツールの状態とプール トレースを調べることができます。
Note
ランダム割り当てエラー設定は、堅牢性テストにのみ使用してください。 この設定を使用すると、レンダリング エラー メッセージが発生する可能性があるため、検証テストでこの設定を使用して、グラフィックス ドライバーの実装の正確性を確認しないでください (たとえば、グラフィックス ドライバーの出力を参照イメージと比較するなど)。
ドライバー検証ツール マネージャー (Verifier.exe)
ドライバー検証ツール (Verifier.exe) は、ドライバー検証ツールの設定を作成および変更したり、ドライバー検証ツールから統計情報を収集したりするための推奨される方法です。 Verifier.exeは、すべての Windows インストールの %WinDir%\System32 フォルダーにあります。
ドライバー検証ツール マネージャーは、ドライバー検証ツールを構成するために Windows に含まれる GUI です。 他のコマンド ライン スイッチを使用せずにverifier.exeを使用して、ドライバー検証ツール マネージャーを起動します。 スイッチを含めると、コマンド ライン ベースのバージョンのユーティリティが使用されます。
ドライバー検証ツールの構成に関するヘルプについては、管理者 CMD ウィンドウから verifier.exe /?
を実行します。
ドライバーの状態
[ドライバーの状態] プロパティ ページには、ドライバー検証ツールの現在の状態の画像が表示されます。 検証ツールが検出するドライバーを確認できます。 状態には、次のいずれかの値を指定できます。
- 読み込み済み: ドライバーは現在読み込まれ、検証されています。
- アンロード済み: ドライバーは現在読み込まれていませんが、コンピューターを再起動してから少なくとも 1 回読み込まれました。
- 読み込まれません: ドライバーが読み込まれませんでした。 この状態は、ドライバーのイメージ ファイルが破損しているか、システムに存在しないドライバー名を指定したことを示すことができます。
リスト ヘッダーを選択して、ドライバーの名前または状態で一覧を並べ替えます。 ダイアログ ボックスの右上の領域で、有効な検証の現在の種類を表示できます。 手動更新モードに切り替えない場合、ドライバーの状態は自動的に更新されます。 更新レートは、ダイアログ ボックスの左下の領域にあるラジオ ボタンを使用して変更できます。 状態を強制的に更新するには、[今すぐ更新] 選択。
特殊プール フラグを有効にし、プール割り当ての 95% 未満が特殊プールに送信された場合、このページに警告メッセージが表示されます。 つまり、確認するドライバーのセットを小さくするか、コンピューターに物理メモリを追加してプール割り当ての検証をより適切にカバーする必要があります。
グローバル カウンター
このプロパティ ページには、ドライバー検証ツールによって管理されている一部のカウンターの現在の値が表示されます。 カウンターの 0 の値は、関連付けられているドライバー検証ツール フラグが有効になっていないことを示すことができます。 たとえば、Other/Faults カウンターの値 0 は、リソース不足シミュレーション フラグが有効になっていないことを示します。 カウンターの値は既定で自動的に更新されるため、検証ツールのアクティビティを監視できます。 ダイアログ ボックスの左下の領域にあるコントロールのグループを使用して、更新レートを変更したり、手動更新に切り替えたり、強制的に更新したりできます。
プールのトラック
このプロパティ ページには、ドライバー検証ツールから収集されたその他の統計情報が表示されます。 このページに表示されるすべてのカウンターは、検証ツールのプール追跡フラグに関連しています。 そのほとんどは、現在の割り当て、現在割り当てられたバイトなど、ドライバーごとのカウンターです。 その特定のドライバーのカウンターを表示するには、上部の組み合わせボックスからドライバー名を選択する必要があります。
設定
このページを使用して、ドライバー検証ツールの設定を作成および変更できます。 設定はレジストリに保存され、設定を有効にするにはコンピューターを再起動する必要があります。 この一覧を使用して、現在インストールされているドライバーを表示できます。 各ドライバーは、次のいずれかの状態にすることができます。
- 有効な検証: ドライバーは現在検証されています。
- 無効の確認: ドライバーは現在検証されていません。
- 有効 (再起動が必要) の確認: ドライバーは、次回の再起動後にのみ検証されます。
- 無効の確認 (再起動が必要): ドライバーは現在検証されていますが、次回の再起動後は検証されません。
一覧から 1 つまたは複数のドライバーを選択し、一覧の下にある 2 つのボタンを使用して状態を切り替えることができます。 また、ドライバー名を右クリックしてコンテキスト メニューを表示することもできます。これにより、状態の切り替えが実行されます。
ダイアログ ボックスの下部で、次の再起動後に検証するドライバーを (スペースで区切って) 指定できます。 この編集コントロールは、通常、まだ読み込まれていない新しいドライバーをインストールする場合に使用します。
一覧の上部にあるラジオ ボタン グループが Verify all drivers に設定されている場合、リストと [確認] ボタンと [検証しない] ボタンと編集コントロールは使用できません。 これは、次回の再起動後に、システム内のすべてのドライバーが検証されることを意味します。
確認の種類は、ダイアログ ボックスの右上の領域にあるチェック ボックスを使用して設定できます。 I/O 検証は、レベル 1 またはレベル 2 で有効にすることができます。 レベル 2 の検証は、レベル 1 よりも強力です。
Apply を選択して、設定の変更を保存します。 このページには、さらに 2 つのボタンがあります。
- 優先設定: 一般的に使用される設定 (すべてのドライバーが検証済み) を選択します。
- すべてリセット: ドライバーが検証されないよう、すべてのドライバー検証ツールの設定がクリアされます。
Applyを選択した後、コンピューターを再起動して変更を有効にする必要があります。
揮発性の設定
このプロパティ ページを使用すると、ドライバー検証ツールのフラグをすぐに変更できます。 一部のドライバー検証ツール フラグの状態のみを切り替えることができます。 また、検証対象のドライバーの一覧を変更することはできません。 一部のチェック ボックスの状態を変更した後、 Apply を選択して変更を有効にします。 変更はすぐに有効になります。 また、追加の変更を加えるまで、またはコンピューターを再起動するまで続きます。
コマンド ライン インターフェイス
コマンド ラインからVerifier.exeを実行することもできます (詳細については、コマンド プロンプトで「/?verifier.exe」と入力します)。 コマンド ラインでは、次のように複数のスイッチを使用できます。
Verifier.exe /flags 0x209BB /driver MyDriver1.sys MyFilterDriver1.sys
次の一覧は、最も一般的に使用されるコマンド ライン フラグを示しています。
オプションの構成 (フラグ)
/flags value のverifier.exe
Value は、有効にするフラグの集合値を表す 16 進数 ( 0x プレフィックスが必要です) です。 各フラグの値は、
verifier /?
出力に表示されます。標準フラグ:
0x00000000: 自動チェック
0x00000001: 特別なプール
0x00000002: IRQL チェックを強制する
0x00000008: プールの追跡
0x00000010: I/O 検証
0x00000020: デッドロック検出
0x00000080: DMA チェック
0x00000100: セキュリティ チェック
0x00000800: その他のチェック
0x00020000: DDI コンプライアンス チェックその他のフラグ:
0x00000004: ランダム化された低リソース シミュレーション
0x00000040: 拡張 I/O 検証 (Vista のみ)
0x00000200: 保留中の I/O 要求を強制する
0x00000400: IRP ログ
0x00002000: インバリアント MDL でのスタックのチェック
0x00004000: Driver0x00008000 の不変 MDL チェック: Power Framework 遅延ファジーたとえば、特殊なプール、I/O 検証、およびその他のチェックのみを有効にするには、次のようにします。
verifier.exe /flags 0x811
すべての標準設定を有効にするには (いずれかの例が機能します)。
verifier.exe /standard
verifier.exe /flags 0x209BB
検証するドライバーを構成する
verifier.exe /driver driver1.sys [driver2.sys driver3.sys ...]
このコマンドは、検証する特定のドライバーを指定します。 スペース区切りの一覧に追加のドライバーを指定します。
verifier.exe /all
このコマンドは、システム内のすべてのドライバーを検証します。
揮発性モードを使用して構成する
verifier.exe /volatile /flags *value /adddriver MyDriver1.sys*
このコマンドは、検証ツールフラグを直ちに変更し、検証のためにMyDriver1.sysを追加します。
現在の検証ツールの統計を照会する
verifier /query
現在のドライバー検証ツールの状態とカウンターを標準出力にダンプします。
現在の検証ツールの設定に対してクエリを実行する
verifier /querysettings
現在のドライバー検証ツールの設定を標準出力にダンプします。
検証ツールの設定をクリアする
verifier.exe /reset
このコマンドは、現在のドライバー検証ツールの設定をすべて消去します。
ドライバー開発者向けの追加情報
以下のセクションでは、ドライバーの開発者にとって重要なドライバー検証ツールの設定について詳しく説明します。 これらの設定は、一般に IT プロフェッショナルには必要ありません。
重要
このセクション、方法、またはタスクには、レジストリの編集方法が記載されています。 レジストリを誤って変更すると、深刻な問題が発生することがあります。 したがって、次の手順を注意深く実行してください。 保護のために、レジストリを変更する前に、バックアップします。 その後、問題が起こった場合は、レジストリを復元できます。 レジストリのバックアップと復元方法の詳細は、「Windows のレジストリのバックアップおよび復元の方法」を参照してください。
レジストリを編集してドライバー検証ツールを有効にするには、次の手順に従います。
レジストリ エディター (Regedt32) を起動します。
次のレジストリ キーを見つけます。
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management\VerifyDrivers
REG_SZ
キーを編集します。
REG_SZ
キーを、テストするドライバーの大文字と小文字を区別しない名前に設定します。 複数のドライバーを指定できますが、使用できるドライバーは 1 つだけです。 そうすることで、使用可能なシステム リソースが途中で使い果たされないようにすることができます。 リソースの早期枯渇はシステムの信頼性の問題を引き起こしませんが、一部のドライバー チェックがバイパスされる可能性があります。
次の一覧は、 REG_SZ
キーの値の例を示しています。
- Ntfs.sys
- Win32k.sys ftdisk.sys
- *.sys
ドライバー検証のレベルは、次のレジストリ キーで指定できます。
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management\VerifyDriverLevel
キーの値は、有効になっているすべてのフラグのコレクションを表す DWORD です。