ドライバーの検証ツールを使用して、高度なユーザー Windowsドライバーに関する問題を特定する

ドライバー検証ツールは、2000 以降のすべてのバージョンWindowsに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 で KeWaitXxx を呼び出>= DISPATCH_LEVEL。
    • 既に参照カウントが 0 のオブジェクトを逆参照します。

特別なプール

このオプションがアクティブな場合、ドライバー検証ツールは、特別なプールからドライバーのメモリ要求のほとんどを割り当てる。 この特別なプールは、解放後にアクセスされるメモリ オーバーラン、メモリ アンダーラン、およびメモリについて監視されます。

IRQL チェックの強制

このオプションがアクティブな場合、ドライバー検証ツールは、ページ可能なコードを無効にすることで、ドライバーに極端なメモリの圧力をかかします。 ドライバーが間違った IRQL でページ メモリにアクセスしようとした場合、またはスピン ロックを保持している間に、ドライバー検証ツールは、この動作を検出します。

プールの追跡

このオプションがアクティブな場合、ドライバー検証ツールは、ドライバーがアンロード時にメモリ割り当てを解放したのか確認します。 メモリ リークが明らかになります。

I/O 検証

このオプションがアクティブな場合、ドライバー検証ツールは特別なプールからドライバーの ISP を割り当て、ドライバーの I/O 処理を監視します。 I/O ルーチンの不正または一貫性のない使用を検出します。

I/O 検証ツールが有効になっている場合:

  • IoAllocateIrp を介して割り当てられたすべての ISP は、使用可能な場合は特別なプールから割り当てされます。
  • ドライバーのエラー メッセージをキャッチするために、IoCallDriver、IoCompleteRequest、および IoFreeIrp でチェックが行います。
  • すべての I/O 検証ツールで、コード コード (DRIVER_VERIFIER_IOMANAGER_VIOLATION) を0xC9。

注意

Windows オペレーティング システムの Windows 7 以降のバージョンでは、拡張 I/O 検証のすべての機能が I/O 検証の一部として含まれており、ドライバー検証ツール マネージャーまたはコマンド ラインで拡張 I/O 検証オプションを選択する必要もなくなりました。

デッドロック検出

このオプションがアクティブな場合、ドライバー検証ツールは、ドライバーによるスピン ロック、ミューテックス、および高速ミュートの使用を監視します。 ドライバーのコードが、ある時点でデッドロックを引き起こす可能性がある場合に検出します。

拡張 I/O 検証

このオプションがアクティブな場合、Driver Verifier は、複数の I/O マネージャー ルーチンの呼び出しを監視し、PnP IPS、Power IRP、WMI IP のストレス テストを実行します。

注意

7 Windows以降のバージョンでは、拡張 I/O 検証のすべての機能が I/O 検証の一部として含まれています。 このオプションは、ドライバー検証ツール マネージャーまたはコマンド ラインで使用できなくなったか、必須ではありません。

DMA 検証

このオプションがアクティブな場合、ドライバー検証ツールは、ドライバーの DMA ルーチンの使用を監視します。 DMA バッファー、アダプター、およびマップ レジスタの不適切な使用を検出します。

セキュリティ チェック

このオプションがアクティブな場合、ドライバー検証ツールは、カーネル モード ルーチンによるユーザー モード アドレスへの参照など、セキュリティの脆弱性が発生する可能性がある一般的なエラーを検出します。

その他のチェック

このオプションがアクティブな場合、ドライバー検証ツールは、解放されたメモリの誤った処理など、ドライバーがクラッシュする一般的な原因を探します。

DDI コンプライアンスチェック

このオプションがアクティブな場合、Driver Verifier は、ドライバーとオペレーティング システムのカーネル インターフェイス間の適切な相互作用をチェックする一連のデバイス ドライバー インターフェイス (DDI) ルールを適用します。

DDI コンプライアンスチェック オプションは、カーネル モード ライブラリ (カーネル モード ライブラリ) を使用して実装VerifierExt.sys。 DDI コンプライアンス チェック ルールの 1 つが違反している場合、VerifierExt.sysがシステム バグ チェックを実行するために呼び出されたモジュールになります。

追加オプション

これらのオプションは、特定のシナリオ テスト用に設計されています。または、極端なストレス状態をシミュレートするために、特定の DDI ルーチンにエラーや遅延を挿入するオプションです。

ドライバー検証ツールの要件

唯一の要件は、インストールする必要Windows Server 2012。 ドライバー検証ツールは、製品版とチェック済みバージョンの両方で有効にWindows。 ノートン ウイルス対策がインストールされている場合は、ドライバー検証ツールのデッドロック検出を有効にしません。

