ドライバー検証ツールを使用して、上級ユーザー向けの 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 を実行するために管理者特権が必要です。

ドライバー検証ツールは、ドライバーの動作のさまざまな側面をチェックできます。 これらの機能は、フラグを使用して有効にするオプションまたは設定にグループ化されます。 (用語オプション、設定、フラグは、通常、ドライバー検証ツールのドキュメントで交換可能です。これらは同様の概念を表します)。

各フラグの詳細については、「 ドライバー検証ツールのオプションとルール クラス」を参照してください。

標準オプション

次のオプションは、システム内のすべてのドライバーが違反してはならないルールを一緒に表します。 これらのオプションは、ドライバー検証ツール GUI で標準設定を有効にするか、コマンド ラインを使用してドライバー検証ツールを /standard 構成するときにスイッチを指定するときに有効になります。

自動チェック

これらのチェックは、選択されているオプションに関係なく、検証されているドライバーで常に実行されます。

自動チェックの例:

  • IRQL チェック
    • 発生した IRQL (現在の IRQL がターゲット IRQL より小さいことを意味します)。
    • 低い IRQL (現在の IRQL がターゲット IRQL を超えています)。
  • スピンロック:
    • スピン ロックの二重解放。
    • スピン ロックの取得/リリースは、適切な IRQL で行われます。
  • メモリ割り当て:
    • ページ プールの割り当て/解放は、正しい IRQL (APC_LEVEL 以下) で行われます。
    • ページ以外のプール割り当て/空き時間は、正しい IRQL (DISPATCH_LEVEL 以下) で行われます。
    • これらのアプリケーション プログラミング インターフェイス (API) にランダム (初期化されていない) 値は指定されません。
    • 解放された割り当ては、アクティブなタイマー オブジェクトを指していません。
  • ドライバーのアンロード チェック:
    • 保留中の DPC やワーカー スレッドなど、アンロード中にドライバーに保留中の操作がないことを確認します。
  • その他のドライバーの動作:
    • スレッド スタックを不適切に切り替える。
    • IRQL >= DISPATCH_LEVELで KeWaitXxx を呼び出そうとしています。
    • 参照カウントが 0 であるオブジェクトを逆参照します。

特別プール

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

IRQL チェックを強制する

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

プールの追跡

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

I/O 検証

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

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

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

注:

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

デッドロック検出

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

拡張 I/O 検証

このオプションがアクティブな場合、ドライバー検証ツールは、いくつかの I/O マネージャー ルーチンの呼び出しを監視し、PnP IRP、電源 IRP、WMI IRP のストレス テストを実行します。

注:

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

DMA 検証

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

セキュリティ チェック

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

その他のチェック

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

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

このオプションがアクティブな場合、ドライバー検証ツールは、オペレーティング システムのドライバーとカーネル インターフェイスの間の適切な相互作用のためにチェックデバイス ドライバー インターフェイス (DDI) 規則のセットを適用します。

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

追加オプション

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

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

唯一の要件は、Windows Server 2012をインストールする必要があるということです。 Windows の製品版と確認済みバージョンの両方でドライバー検証ツールを有効にすることができます。 Norton ウイルス対策がインストールされている場合は、ドライバー検証ツールのデッドロック検出を有効にしないでください。

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

ドライバー検証ツールを有効にするには、Verifier.exe を使用します。 Verifier.exe は、Windows のすべてのコピーに含まれています。 System32 フォルダーに自動的にインストールされます。 Verifier.exe には、コマンド ライン ユーザー インターフェイスとグラフィカル ユーザー インターフェイス (GUI) インターフェイスの両方があるため、ドライバーと適切な検証レベルを指定できます。 また、ドライバー検証ツールの統計情報をリアルタイムで確認することもできます。 詳細については、「 ドライバー検証ツール マネージャー (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
  • EngCreateDeviceBitmap
  • EngCreatePalette
  • EngCreateClip
  • EngCreatePath
  • EngCreateWnd
  • EngCreateDriverObj
  • BRUSHOBJ_pvAllocRbrush
  • CLIPOBJ_ppoGetPath

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

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

注:

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

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

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

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

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

ドライバーの状態

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

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

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

[特別なプール] フラグを有効にし、プール割り当ての 95% 未満が特別なプールに送信された場合、このページに警告メッセージが表示されます。 つまり、検証するドライバーのセットを小さくするか、コンピューターに物理メモリを追加してプール割り当ての検証のカバレッジを向上させる必要があります。

グローバル カウンター

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

プールの追跡

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

Settings

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

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

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

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

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

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

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

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

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

揮発性の設定

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

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

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

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

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

オプション (フラグ) を構成する

  • /flags を verifier.exe する

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

    このコマンドは、システム内のすべてのドライバーを検証します。

  • Volatile モードを使用して構成する

    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 です。