次の方法で共有


関数役割型の重複エントリ ポイント

ほとんどの関数役割型の場合、SDV は、ドライバーがエントリ ポイントごとに最大で 1 つのコールバック関数を持っていることを前提としています。 ただし、いくつかの関数役割型には、複数のイベント コールバック関数を関連付けることができます。 たとえば、KMDF ドライバーには、複数の EvtTimerFunc または EvtDpcFunc コールバック関数がある場合があります (これらは、EVT_WDF_TIMER と EVT_WDF_DPC 役割型の注釈を使用します)。 この場合、SDV は Sdv-map.h の関数型に整数を付加します。 たとえば、ドライバーに 2 つの DPC コールバック関数がある場合、SDV はそれらを fun_WDF_DPC_1fun_WDF_DPC_2 にマップします。

ドライバーが役割型のコールバック関数の最大数を超えた場合、SDV は次のメッセージを表示します。

Static Driver Verifier found more than one entry point for '[role type]'

関数役割型に SDV でサポートされている数よりも多くのエントリ ポイントがあるとしても、ドライバーに問題が生じるとは限りません。 ただし、正確な検証結果を取得するには、Sdv.-map.h ファイルを編集して、重複するエントリを削除する必要があります。

たとえば、次の Sdv-map.h ファイルは、EVT_WDF_REQUEST_COMPLETION_ROUTINE 役割型を使用して注釈が付けられた 2 つの CompletionRoutine 関数があることを示しています。 Sdv-map.h ファイルで、SDV は EvtRequestReadCompletionRoutineEvtRequestWriteCompletionRoutine の両方を fun_WDF_REQUEST_COMPLETION_ROUTINE として定義します。

//Approved=false
#define fun_WDF_DRIVER_DEVICE_ADD OsrFxEvtDeviceAdd
#define fun_WDF_IO_QUEUE_IO_READ OsrFxEvtIoRead
#define fun_WDF_IO_QUEUE_IO_STOP OsrFxEvtIoStop
#define fun_WDF_DEVICE_D0_EXIT OsrFxEvtDeviceD0Exit
#define fun_WDF_REQUEST_COMPLETION_ROUTINE EvtRequestReadCompletionRoutine
#define fun_WDF_REQUEST_COMPLETION_ROUTINE EvtRequestWriteCompletionRoutine
#define fun_WDF_OBJECT_CONTEXT_CLEANUP OsrFxEvtDriverContextCleanup
#define fun_WDF_DEVICE_D0_ENTRY OsrFxEvtDeviceD0Entry
#define fun_WDF_DEVICE_PREPARE_HARDWARE OsrFxEvtDevicePrepareHardware
#define fun_WDF_IO_QUEUE_IO_WRITE OsrFxEvtIoWrite
#define fun_WDF_IO_QUEUE_IO_DEVICE_CONTROL OsrFxEvtIoDeviceControl

重複を削除するには、2 番目の完了ルーチンをコメント アウトします (#define の #d を 2 つのコメント区切り記号 (//) に置き換えます)。 次に、Approved=true を設定し、検証を実行します。

#define fun_WDF_REQUEST_COMPLETION_ROUTINE EvtRequestReadCompletionRoutine
//efine fun_WDF_REQUEST_COMPLETION_ROUTINE EvtRequestWriteCompletionRoutine

1 つの完了ルーチンでの検証結果を確認したら、もう一度 Sdv-map.h ファイルを編集します。ただし、今回は、検証された完了ルーチンをコメントアウトし、検証されていない完了ルーチンからコメントを削除します (//#d に置き換えます)。 その後、SDV をもう一度実行します。

複数のエントリ ポイントをサポートする関数役割型

一部の関数役割型では、複数のエントリがサポートされています。 エントリの数がサポートされている最大値を超えると、SDV はこれらも重複するエントリとしてレポートします。 これらの追加エントリは、重複するエントリの処理と同じ方法で処理できます。Sdv-map.h ファイル内のコールバック ルーチンの #define ステートメントを選択的にコメントアウトし、個別の検証を行います。 たとえば、ドライバーに 8 個の DPC コールバック関数 (EVT_WDF_DPC 役割型を使用) がある場合は、次の操作を行います。

  • Sdv-map.h を編集し、fun_WDF_DPC_5 から fun_WDF_DPC_8 までの定義ステートメントをコメント アウトします。

  • ドライバーで SDV を実行します。

  • 次に、Sdv-map.h をもう一度編集して、fun_WDF_DPC_5 から fun_WDF_DPC_8 までを定義し、fun_WDF_DPC_1 から fun_WDF_DPC_4 までの定義ステートメントをコメント アウトします。

  • ドライバーで SDV を実行します。

複数のコールバック関数を持つ関数役割型の一覧については、「静的ドライバー検証ツールの KMDF 注釈」を参照してください。 この一覧には、これらの役割型に対して SDV でサポートされているコールバック関数の最大数が表示されます。