次の方法で共有


DDI 使用の規則セット (KMDF)

これらの規則を使用して、ドライバーが KMDF DDI を正しく使用していることを確認します。

このセクションの内容

トピック 説明

BufAfterReqCompletedIoctl

BufAfterReqCompletedIoctl ルールは、 EvtIoDeviceControl コールバック関数内で、I/O 要求の完了後に取得された I/O 要求バッファーにはアクセスできないことを規定します。

BufAfterReqCompletedIntIoctl

BufAfterReqCompletedIntIoctl ルールは、要求が完了した後、そのバッファーにはアクセスできないことを規定します ( EvtIoInternalDeviceControl コールバック関数内のみ)。 バッファーは、WdfRequestRetrieveOutputBuffer または WdfRequestRetrieveUnsafeUserOutputBuffer または WdfRequestRetrieveInputBuffer または WdfRequestRetrieveUnsafeUserInputBuffer を呼び出すことによって取得されます。

BufAfterReqCompletedIntIoctlA

BufAfterReqCompletedIntIoctlA ルールは、要求が完了した後、そのバッファーにはアクセスできないことを検証します ( EvtIoInternalDeviceControl コールバック内のみ)。 バッファーは、WdfRequestRetrieveInputBuffer または WdfRequestRetrieveOutputBuffer または WdfRequestRetrieveUnsafeUserInputBuffer または WdfRequestRetrieveUnsafeUserOutputBuffer を呼び出すことによって取得されました。

BufAfterReqCompletedIoctlA

BufAfterReqCompletedIoctlA ルールは、 EvtIoDeviceControl コールバック関数内で、I/O 要求の完了後に取得された I/O 要求バッファーにはアクセスできないことを指定します。

BufAfterReqCompletedRead

BufAfterReqCompletedRead ルールは、 EvtIoRead コールバック関数内で、I/O 要求の完了後に取得された I/O 要求バッファーにはアクセスできないことを指定します。 可能なバッファー アクセス方法として機能する DDI は 14 個あります。

BufAfterReqCompletedReadA

BufAfterReqCompletedReadA ルールは、EvtIoRead コールバック関数内で、I/O 要求の完了後に取得された I/O 要求バッファーにはアクセスできないことを指定します。 可能なバッファー アクセス方法として機能する DDI は 14 個あります。

BufAfterReqCompletedWrite

BufAfterReqCompletedWrite ルールは、EvtIoWrit コールバック関数内で、I/O 要求の完了後に取得された I/O 要求バッファーにはアクセスできないことを指定します。

BufAfterReqCompletedWriteA

BufAfterReqCompletedWriteA ルールは、EvtIoWrit コールバック関数内で、I/O 要求の完了後に取得された I/O 要求バッファーにはアクセスできないことを指定します。

ChildDeviceInitApi

ChildDeviceInitApi ルールは、子デバイスの場合、ドライバーが子デバイス オブジェクトの WdfDeviceCreate メソッドを呼び出す前に、フレームワーク デバイス オブジェクトの初期化メソッドを呼び出す必要があることを指定します。

ControlDeviceDeleted

ControDeviceDeleted ルールは、PnP ドライバーがコントロール デバイス オブジェクトを作成する場合、ドライバーがアンロードする前に、クリーンアップ コールバック関数のいずれかでコントロール デバイス オブジェクトを削除する必要があることを指定します。

ControlDeviceInitAPI

ControlDeviceInitAPI ルールでは、コントロール デバイスの WDFDEVICE_INIT 構造体を設定する WdfControlDeviceInitAllocate およびその他のすべてのデバイス オブジェクト初期化 DDI を、コントロール デバイスの WdfDeviceCreate の前に呼び出さなければならないことを指定します。

CtlDeviceFinishInitDeviceAdd

CtlDeviceFinishInitDeviceAdd ルールは、ドライバーが EvtDriverDeviceAdd コールバック関数でコントロール デバイス オブジェクトを作成する場合、 WdfControlFinishInitializing をデバイスが作成された後、 および EvtDriverDeviceAdd コールバック関数から終了する前に、呼び出さなければならないことを規定します。 このルールは、PnP 以外のドライバーには適用されません。

CtlDeviceFinishInitDrEntry

CtlDeviceFinishInitDrEntry ルールは、ドライバーが DriverEntry コールバック関数でコントロール デバイス オブジェクトを作成する場合、デバイスが作成された後、および EvtDriverDeviceAdd コールバック関数から終了する前に、WdfControlFinishInitializing を呼び出さなければならないことを指定します。 このルールは、PnP 以外のドライバーには適用されません。

DeviceCreateFail

DeviceCreateFail ルールは、 WdfDeviceCreate の呼び出しに失敗したときに EVT_WDF_DRIVER_DEVICE_ADD がエラー状態を返すように指定します。

DeviceInitAllocate

DeviceInitAllocate ルールは、PDO デバイスまたはコントロールデバイスオブジェクトの場合、フレームワークのデバイスオブジェクト初期化メソッド WdfPdoInitAllocate または、 WdfControlDeviceInitAllocate ドライバーが WdfDeviceCreateを呼び出す前に呼び出す必要があることを指定します。