ドライバー検証ツールを有効にする

ドライバーの検証ツールを有効にするには、次の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 です)。

ドライバーの検証ツールとグラフィックス ドライバー

Windowsドライバー DLL などのカーネル モード グラフィックス ドライバーは、プール エントリ ポイントを直接呼び出すのを制限されます。 プールの割り当ては、グラフィックス デバイス ドライバー インターフェイス (DDI) コールバックを使用して間接的に実行Win32k.sys。 たとえば、EngAllocMem は、明示的にプール メモリを割り当てるグラフィックス ドライバーが呼び出すコールバックです。 EngCreatePalette や EngCreateBitmap などのその他の特殊なコールバックも、プール メモリを返します。

グラフィックス ドライバーに対して同じ自動テストを提供するために、ドライバー検証機能の一部のサポートは、一部のドライバー検証ツールに組み込Win32k.sys。 グラフィックス ドライバーは、他のカーネル モード ドライバーよりも制限が大きいので、ドライバー検証機能のサブセットのみが必要です。 具体的には、IRQL チェックと I/O 検証は不要です。 その他の機能、つまり特別なプールの使用、プール割り当てのランダムな失敗、およびプールの追跡は、さまざまなグラフィックス DDI コールバックでさまざまな程度にサポートされます。

ランダムエラーは、次のグラフィックス DDI コールバック関数でサポートされています。

  • EngAllocMem
  • EngAllocUserMem
  • EngCreateBitmap
  • EngCreateDeviceSurface
  • EngCreateDeviceBitmap
  • EngCreatePalette
  • EngCreateClip
  • EngCreatePath
  • EngCreateWnd
  • EngCreateDriverObj
  • BRUSHOBJ_pvAllocRbrush
  • CLIPOBJ_ppoGetPath

また、EngAllocMem では、特別なプールとプールの追跡の使用がサポートされています。

グラフィックス ドライバーのドライバー検証ツールの有効化は、他のドライバーと同じです。 詳細については、「ドライバー検証ツールを有効 にする」セクションを参照 してください。 IRQL チェックなどのサポートされていないフラグは無視されます。 さらに、カーネル デバッガー コマンドを使用して、グラフィックス ドライバーの現在のドライバー検証ツールの状態と !gdikdx.verifier プール のトレースを調べできます。

注意

堅牢性テストでは、ランダム割り当てエラー設定のみを使用する必要があります。 この設定を使用すると、レンダリング エラー メッセージが表示される可能性があります。この設定を検証テストと一緒に使用して、グラフィックス ドライバーの実装の正しさ (たとえば、グラフィックス ドライバーの出力と参照イメージを比較する) を確認する必要があります。

ドライバー検証ツール マネージャー (Verifier.exe)

ドライバー検証ツール (Verifier.exe) は、ドライバー検証ツールの設定を作成および変更し、ドライバー検証ツールから統計情報を収集するための推奨される方法です。 Verifier.exeインストールごとに %WinDir%\System32 フォルダー Windowsされます。

ドライバー検証ツール マネージャーは、ドライバー検証ツールを構成Windowsに含まれる GUI です。 他のコマンド ライン スイッチを使用せずに、verifier.exeを使用してドライバー検証ツール マネージャーを起動します。 スイッチが含まれるたびに、コマンド ライン ベースのバージョンのユーティリティが使用されます。

ドライバー検証ツールの構成に関するヘルプについては、管理者 verifier.exe /? の CMD ウィンドウから実行します。

ドライバーの状態

[ドライバーの状態] プロパティ ページには、ドライバー検証ツールの現在の状態のイメージが表示されます。 検証ツールが検出するドライバーを確認できます。 状態には、次のいずれかの値を指定できます。

  • 読み込み: ドライバーは現在読み込まれ、検証されています。
  • アンロード: ドライバーは現在読み込まれませんが、コンピューターを再起動した後、少なくとも 1 回は読み込まれます。
  • 読み込まれたことがない: ドライバーが読み込まれたことがない。 この状態は、ドライバーのイメージ ファイルが破損しているか、システムに存在しないドライバー名を指定した可能性があります。

リスト ヘッダーを選択して、リストをドライバー名または状態で並べ替える。 ダイアログ ボックスの右上の領域で、有効な検証の現在の種類を表示できます。 手動更新モードに切り替えない場合、ドライバーの状態は自動的に更新されます。 ダイアログ ボックスの左下の領域にあるラジオ ボタンを使用して、更新速度を変更できます。 状態を強制的に更新するには、[今すぐ更新] を選択します

