Driver Verifier を使用して Windows ドライバをトラブルシューティングする方法

文書翻訳 文書翻訳
文書番号: 244617 - 対象製品
この記事は、以前は次の ID で公開されていました: JP244617
重要 : この資料には、レジストリの編集方法が記載されています。万一に備えて、編集の前には必ずレジストリをバックアップし、レジストリの復元方法を理解しておいてください。バックアップ、復元、および編集方法の詳細を参照するには、以下の「サポート技術情報」 (Microsoft Knowledge Base) をクリックしてください。
256986 Microsoft Windows レジストリの説明
すべて展開する | すべて折りたたむ

目次

概要

Windows 2000、Windows XP、および Windows Server 2003 に付属する Driver Verifier は、安定性と信頼性の強化に役立ちます。このツールを使用して、ドライバに関する問題のトラブルシューティングを行うことができます。以前のバージョンの WDM (Windows Driver Model) ドライバなどの適切でないドライバを使用すると、Windows カーネル モードのコンポーネントにより、システム障害やシステム エラーが発生する可能性があります。この資料では、Driver Verifier を使用して、システムからドライバを切り離し、トラブルシューティングを行う方法について説明します。

詳細

この資料では、次の項目について説明します。
  • Driver Verifier の機能
  • I/O Verifier
  • Driver Verifier の要件
  • Driver Verifier の有効化
  • Driver Verifier 違反のデバッグ
  • Driver Verifier とグラフィック ドライバ
  • Driver Verifier Manager (Verifier.exe)
  • グローバル カウンタ
  • プールのトラック
  • 設定
  • 一時的な設定
  • コマンド ライン インターフェイス
  • ドライバ開発者向けの関連情報

Driver Verifier の機能

Driver Verifier を使用するには、Verifier.exe を実行してコンピュータを再起動します。この操作のみで、システム内のドライバの分析を開始できます。

Driver Verifier には、以下の機能が用意されています。

プール割り当て

ドライバのプール割り当てでは、可能な限り特別なプールを使用します。プール割り当てをシステムの他の部分と共有するのではなく、ドライバの割り当てを分離して、アクセス許可を "アクセスなし" に設定します。この機能により、ドライバがプールの容量を超えて割り当てを行った結果、システムが破損したり不安定になったりするかどうかを検出できます。十分な物理メモリと仮想メモリを備えたコンピュータでこの機能を有効にすると、ドライバによるすべての割り当てが自動的に特別なプールにリダイレクトされます。

メモリ不足状態の作成

他のドライバに影響を与えずに、特定のドライバに対してメモリ不足状態を作成できます (システムのメモリ サイズは関係ありません)。この状態は、メモリ管理システムに指示して、ドライバのページング可能なコードおよびデータと、システムのページ プール、コード、およびデータをすべて無効にすることで実現できます。これにより、適切ではないスピン ロックを保持するドライバや、IRQL (Internal ReQuest Level) を高めてページ コードまたはデータにアクセスするドライバを検出できます。この機能を使用すると、断続的に発生する問題を検出し、その原因を分離できます。

パラメータの検証

ドライバによってスピン ロック、IRQL、およびプール割り当てが呼び出されると、必ずパラメータの自動検証が行われます。この場合、以下の項目がチェックされます。
  • 高いはずの IRQL が実際に高いかどうか (現在の IRQL が対象となる IRQL より低いかどうか)
  • 低いはずの IRQL が実際に低いかどうか
  • スピン ロックの二重解放
  • スピン ロックの取得と解放が適切な IRQL で実行されたかどうか
  • ページ プールの割り当てと解放が適切な IRQL (APC_LEVEL またはそれ以下) で実行されたかどうか
  • 非ページ プールの割り当てと解放が適切な IRQL (DISPATCH_LEVEL またはそれ以下) で実行されたかどうか
  • アプリケーション プログラミング インターフェイス (API) にランダムな未初期化の値が指定されていないかどうか

プール割り当てに意図的なエラーを挿入する

ドライバで MUST_SUCCEED とマークされていないプール割り当てをランダムに失敗させることができます。これにより、ドライバがメモリ不足の状況に適切に対応できるかどうかを確認します。

解放されたプール

解放されたプール割り当て内に、保留中のタイマがないことを確認します。このようなタイマが存在すると、システム クラッシュの原因究明がきわめて困難になります。

プール リークの検出