DeviceInitAPI

FDO デバイスの場合、ドライバーがデバイス オブジェクトの WdfDeviceCreate メソッドを呼び出す前に、フレームワーク デバイス オブジェクト初期化メソッドとフレームワーク FDO 初期化メソッドを呼び出さなければなりません。

DoubleDeviceInitFree

DoubleDeviceInitFree ルールは、ドライバーがデバイス初期化構造体を 2 回解放しないように指定します。

DriverCreate

DriverCreate ルールは、カーネルモードドライバーフレームワーク(KMDF)を使用するドライバーは、 WdfDriverCreate メソッドを呼び出して、フレームワークドライバーオブジェクトを DriverEntry ルーチンの中から作成しなければならないことを規定しています。

InitFreeDeviceCallback

InitFreeDeviceCallback ルールは、ドライバーが新しいフレームワーク デバイス オブジェクトの初期化中にエラーが発生した場合、またドライバーが WdfControlDeviceInitAllocate への呼び出しから WDFDEVICE_INIT 構造体を受け取った場合に、ドライバーが WdfDeviceInitFree を呼び出さなければならないことを指定します。

InitFreeDeviceCreate

InitFreeDeviceCreate ルールは、ドライバが WdfDeviceInitFreeWdfDeviceCreate の代わりに呼び出さなければならないことを規定しています。 それは、デバイスオブジェクトの初期化メソッドのいずれかでエラーが発生した場合、およびドライバが WDFDEVICE_INIT 構造体を WdfControlDeviceInitAllocateの呼び出しから受け取った場合です。.

InitFreeDeviceCreateType2

InitFreeDeviceCreateType2 ルールは、ドライバーが WdfDeviceInitFree を呼び出した後に WdfDeviceCreate を呼び出してはならないことを指定します。

InitFreeDeviceCreateType4

InitFreeDeviceCreateType4 ルールは、ドライバーが WdfDeviceInitFree を呼び出さなければならないことを規定しています。 それは、ドライバーが WdfDeviceCreate を呼び出している間にエラーが発生した場合、およびドライバーが WDFDEVICE_INIT 構造体を WdfControlDeviceInitAllocateの呼び出しによって受け取った場合です。

InitFreeNull

InitFreeNull ルールは、 NULL ポインターを使用して WDFDEVICE_INIT 構造体を呼び出すことはできないことを規定しています。

MdlAfterReqCompletedIntIoctl

MdlAfterReqCompletedIntIoctl ルールは、EvtIoInternalDeviceControl コールバック関数内で、I/O 要求の完了後にメモリ記述子リスト (MDL) にアクセスできないことを指定します。

MdlAfterReqCompletedIntIoctlA

MdlAfterReqCompletedIntIoctlA ルールは、 EvtIoInternalDeviceControl コールバック関数内で、I/O 要求の完了後にメモリ記述子リスト (MDL) にアクセスできないことを規定しています。

MdlAfterReqCompletedIoctl

MdlAfterReqCompletedIoctl ルールは、 EvtIoDeviceControl ールバック関数内で、I/O 要求の完了後にメモリ記述子リスト (MDL) にアクセスできないことを規定します。

MdlAfterReqCompletedIoctlA

MdlAfterReqCompletedIoctlA ルールは、 EvtIoDeviceControl コールバック関数内で、I/O 要求の完了後にメモリ記述子リスト (MDL) にアクセスできないことを既定します。

MdlAfterReqCompletedRead

MdlAfterReqCompletedRead ルールは、 EvtIoRead コールバック関数内で、I/O 要求の完了後に取得されたメモリ記述子リスト (MDL) オブジェクトにアクセスできないことを規定します。

MdlAfterReqCompletedReadA

MdlAfterReqCompletedReadA ルールは、 EvtIoRead コールバック関数内で、I/O 要求の完了後に取得されたメモリ記述子リスト (MDL) オブジェクトにアクセスできないことを指定します。

MdlAfterReqCompletedWrite

MdlAfterReqCompletedWrite ルールは、 EvtIoWrite コールバック関数内で、I/O 要求の完了後に取得されたメモリ記述子リスト (MDL) オブジェクトにアクセスできないことを規定します。

MdlAfterReqCompletedWriteA

MdlAfterReqCompletedWriteA ルールは、 EvtIoWrite コールバック関数内で、I/O 要求の完了後に取得されたメモリ記述子リスト (MDL) オブジェクトにアクセスできないことを指定します。

MemAfterReqCompletedIntIoctl

MemAfterReqCompletedIntIoctl ルールは、 EvtIoInternalDeviceControl コールバック関数内で、I/O 要求の完了後にフレームワーク メモリ オブジェクトにアクセスできないことを規定します。

MemAfterReqCompletedIntIoctlA

MemAfterReqCompletedIntIoctlA ルールは、 EvtIoInternalDeviceControl コールバック関数内で、I/O 要求の完了後にフレームワーク メモリ オブジェクトにアクセスできないことを規定します。

MemAfterReqCompletedIoctl

