サポートされる ドライバー
SDV がドライバーを検証するには、ドライバー コードを解釈できる必要があります。具体的には、ドライバーのエントリ ポイント、必要なドライバー機能をサポートする関数、ルーチン内のコードです。
次のセクションでは、ドライバーの基本的な要件と、SDV が検証するドライバーに必要な具体的な構文について説明します。 SDV では、ドライバーがこれらの要件に準拠していることを確認しませんが、ドライバーが準拠していない場合、SDV は実行に失敗する可能性がます。まれに、誤った解釈のために、SDV は偽陽性または偽陰性の結果を報告することがあります。
重要
SDV はサポートされなくなり、Windows 24H2 WDK または EWDK リリースでは SDV を使用できません。 ビルド 26017 より新しい WDK では使用できません。また、Windows 24H2 RTM WDK には含まれていません。
SDV は、Windows 11 バージョン 22H2 EWDK (2023 年 10 月 24 日リリース) と Visual Studio ビルド ツール 17.1.5 を からダウンロードすることで引き続き使用。 SDV を実行する Enterprise WDK のみを使用することをお勧めします。 古いバージョンの標準 WDK を Visual Studio の最近のリリースと組み合わせて使用することはお勧めしません。これにより、分析エラーが発生する可能性があります。
今後、CodeQL はドライバーの主要な静的分析ツールになります。 CodeQL には、クエリ対象のデータベースとしてコードを扱う強力なクエリ言語が用意されているため、特定の動作やパターンなどに対するクエリを簡単に記述できます。
CodeQL の使用方法の詳細については、「 CodeQL と静的ツール ロゴ テストを参照してください。
基本的なドライバーの特性
SDV では、次の特性を持つドライバーのみを検証できます。
SDV は、C および C++ で記述されたドライバーとライブラリを検証します。
SDV は、KMDF 準拠および WDM 準拠のデバイス ドライバー (関数ドライバー、フィルター ドライバー、バス ドライバー)、NDIS ドライバー (フィルター、ミニポート、プロトコル ドライバー)、Storport ドライバーに限り、完全な検証を実行します。
SDV は、上記のカテゴリに適合しないドライバーに対して、ジェネリック プロパティ (NullCheckなど) の限定的な検証を試行します。
SDV は、WDM 関数ロール型を使用して、ドライバー コールバック関数を宣言する WDM ドライバーを検証できます。 関数を宣言する方法の詳細については、「WDM ドライバーの関数ロール型を使用した関数の宣言」を参照してください。
SDV-KMDF コールバック関数ロール型を使用して各コールバック関数を宣言する場合、SDV は、カーネルモード ドライバー フレームワークから生成されたドライバーを確認できます。 詳細については、「KMDF ドライバーの関数ロール型を使用した関数の宣言」を参照してください。
SDV は、SDV-NDIS コールバック関数型を使用して各コールバック関数を関数宣言で注釈を付けることにより、NDIS ドライバーを検証できます。 詳細については、「NDIS ドライバーの関数ロール型を使用した関数の宣言」を参照してください。
SDV は Storport ドライバーを検証できますが、各コールバック関数を関数宣言で注釈を付ける必要があります。 これを実行するには、SDV-Storport コールバック関数型を使用します。 詳細については、「Storport ドライバーの関数ロール型を使用した関数の宣言」を参照してください。
基本的なドライバーの要件
SDV で WDM ドライバーを検証するには、ドライバーは次の手順を実行する必要があります。
Wdm.h または Ntddk.h を含めます (Wdm.h は Ntddk.h のサブセットです)。
「デバイス オブジェクトの概要」および次の手順で説明されているメソッドを使用して、デバイス オブジェクトを作成します。
「Unload ルーチンの記述」で推奨されている Unload ルーチンを用意します。
「関数ロールの型宣言の使用」で説明されている関数ロール型宣言を使用して、各ディスパッチ関数を宣言します。 WDM ロール型と _Dispatch_type_ (type) の注釈の詳細については、「WDM ドライバーの関数ロール型を使用した関数の宣言」を参照してください。
SDV で KMDF ドライバーを検証するには、ドライバーは次の手順を実行する必要があります。
Wdf.h と Ntddk.h を含めます。
「フレームワークを使用したドライバーの開発」で説明されちる KMDF オブジェクトを作成します。
各コールバック関数には、「関数ロールの型宣言の使用」で説明されている SDV-KMDF コールバック関数ロール型を使用して注釈を付けます。 サポートされているロール型の一覧については、「静的ドライバー検証ツールの KMDF 関数の宣言」を参照してください。
SDV で NDIS ドライバーを検証するには、ドライバーは次の手順を実行する必要があります。
Ndis.h と Ntddk.h を含めます。
NDIS ドライバーを作成するには、「ネットワーク設計ガイド」のガイドラインに従います。
各コールバック関数には、「関数ロールの型宣言の使用」で説明されている SDV-NDIS コールバック関数ロール型を使用して注釈を付けます。 サポートされているロール型の一覧については、「静的ドライバー検証ツールの NDIS 関数の宣言」を参照してください。
さらに、SDV では、サポートしている次のドライバーを確認できます。
予約された関数名
SDV 検証エンジン は、ドライバーまたはライブラリ コードが SDV が内部で使用するのと同じ関数名パターンを使用する場合、正常に動作しません。
具体的には、次の場合、SDV はコードを正しく解釈しません。
このコードには、__init で始まり、その後に 1 つ以上の整数 (__init123 など) が続く関数名が含まれています。
このコードには、sdv_Func などの sdv_ で始まる関数名、または文字列 _sdv_ (Func_sdv_ や Func_sdv_foo など) が含まれます。
ライブラリは
.def
ファイルを使用してエクスポートされた関数の名前を変更し、外部名はライブラリ内の別の静的関数の名前と同じです。
ドライバー コードまたはライブラリ コードにこれらの要素が含まれている場合、SDV はドライバーの検証またはライブラリの処理を試行しますが、結果は サポートされていない機能 (NSF)となります。 SDV の結果の詳細については、「静的ドライバー検証ツールの結果の解釈」を参照してください。