ドライバによるすべてのプール割り当てが自動的に追跡されます。ドライバがアンロードされるときに、解放されていない割り当てが検出されると、バグ チェックが行われます。!verifier 3 カーネル デバッガ コマンドを使用して、すべての未解放の割り当てを表示できます。また、ドライバをアンロードする前にこのコマンドを使用して、任意の時点でドライバが保持している未解放の割り当てを表示することもできます。

ドライバのアンロード チェック

ドライバのアンロード チェックを実行すると、アンロードしても使用中のリソースがクリーンアップされないドライバを検出できます。この機能を使用すると、ドライバをアンロードした直後に、システムでバグ チェックが行われる可能性が高くなります。たとえば、参照リスト、保留中の遅延プロシージャ呼び出し (DPC)、ワーカー スレッド、キュー、タイマなどのリソースは解放されないことがあります。

I/O Verifier

Verifier ツールまたは VerifyDriverLevel レジストリ キーを使用して、I/O Verifier フラグを有効にすると、I/O マネージャによるいくつかの検証が有効になります。詳細については、この資料の「Driver Verifier の有効化」を参照してください。このフラグを有効にすると、次の処理が行われます。
  • IoAllocateIrp を介したすべての IRPs 割り当てに、特別なプールが使用されます。
  • IoCallDriver、IoCompleteRequest、および IoFreeIrp がチェックされ、ドライバのエラー メッセージがキャッチされます。
  • コード DRIVER_VERIFIER_IOMANAGER_VIOLATION (0xC9) により、I/O Verifier のすべての失敗に関するバグ チェックが行われます。

Driver Verifier の要件

Windows 2000、Windows XP、または Windows Server 2003 がインストールされていれば、他には何も必要ありません。Driver Verifier は、製品版およびチェック バージョンの Windows の両方で有効にすることができます。運用サーバーで Driver Verifier Manager を有効にする前の考慮事項については、「サポート技術情報」 (Microsoft Knowledge Base) の資料 251233 を参照してください。「サポート技術情報」 (Microsoft Knowledge Base) の資料 325672 に記載されている推奨事項により、Norton Antivirus がインストールされている場合は Driver Verifier のデッドロック検出機能を有効にしないでください。

Driver Verifier の有効化

Verifier.exe を使用して、Driver Verifier を有効にできます。 Verifier.exe はすべての Windows に付属しており、System32 フォルダに自動的にインストールされます。Verifier.exe はコマンド ラインとグラフィカル ユーザー インターフェイス (GUI) の両方で使用できるため、検証するドライバと検証の適切なレベルを指定できます。また、Driver Verifier の統計情報をリアルタイムに表示することもできます。詳細については、この資料の「Driver Verifier Manager (Verifier.exe)」を参照してください。

Driver Verifier 違反のデバッグ

カーネル デバッガの !verifier コマンドまたは Verifier.exe ツールを使用すると、現在の Driver Verifier の構成と統計情報をリアルタイムに表示できます。

Driver Verifier 違反が発生すると、必ずバグ チェックが行われます。次に、代表的な違反の一部を示します。
  • IRQL_NOT_LESS_OR_EQUAL 0xA
  • PAGE_FAULT_IN_NONPAGED_AREA 0x50
  • PAGE_FAULT_IN_NONPAGED_AREA 0x50
  • ATTEMPTED_WRITE_TO_READONLY_MEMORY 0xBE
  • SPECIAL_POOL_DETECTED_MEMORY_CORRUPTION 0xC1
  • DRIVER_VERIFIER_DETECTED_VIOLATION 0xC4
  • DRIVER_CAUGHT_MODIFYING_FREED_POOL 0xC6
  • TIMER_OR_DPC_INVALID 0xC7
  • DRIVER_VERIFIER_IOMANAGER_VIOLATION 0xC9

Driver Verifier とグラフィック ドライバ

Windows のカーネル モード グラフィック ドライバ (プリンタ ドライバ DLL やディスプレイ ドライバ DLL など) から、プールのエントリ ポイントを直接呼び出すことはできません。代わりに、Win32k.sys へのグラフィック デバイス ドライバ インターフェイス (DDI) コールバックを使用して、間接的にプール割り当てを実行します。たとえば、グラフィック ドライバでプール メモリを明示的に割り当てる際には、EngAllocMem というコールバックを呼び出します。また、EngCreatePalette や EngCreateBitmap などの特定用途のコールバックからも、プール メモリが返されます。

