KMDF ドライバーの関数役割型を使用した関数の宣言

SDV で KMDF ドライバーを分析できるようにするには、KMDF の関数ロール型宣言を使用して関数を宣言する必要があります。 関数ロールの種類は、Wdf.h および Wdf.h に含まれる他の KMDF ヘッダー ファイルで定義されます。 関数ロールの種類とそれに対応するイベント コールバック関数の一覧については、「静的ドライバー検証ツール KMDF 関数宣言 」を参照してください

KMDF ドライバーの各イベント コールバック関数は、対応するロールの種類を指定して宣言する必要があります。

たとえば、次のコード例は、 EvtDriverDeviceAdd コールバック関数の関数ロール型宣言を示しています。 この例では、コールバック関数は myDriver_EvtDriverDeviceAdd と呼ばれています。 関数ロールの種類がEVT_WDF_DRIVER_DEVICE_ADD。

EVT_WDF_DRIVER_DEVICE_ADD myDriver_EvtDriverDeviceAdd;

コールバック関数に関数プロトタイプ宣言がある場合は、関数プロトタイプを関数ロール型宣言に置き換える必要があります。

次の一覧は、ヘッダー ファイル Fail_Driver6.h から取得しています。 関連する関数は FailDriver6.c で宣言されています。

/*++

Copyright (C) Microsoft.  All rights reserved.
Module Name:
    fail_driver6.h
Environment:
    Kernel mode
--*/

#include <NTDDK.h>  
#include <wdf.h>

#include "fail_library6.h"

DRIVER_INITIALIZE DriverEntry;
EVT_WDF_DRIVER_DEVICE_ADD EvtDriverDeviceAdd;
EVT_WDF_IO_QUEUE_IO_READ EvtIoRead;
EVT_WDF_IO_QUEUE_IO_WRITE EvtIoWrite;
EVT_WDF_IO_QUEUE_IO_DEVICE_CONTROL EvtIoDeviceControl;
EVT_WDF_DEVICE_CONTEXT_CLEANUP DeviceContextCleanUp;
EVT_WDF_DEVICE_CONTEXT_DESTROY DeviceContextDestroy;
EVT_WDF_IO_QUEUE_CONTEXT_CLEANUP_CALLBACK QueueCleanup;
EVT_WDF_IO_QUEUE_CONTEXT_DESTROY_CALLBACK QueueDestroy;
EVT_WDF_FILE_CONTEXT_CLEANUP_CALLBACK FileContextCleanup;
EVT_WDF_FILE_CONTEXT_DESTROY_CALLBACK FileContextDestroy;

ロールの種類の宣言を使用してドライバーコールバック関数を宣言したら、ドライバー をスキャンできます。 ドライバーをスキャンすると Sdv-map.h ファイルが生成され、エントリ ポイントが正しく識別されたかどうかを調べることができます。

ドライバーのコード分析を実行して関数の宣言を確認する

ソース コードが準備されているかどうかを判断するには、ドライバーのコード分析を実行 します。 ドライバーのコード分析は、関数ロールの型宣言のチェックし、関数定義のパラメーターが関数ロール型のパラメーターと一致しない場合に、見落とされた可能性がある関数宣言を識別したり警告したりするのに役立ちます。

関数パラメーターと関数ロールの種類

C プログラミング言語で必要に応じて、関数定義で使用するパラメーター型は、関数プロトタイプのパラメーター型 (この場合は関数ロール型) と一致する必要があります。 SDV は、分析のために関数シグネチャに依存し、シグネチャが一致しない関数を無視します。

たとえば、EVT_WDF_DRIVER_DEVICE_ADD関数ロールの種類を 使用して EvtDriverDeviceAdd ルーチンを宣言する必要があります。

EVT_WDF_DRIVER_DEVICE_ADD myEvtDriverDeviceAdd;

関数 myEvtDriverDeviceAdd を実装する場合、パラメーターの型は、EVT_WDF_DRIVER_DEVICE_ADD、つまり、WDFDRIVER とPWDFDEVICE_INITで使用されるものと一致する必要があります (構文については EvtDriverDeviceAdd ルーチンを参照してください)。

NTSTATUS
 myEvtDriverDeviceAdd (
  WDFDRIVER Driver,
 PWDFDEVICE_INIT DeviceInit
 )
{
}