MemAfterReqCompletedIoctl ルールは、 EvtIoDeviceControl コールバック関数内で、I/O 要求の完了後にフレームワーク メモリ オブジェクトにアクセスできないことを規定します。

MemAfterReqCompletedIoctlA

MemAfterReqCompletedIoctlA ルールは、 EvtIoDeviceControl コールバック関数内で、I/O 要求の完了後にフレームワーク メモリ オブジェクトにアクセスできないことを規定します。

MemAfterReqCompletedRead

MemAfterReqCompletedRead ルールは、 EvtIoRead コールバック関数内で、I/O 要求の完了後にフレームワーク メモリ オブジェクトにアクセスできないことを規定します。

MemAfterReqCompletedReadA

MemAfterReqCompletedReadA ルールは、 EvtIoRead コールバック関数内で、I/O 要求の完了後にフレームワーク メモリ オブジェクトにアクセスできないことを規定します。

MemAfterReqCompletedWrite

MemAfterReqCompletedWrite ルールは、 EvtIoWrite コールバック関数内で、I/O 要求の完了後にフレームワーク メモリ オブジェクトにアクセスできないことを規定します。

MemAfterReqCompletedWriteA

MemAfterReqCompletedWriteA ルールは、 EvtIoWrite コールバック関数内で、I/O 要求の完了後にフレームワーク メモリ オブジェクトにアクセスできないことを規定します。

NullCheck

NullCheck ルールは、ドライバー コード内の NULL 値が後でドライバーで逆参照されないことを確認します。 次のいずれかの条件に該当する場合、このルールは欠陥を報告します。

  • 後で逆参照される NULL の代入がある。
  • 後で逆参照される NULL である可能性があるドライバーのプロシージャにはグローバル/パラメーターがあり、ポインターの初期値が NULL である可能性があることを示唆する明示的なチェックがドライバーにある。

NullCheck ルール違反では、最も関連性の高いコード ステートメントがトレース ツリー ウィンドウで強調表示されます。 レポート出力の操作の詳細については、「静的ドライバー検証ツールのレポート」および「トレース ビューアーの概要」を参照してください。

PdoDeviceInitAPI

PdoDeviceInitAPI ルールは、ドライバーが PDO の WdfDeviceCreate を呼び出す前に、物理デバイス オブジェクト (PDO) の WDFDEVICE_INIT 構造体を設定する WdfPdoInitAllocate およびその他のすべてのデバイス オブジェクト初期化 DDI を呼び出す必要があることを規定しています。

PdoInitFreeDeviceCallback

PdoInitFreeDeviceCallback ルールは、ドライバーがフレームワーク デバイス オブジェクト初期化関数を呼び出すときにエラーが発生した場合に、ドライバーが WdfDeviceInitFree を呼び出す必要があることを規定します。

PdoInitFreeDeviceCreate

PdoInitFreeDeviceCreate ルールは、ドライバーは WdfDeviceInitFreeWdfDeviceCreate の代わりに呼び出さなければならないと規定しています。 それは、デバイスオブジェクトの初期化関数のいずれかでエラーが発生し、ドライバーが WdfPdoInitAllocateの呼び出しからWDFDEVICE_INIT構造体を受け取った場合です。

PdoInitFreeDeviceCreateType2

PdoInitFreeDeviceCreateType2 ルールは、ドライバーが WdfDeviceInitFree を呼び出した後に WdfDeviceCreate を呼び出してはならないことを指定します。

PdoInitFreeDeviceCreateType4

PdoInitFreeDeviceCreateType4 規則は、ドライバーが WdfDeviceCreate を呼び出すときにエラーが発生した場合に、ドライバーが WdfDeviceInitFree を呼び出す必要があることを指定します。

ControlDeviceInitAllocate

ControlDeviceInitAllocate ルールは、制御デバイスオブジェクトに対して、 ドライバーが、フレームワークのデバイスオブジェクト初期化メソッド WdfControlDeviceInitAllocate を先に呼び出してから、 WdfDeviceCreateを呼び出す必要があることを規定しています。

InputBufferAPI

InputBufferAPI ルールは、バッファー取得用の適切な DDI が EvtIoReadコールバック関数で使用されることを指定します。 EvtIoRead コールバック関数内では、バッファー取得のために次の DDI を呼び出すことはできません。

DDI 使用量ルール セットを選択するには

  1. Microsoft Visual Studio でドライバー プロジェクト (.vcxProj) を選択します。 Driver メニューから Launch Static Driver Verifier… をクリックします。

  2. ルール タブをクリックします。 ルール セット で、 DDIUsage を選択します。

    Visual Studio の開発者コマンド プロンプト ウィンドウから既定のルール セットを選択するには、 /check オプションで DDIUsage.sdv を指定します。 次に例を示します。

    msbuild /t:sdv /p:Inputs="/check:DDIUsage.sdv" mydriver.VcxProj /p:Configuration="Win8 Release" /p:Platform=Win32
    

    詳細については、「静的ドライバー検証ツールを使用して、ドライバーの欠陥を検出する」と「静的ドライバー検証ツールコマンド (MSBuild)」を参照してください。