次の方法で共有


ドライバーを検証するためのツール

Windows Driver Kit (WDK) には、開発中のエラーの検出と修正に役立つドライバー検証ツールが用意されています。 これらのツールには、CodeQL などの静的分析ツールと、展開前に重大なバグを見つけることができるドライバー検証ツールなどの動的ツールが含まれます。 開発の早い段階でこれらの検証ツールを使用すると、時間が節約され、運用環境でのドライバーの重大な問題を防ぐことができます。

WDK ドキュメントでは、これらの検証ツールについて説明し、各ツールがさまざまな方法でさまざまな種類のドライバー エラーを検出するため、その使用をお勧めします。 これらのツールは、手動チェックよりもはるかに効率的です。 標準的なドライバー テストでは通常見つからないエラーを検出でき、経験豊富なドライバー開発者と Windows ドライバー インターフェイス デザイナーの専門知識を体現します。

最適な結果を得るには、ドライバーで実行できるすべてのツールを使用します。 これらのツールのいずれかを省略すると、ドライバーの重大なバグを見逃す可能性があります。

静的および動的検証ツール

検証ツールには、次の 2 つの基本的なタイプがあります。

  • 静的検証ツールは、ドライバーを実行せずにドライバー コードを確認します。 これらのツールはコードを実行するテストに依存しないため、非常に徹底している可能性があります。 理論的には、静的検証ツールは、実際にはほとんど実行されないコード パスを含め、すべてのドライバー コードを調査できます。 ただし、ドライバーが実際に実行されていないため、これらのツールは誤検知の結果を生成する可能性があります。 つまり、実際には発生しないコード パスでエラーが報告される可能性があります。

    CodeQL は、ドライバーの主要な静的分析ツールです。 CodeQL には、クエリ対象のデータベースとしてコードを扱う強力なクエリ言語が用意されているため、特定の動作とパターンに対するクエリを簡単に記述できます。 Windows ハードウェア互換性プログラムには、クライアントとサーバーのオペレーティング システムで静的ツール ロゴ (STL) テスト用の CodeQL が必要です。 詳しくは、「CodeQL と静的ツール ロゴ テスト」をご覧ください。

  • 動的検証ツールは、ドライバーの実行中にドライバー コードを調査します。通常、一般的に使用されるドライバー サポート ルーチンの呼び出しをインターセプトし、同じルーチンの独自のエラー チェック バージョンへの呼び出しに置き換えます。 動的ツールが検証を行っている間にドライバーが実際に実行されているため、誤検知が発生することはまれです。 ただし、動的ツールはドライバーを監視している間に発生するアクションのみを検出するため、ドライバー テストの対象範囲が十分でない場合、ツールは特定のドライバーの欠陥を見逃す可能性があります。 同時に、実行時に利用可能な情報 (ソース コードから静的に抽出するのが困難な情報など) を使用することで、動的検証ツールは、静的分析ツールでは検出が困難な特定のクラスのドライバー エラーを検出できます。

静的検証ツールと動的検証ツールの組み合わせを使用します。 静的ツールを使用すると、実際には実行が難しいコード パスをチェックできますが、動的ツールはドライバーで発生している重大なエラーを検出します。

検証ツールの概要

重要

静的ドライバー検証ツール (SDV) はサポートされなくなりました。 Windows 24H2 RTM WDK など、ビルド 26017 より新しい WDK では使用できません。 分析に SDV を使用することはお勧めしません。

WDK では、次の検証ツールについて説明し、ドライバー開発者とテスト担当者による使用をお勧めします。 これらは、通常使用する順序で一覧表示されます。

コードのコンパイル後

  • CodeQL は、強力なセマンティック コード分析エンジンです。 価値の高いセキュリティ クエリの広範なスイートと堅牢なプラットフォームを組み合わせることで、ドライバー コードをセキュリティで保護するための貴重なツールになります。 詳しくは、「CodeQL と静的ツール ロゴ テスト」をご覧ください。

ドライバーの実行時

ドライバーがビルドされ、明らかなエラーなしに動作するようになったらすぐに、次の動的検証ツールを使用してください。

  • ドライバー検証ツールは、特に Windows ドライバー用に記述された動的検証ツールです。 複数のドライバーで同時に実行できる複数のテストが含まれています。 ドライバー検証ツールは、経験豊富なドライバー開発者やテスト担当者が、ドライバーが開発環境またはテスト環境で実行されるたびに実行されるように構成するドライバーの重大なバグを見つけるのに非常に効果的です。 ドライバーの検証ツールは、Windows に含まれています。 ドライバーのドライバー検証ツールを有効にする場合は、ドライバー対して複数のテストを実行する必要があります。 ドライバー検証ツールは、静的検証ツールのみを使用して、検出が困難な特定のドライバーのバグを検出できます。 これらの種類のバグの例には、次のようなものがあります。

    • カーネル プール バッファー オーバーラン。 検証済みドライバーがプール メモリ バッファーを割り当てると、ドライバー検証ツールは、アクセス不可能なメモリ ページを使用してそれらを保護します。 ドライバーがバッファーの末尾を超えてメモリを使用しようとすると、ドライバー検証ツールによってバグ チェックが開始されます。

    • 解放後のメモリの使用。 特殊なプール メモリ ブロックは、独自のメモリ ページを使用し、メモリ ページを他の割り当てと共有しません。 ドライバーがプール メモリのブロックを解放すると、対応するメモリ ページにアクセスできなくなります。 ドライバーが解放後にそのメモリを使用しようとすると、ドライバーはすぐにクラッシュします。

    • 管理者特権で IRQL を実行中にページング可能なメモリを使用する。 検証済みドライバーが IRQL を DISPATCH_LEVEL 以上で発生させると、ドライバー検証ツールは、メモリ不足になったシステムをシミュレートして、システムワーキング セットからページング可能なすべてのメモリを削除します。 これらのページング可能な仮想アドレスのいずれかを使用しようとすると、ドライバーがクラッシュします。

    • 低リソースのシミュレーション。 リソースの少ない条件下でシステムをシミュレートするために、ドライバー検証ツールは、ドライバーが呼び出すさまざまなオペレーティング システム カーネル API に失敗する可能性があります。

    • メモリ リーク。 ドライバー検証ツールは、ドライバーによって行われたメモリ割り当てを追跡し、ドライバーがアンロードされる前にメモリを解放することを確認します。

    • 完了または取り消しに時間がかかりすぎる I/O 操作。 ドライバー検証ツールは、STATUS_PENDING からの戻り値応答するためのドライバーのロジックをテストできます。

    • DDI コンプライアンス チェック。 (Windows 8 以降で利用可能) このオプションがアクティブな場合、ドライバー検証ツールは、ドライバーとオペレーティング システムのカーネル インターフェイス間の適切な相互作用をチェックする一連のデバイス ドライバー インターフェイス (DDI) ルールを適用します。

  • Kernel Address Sanitizer (KASAN) は、Windows ドライバーでサポートされているバグ検出テクノロジです。これにより、バッファー オーバーフローや解放後の使用イベントなど、いくつかのクラスの無効なメモリ アクセスを検出できます。

  • アプリケーション検証ツール は、C または C++ で記述されたユーザー モード アプリケーションとドライバー用の動的検証ツールです。 マネージド コードは検証されません。