特別なプール フラグを有効にし、プール割り当ての 95% 未満が特別なプールに移動した場合、このページに警告メッセージが表示されます。 つまり、プール割り当ての検証をより適切にカバーするには、より小さなドライバー セットを選択して確認するか、コンピューターに物理メモリを追加する必要があります。

グローバル カウンター

このプロパティ ページには、ドライバー検証ツールによって管理されている一部のカウンターの現在の値が表示されます。 カウンターの値が 0 の場合、関連付けられた Driver Verifier フラグが有効になっていない可能性があります。 たとえば、Other/Faults カウンターの 値 0 は、低リソース シミュレーション フラグが有効になっていないと示します。 カウンターの値は既定で自動的に更新されますので、検証ツールのアクティビティを監視できます。 ダイアログ ボックスの左下の領域にあるコントロールのグループを使用して、更新速度の変更、手動更新への切り替え、または強制的な更新を行えます。

プールの追跡

このプロパティ ページには、ドライバー検証ツールから収集された統計情報が表示されます。 このページに表示されるカウンターはすべて、検証ツールのプール追跡フラグに関連しています。 ほとんどのカウンターは、現在の割り当て、現在の割り当てられたバイトなど、ドライバーごとのカウンターです。 その特定のドライバーのカウンターを表示するには、上部の組み合わせボックスからドライバー名を選択する必要があります。

設定

このページを使用して、ドライバー検証ツールの設定を作成および変更できます。 設定はレジストリに保存され、設定を有効にするためにコンピューターを再起動する必要があります。 リストを使用して、現在インストールされているドライバーを表示できます。 各ドライバーは、次のいずれかの状態にできます。

  • [有効] の確認: ドライバーが現在検証されています。
  • [無効] を確認する: ドライバーは現在検証されません。
  • 有効 (再起動が必要) を確認する: ドライバーは、次回の再起動後にのみ確認されます。
  • 無効 (再起動が必要) を確認する: ドライバーは現在検証されますが、次回の再起動後は確認されません。

リストから 1 つ以上のドライバーを選択し、リストの下にある 2 つのボタンを使用して状態を切り替えます。 ドライバー名を右クリックしてコンテキスト メニューを表示し、状態の切り取りを実行することもできます。

ダイアログ ボックスの下部で、次の再起動後に確認するドライバーを (スペースで区切って) 指定できます。 通常、この編集コントロールは、読み込み済みではない新しいドライバーをインストールする場合に使用します。

リストの上部にあるラジオ ボタン グループが [すべてのドライバーを確認する] に設定されている場合、リストと [検証] ボタンと [検証しない] ボタンと編集コントロールは使用できません。 つまり、次回の再起動後、システム内のすべてのドライバーが確認されます。

確認の種類は、ダイアログ ボックスの右上隅のチェック ボックスを使用して設定できます。 レベル 1 またはレベル 2 で I/O 検証を有効にできます。 レベル 2 の検証は、レベル 1 より強力です。

[適用] を選択して、設定に対する変更を 保存します。 このページには、次の 2 つのボタンがあります。

  • 優先設定: 一般的に使用される設定 (すべてのドライバーが検証済み) を選択します。
  • すべてリセット: すべてのドライバー検証ツールの設定がクリアされ、ドライバーが検証されません。

[適用] を選択 した後、変更を有効にするためにコンピューターを再起動する必要があります。

揮発性の設定

このプロパティ ページを使用すると、ドライバー検証ツールのフラグを直ちに変更できます。 一部のドライバー検証ツール フラグの状態のみを切り替えできます。 また、検証中のドライバーの一覧を変更できない。 一部のチェック ボックスの状態を変更した後で、[ 適用 ] を選択して変更を有効にします。 変更は直ちに有効になります。 また、追加の変更を行うまで、またはコンピューターを再起動するまで続くものになります。

コマンド ライン インターフェイス

コマンド ラインからVerifier.exe実行することもできます (詳細については 、「/」 とverifier.exeします。 コマンド プロンプトで)。 コマンド ラインでは、次の複数のスイッチを使用できます。

Verifier.exe /flags 0x209BB /driver MyDriver1.sys MyFilterDriver1.sys

次の一覧は、最もよく使用されるコマンド ライン フラグを示しています。

オプション (フラグ) の構成

  • verifier.exe /flags

    は、有効にするフラグの集合値を表す 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。

レジストリを編集してドライバー検証ツールを有効にするには、次の手順を実行します。

  1. レジストリ エディター (Regedt32) を起動します。

  2. 次のレジストリ キーを見つけます。

    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management\VerifyDrivers

  3. キーを 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 です。