グラフィック ドライバに対する同種のテストを自動化するために、一部の Driver Verifier 機能に対するサポートが Win32k.sys に組み込まれています。ただし、グラフィック ドライバは他のカーネル モードのドライバよりも厳しく制限されているため、必要なのは Driver Verifier 機能の一部のみです。特に、IRQL 検査と I/O の確認は不要です。この他の機能、つまり特別なプールの使用、プール割り当てのランダムな失敗、およびプールのトラックは、各グラフィック DDI コールバックによってさまざまなレベルでサポートされます。

ランダムな失敗は、次のグラフィック DDI コールバック関数でサポートされます。
  • EngAllocMem
  • EngAllocUserMem
  • EngCreateBitmap
  • EngCreateDeviceSurface
  • EngCreateDeviceBitmap
  • EngCreatePalette
  • EngCreateClip
  • EngCreatePath
  • EngCreateWnd
  • EngCreateDriverObj
  • BRUSHOBJ_pvAllocRbrush
  • CLIPOBJ_ppoGetPath
また、特別なプールの使用とプールのトラックは、EngAllocMem でサポートされます。

Driver Verifier をグラフィック ドライバに対して有効にする方法は、他のドライバの場合と同じです。詳細については、この資料の「Driver Verifier の有効化」を参照してください。IRQL 検査などのサポートされていないフラグは無視されます。また、!gdikdx.verifier カーネル デバッガ コマンドを使用すると、Driver Verifier の現在の状態とグラフィック ドライバのプール トレースを確認できます。

: 割り当てのランダムな失敗の機能は、信頼性をテストする目的以外では使用しないでください。この機能によってエラー メッセージが表示されることがあるため、この機能を有効にした状態で、グラフィック ドライバの実装の正確さを確認する検証テストは実行しないでください。たとえば、グラフィック ドライバの出力を参照イメージと比較するテストは実行できません。

Driver Verifier Manager (Verifier.exe)

Driver Verifier 設定の作成や変更、および Driver Verifier の統計情報の収集には、Driver Verifier Manager ツール (Verifier.exe) の使用をお勧めします。Verifier.exe は、すべての Windows インストールの %WinDir%\System32 フォルダにあります。このツールは、Windows Server 2003 では "ドライバ検証マネージャ" と呼ばれます。

ドライバの状態

[Driver Status] プロパティ ページでは、Driver Verifier の現在の状態の概要が示され、Verifier が検出対象としているドライバを確認できます。状態は、以下のいずれかになります。
  • Loaded : このドライバは現在読み込まれ、検証されています。
  • Unloaded : 現在このドライバは読み込まれていませんが、コンピュータの再起動後に少なくとも一度は読み込まれました。
  • Never Loaded : このドライバは一度も読み込まれていません。ドライバのイメージ ファイルが破損しているか、システムに存在しないドライバ名を指定した可能性があります。
一覧のヘッダーをクリックして、ドライバ名または状態で一覧を並べ替えることができます。ダイアログ ボックスの右上には、現在有効になっている検証の種類が表示されます。[Refresh frequency] の [Manual] をクリックしていない場合、ドライバの状態は自動的に更新されます。ダイアログ ボックスの左下にあるオプション ボタンを使用して、更新間隔を変更できます。また、[Refresh Now] をクリックすると、強制的に状態を更新できます。

Special pool フラグを有効にした場合、プール割り当ての 95% 未満のみが特別なプールにリダイレクトされるときは、このページに警告メッセージが表示されます。その場合は、より小規模なドライバ セットを選択して検証するか、コンピュータに物理メモリを追加してプール割り当て検証を行う範囲を拡大する必要があります。

グローバル カウンタ

[Global Counters] プロパティ ページには、Driver Verifier に保持されている一部のカウンタの現在の値が表示されます。カウンタの値が 0 の場合は、関連付けられた Driver Verifier フラグが無効になっています。たとえば、[Other] の [Faults injected] カウンタの値が 0 の場合は、低リソース シミュレーション フラグが無効になっています。デフォルトでは、カウンタの値が自動的に更新されるため、Verifier の動作を監視できます。ダイアログ ボックスの左下にあるコントロール グループを使用すると、更新間隔の変更、手動リフレッシュ モードへの切り替え、または強制更新を行うことができます。

プールのトラック

[Pool Tracking] プロパティ ページには、Driver Verifier から収集されたその他の統計情報が表示されます。このページに表示されるすべてのカウンタが、Verifier の Pool tracking フラグに関連付けられています。それらのカウンタのほとんどは、現在の割り当て数や現在の割り当てバイト数などの、ドライバごとのカウンタです。この場合、特定のドライバのカウンタを表示するには、上部のボックスの一覧からドライバ名を選択する必要があります。

