ドライバーのスキャン

/scan コマンド オプションを使用したドライバーのスキャンは省略できます。 ドライバーを確認する前にスキャンしない場合、SDV は関数の役割の種類の宣言をスキャンし、ドライバーを確認するときに Sdv-map.h ファイルを作成します。

このスキャン中に、SDVはドライバーを検証するために必要なドライバーエントリポイントの検出を試みます。 スキャンの結果は、ドライバーのソース ディレクトリに作成されるファイル Sdv-map.h に記録されます。

ただし、SDV が正しいエントリ ポイントを検出したことを確認するには、スキャン手順の後または検証後に、このファイルを確認することが非常に重要です。 エントリ ポイントが見つからないか間違っている場合は、検証が信頼できない可能性があります。 さらに重要なのは、SDV がエントリ ポイントを検出できない場合、ドライバーを検証できないことです。

ドライバーごとに 1 回のみスキャンする必要があります。 その後、SDV は、将来の検証のためにドライバーの Sdv-map.h ファイルを保持します。

Sdv-map.h ファイルを調べる

スキャン コマンドを実行するか、ドライバーを確認した後、Sdv-map.h ファイルを開き、ファイルを確認します。 Sdv-map.h は、書式設定されたテキスト ファイルです。 メモ帳など、任意のテキスト エディターを読み取ることができます。

Sdv-map.h ファイルの内容を、ドライバーの宣言された関数ロールの種類と比較します。 Sdv-map.h ファイルの内容を調べて、ドライバーのコールバックまたはディスパッチ ルーチンが正しく識別されていることを確認します。

Sdv-map.h ファイルは、ドライバー内のすべてのエントリ ポイントを一覧表示する必要はありません。分析で使用される IRP メジャー関数コードまたは関数の役割の種類のエントリ ポイントのみ。 IRP の主要な関数コードまたは関数の役割の種類をファイルに追加しないでください。

Sdv-map.h ファイルの詳細については、Sdv-map.h をご参照ください。 形式は、Sdv-map.h ファイルの形式で説明されています。 Sdv-map.h ファイルに表示される可能性があるエラーについては、「Sdv-map.h ファイルの承認」をご参照ください。

次の例は、tools\sdv\samples\fail_drivers\wdm ディレクトリのサンプル WDM ドライバーである、Fail_driver1 の Sdv-map.h ファイルの内容を示しています。

//Approved=false
//DriverAddDevice
#define fun_AddDevice DriverAddDevice
//DriverEntry
#define fun_DriverEntry DriverEntry
//DriverUnload
#define fun_DriverUnload DriverUnload
//CompletionRoutine
#define fun_IO_COMPLETION_ROUTINE_1 CompletionRoutine
//DpcForIsrRoutine
#define fun_IO_DPC_ROUTINE_1 DpcForIsrRoutine
//DispatchCreate
#define fun_IRP_MJ_CREATE DispatchCreate
//DispatchPnp
#define fun_IRP_MJ_PNP DispatchPnp
//DispatchPower
#define fun_IRP_MJ_POWER DispatchPower
//DispatchRead
#define fun_IRP_MJ_READ DispatchRead
//DispatchSystemControl
#define fun_IRP_MJ_SYSTEM_CONTROL DispatchSystemControl
//InterruptServiceRoutine
#define fun_KSERVICE_ROUTINE_1 InterruptServiceRoutine

Sdv-map.h ファイルの修正

ドライバーを確認する前に、Sdv-map.h ファイル内のエラーを修正します。 Sdv-map.h ファイルが正しくないか、承認されていない場合でも、SDV はドライバーを検証しますが、検証の結果が信頼できない可能性があります。 たとえば、対応する関数の役割の種類を使用してドライバーのディスパッチまたはコールバック ルーチンを宣言しない場合、ドライバー ルーチンは Sdv-map.h ファイルに表示されません。 そのため、検証の一環としてこれらの規則を指定した場合でも、SDV は関数ロールの種類を使用する規則を適用できないと見なしているため、コード内の欠陥を見逃す可能性があります。

Sdv-map.h ファイルを修正するには、適切な関数の役割の種類を使用して、ドライバーのディスパッチまたはコールバック ルーチンが宣言されていることを確認します。 次に、ドライバーを再スキャンし、Sdv-map.h ファイルに表示されることを確認します。

Sdv-map.h ファイルの承認

Sdv-map.h ファイルが正しいと判断したら、ファイルを承認できます。 ファイルに変更を加えていない場合は、承認する必要はありません。

Sdv-map.h ファイルが承認されていない場合でも、SDV によってドライバーが検証されます。

Sdv-map.h ファイルを承認するには、ファイルの最初の行で次を変更します。

//Approved=false

この行を次のように変更します。

//Approved=true

Sdv-map.h ファイルを承認する必要があるのは、ドライバーごとに 1 回のみです。 その後、SDV は将来の検証のために、承認されたドライバーの Sdv-map.h ファイルを保持します。 SDV でソース コードで関数ロール型の宣言を再度スキャンする場合は、ファイルを削除するのみです。

次の例は、KMDF サンプル ドライバー Fail_Driver1 用の承認済み Sdv-map.h ファイルです。 SDV では、Sdv-map.h ファイルを使用して、検証に必要な関数ロールの種類を持つドライバーの宣言されたコールバック関数をマップします。

//Approved=true
//DriverEntry
#define fun_DriverEntry DriverEntry
//EvtDriverDeviceAdd
#define fun_WDF_DRIVER_DEVICE_ADD EvtDriverDeviceAdd
//EvtIoDeviceControl
#define fun_WDF_IO_QUEUE_IO_DEVICE_CONTROL EvtIoDeviceControl
//EvtIoInternalDeviceControl
#define fun_WDF_IO_QUEUE_IO_INTERNAL_DEVICE_CONTROL EvtIoInternalDeviceControl
//EvtIoRead
#define fun_WDF_IO_QUEUE_IO_READ EvtIoRead
//EvtRequestCancel
#define fun_WDF_REQUEST_CANCEL_1 EvtRequestCancel