設定

[Settings] プロパティ ページでは、Driver Verifier の設定を作成および変更できます。この設定はレジストリに保存され、設定を有効にするにはコンピュータを再起動する必要があります。この一覧で、現在インストールされているドライバを確認できます。各ドライバは、以下のいずれかの状態になります。
  • Enabled : 現在検証されています。
  • Disabled : 現在検証されていません。
  • Enabled (Reboot Needed) : 次に再起動した後にのみ検証されます。
  • Disabled (Reboot Needed) : 現在は検証されていますが、次に再起動した後は検証されません。
この一覧では 1 つ以上のドライバを選択でき、一覧の下にある 2 つのボタンを使用して、状態を切り替えることができます。また、ドライバ名を右クリックしてコンテキスト メニューを表示し、状態を切り替えることもできます。

ダイアログ ボックスの下部で、次の再起動後に検証する追加ドライバを指定できます。各ドライバ名はスペースで区切ります。通常、このエディット コントロールは、まだ読み込まれていない新しいドライバをインストールするときに使用します。

一覧の上部にある [Verify all drivers] がクリックされている場合は、一覧、[Verify]、[Don't Verify]、およびエディット コントロールは使用できません。この場合は、次に再起動した後で、システム内のすべてのドライバが検証されます。

検証の種類を設定するには、ダイアログ ボックスの右上にあるチェック ボックスを使用します。[I/O verification] チェック ボックスをオンにすると、[Level 1] または [Level 2] をクリックできます。Level 2 の検証は、Level 1 よりも強力です。

設定を変更した場合は [Apply] をクリックして保存する必要があります。また、このページには他に以下の 2 つのボタンがあります。
  • Preferred Settings : 一般的に使用する設定を有効にします。すべてのドライバが検証されます。
  • Reset All : すべての Driver Verifier 設定を無効にします。すべてのドライバが検証されなくなります。
[Apply] をクリックしたら、変更を有効にするためにコンピュータを再起動する必要があります。

一時的な設定

[Volatile Settings] プロパティ ページでは、Driver Verifier フラグを即座に変更できます。ここでは、一部の Driver Verifier フラグの状態を切り替えることはできますが、検証対象のドライバの一覧を変更することはできません。チェック ボックスの状態を変更したら、変更を有効にするために [Apply] をクリックします。変更は直ちに反映され、再び変更するかコンピュータを再起動するまで、その設定が使用されます。

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

Verifier.exe は、コマンド ラインから実行することもできます。詳細については、コマンド プロンプトから verifier.exe /? と入力します。よく使用されるコマンド ライン フラグは以下のとおりです。
  • verifier.exe /flags value [/iolevel 2]
    Driver Verifier フラグを 10 進数で指定します。必要に応じて、I/O 確認レベルも指定できます。使用可能なフラグについては、コマンド プロンプトから verifier.exe /? と入力するか、この資料の「Driver Verifier の有効化」を参照してください。

    value パラメータには、以下のいずれかの検証ビット値を指定します。
    0 - 特別なプールの検査
    1 - 強制 IRQL 検査
    2 - 低リソース シミュレーション
    3 - プールのトラック
    4 - I/O の確認
    5 - デッドロックの検出
    6 - 強化された I/O の確認
    7 - DMA 検証
    たとえば、次のようにコマンドを入力します。
    c:\verifier /flags 3 /iolevel 2
    : デフォルトの I/O 確認レベルは 1 です。フラグで I/O 確認ビットが設定されていない場合は、値は無視されます。
  • verifier.exe /all
    システムのすべてのドライバを検証します。
  • verifier.exe /volatile /flags value
    Verifier フラグを直ちに変更します。
  • verifier.exe /reset
    現在のすべての Driver Verifier 設定をリセットします。
  • verifier /query
    Driver Verifier の現在の状態とカウンタを標準出力にダンプします。
  • verifier.exe /log LOG_FILE_NAME [/interval seconds]
    Driver Verifier の状態とカウンタをログ ファイルに記録します。seconds には、記録時間を指定します。

ドライバ開発者向けの関連情報

ドライバ開発者にとって役立つ Driver Verifier の設定について以下に詳しく説明します。通常、これらの設定は、IT 専門家には必要ありません。
警告 : レジストリ エディタの使い方を誤ると、深刻な問題が発生することがあります。最悪の場合、オペレーティング システムの再インストールが必要になることがあります。マイクロソフトは、レジストリ エディタの誤用により発生した問題に関しては、一切責任を負わないものとします。レジストリ エディタは、自己の責任においてご使用ください。
レジストリを編集して Driver Verifier を有効にするには、以下の手順を実行します。
  1. レジストリ エディタ (Regedt32) を起動します。
  2. 次のレジストリ キーを見つけます。

    HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management\VerifyDrivers
  3. REG_SZ キーを編集します。
テストするドライバの名前を REG_SZ キーに設定します。大文字と小文字は区別されません。複数のドライバを指定できますが、1 つのドライバのみを使用します。使用するドライバを 1 つのみにすると、使用可能なシステム リソースが途中で不足しないようにすることができます。リソースが不足してもシステムの信頼性は低下しませんが、ドライバに対する一部のチェックが無効になる可能性があります。

REG_SZ キーには、次のような値を設定します。
  • Ntfs.sys
  • Win32k.sys ftdisk.sys
  • *.sys
次のレジストリ キーで、ドライバの検証レベルを指定できます。

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


このキーには、以下のビット フィールド値を指定します。以下の値は、自由に組み合わせることができます。
  • 0x01 : すべての割り当てを特別なプールから行います。
  • 0x02 : このドライバをメモリ不足の環境に置き、ページング可能なコードやデータへのアクセスに関する IRQL の使用法を検証します。
  • 0x04 : さまざまなプール割り当て要求をランダムに失敗させます。この機能は、システムが開始してこの問題を適切に処理できる状況になった後で有効になります。
  • 0x08 : プール割り当ての追跡を有効にします。すべての割り当ては、ドライバがアンロードされる前に解放される必要があり、解放されない場合はシステムでバグ チェックが実行されます。
  • 0x10 : I/O Verifier を有効にします。
: キーが存在しない場合、またはドライバの検証レベルを指定しない場合のデフォルト値は 3 です。Verifier ユーティリティで [Preferred Settings] をクリックした場合のデフォルト値は 0x1B です。メモリ リークを追跡するには、0xB という値を指定します。この値を指定するには、[Preferred Settings] をクリックしてから、[I/O verification] チェック ボックスをオフにするのが最も容易な方法です。

関連情報

この資料は米国 Microsoft Corporation から提供されている Knowledge Base の Article ID 244617 (最終更新日 2005-01-25) を基に作成したものです。

プロパティ

文書番号: 244617 - 最終更新日: 2005年8月19日 - リビジョン: 5.1
この資料は以下の製品について記述したものです。
  • Microsoft Windows 2000 Server
  • Microsoft Windows 2000 Advanced Server
  • Microsoft Windows 2000 Professional
  • Microsoft Windows 2000 Datacenter Server
  • Microsoft Windows XP Home Edition
  • Microsoft Windows XP Professional
  • Microsoft Windows Server 2003, Datacenter Edition (32-bit x86)
  • Microsoft Windows Server 2003, Enterprise Edition (32-bit x86)
  • Microsoft Windows Server 2003, Standard Edition (32-bit x86)
キーワード:?
kbhowto kbenv kbprogramming KB244617
"Microsoft Knowledge Baseに含まれている情報は、いかなる保証もない現状ベースで提供されるものです。Microsoft Corporation及びその関連会社は、市場性および特定の目的への適合性を含めて、明示的にも黙示的にも、一切の保証をいたしません。さらに、Microsoft Corporation及びその関連会社は、本文書に含まれている情報の使用及び使用結果につき、正確性、真実性等、いかなる表明・保証も行ないません。Microsoft Corporation、その関連会社及びこれらの権限ある代理人による口頭または書面による一切の情報提供またはアドバイスは、保証を意味するものではなく、かつ上記免責条項の範囲を狭めるものではありません。Microsoft Corporation、その関連会社 及びこれらの者の供給者は、直接的、間接的、偶発的、結果的損害、逸失利益、懲罰的損害、または特別損害を含む全ての損害に対して、状況のいかんを問わず一切責任を負いません。(Microsoft Corporation、その関連会社 またはこれらの者の供給者がかかる損害の発生可能性を了知している場合を含みます。) 結果的損害または偶発的損害に対する責任の免除または制限を認めていない地域においては、上記制限が適用されない場合があります。なお、本文書においては、文書の体裁上の都合により製品名の表記において商標登録表示、その他の商標表示を省略している場合がありますので、予めご了解ください。"

フィードバック

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com