DDI 使用の規則セット (KMDF)
これらの規則を使用して、ドライバーが KMDF DDI を正しく使用していることを確認します。
このセクションの内容
トピック | 説明 |
---|---|
BufAfterReqCompletedIoctl ルールは、 EvtIoDeviceControl コールバック関数内で、I/O 要求の完了後に取得された I/O 要求バッファーにはアクセスできないことを規定します。 |
|
BufAfterReqCompletedIntIoctl ルールは、要求が完了した後、そのバッファーにはアクセスできないことを規定します ( EvtIoInternalDeviceControl コールバック関数内のみ)。 バッファーは、WdfRequestRetrieveOutputBuffer または WdfRequestRetrieveUnsafeUserOutputBuffer または WdfRequestRetrieveInputBuffer または WdfRequestRetrieveUnsafeUserInputBuffer を呼び出すことによって取得されます。 |
|
BufAfterReqCompletedIntIoctlA ルールは、要求が完了した後、そのバッファーにはアクセスできないことを検証します ( EvtIoInternalDeviceControl コールバック内のみ)。 バッファーは、WdfRequestRetrieveInputBuffer または WdfRequestRetrieveOutputBuffer または WdfRequestRetrieveUnsafeUserInputBuffer または WdfRequestRetrieveUnsafeUserOutputBuffer を呼び出すことによって取得されました。 |
|
BufAfterReqCompletedIoctlA ルールは、 EvtIoDeviceControl コールバック関数内で、I/O 要求の完了後に取得された I/O 要求バッファーにはアクセスできないことを指定します。 |
|
BufAfterReqCompletedRead ルールは、 EvtIoRead コールバック関数内で、I/O 要求の完了後に取得された I/O 要求バッファーにはアクセスできないことを指定します。 可能なバッファー アクセス方法として機能する DDI は 14 個あります。 |
|
BufAfterReqCompletedReadA ルールは、EvtIoRead コールバック関数内で、I/O 要求の完了後に取得された I/O 要求バッファーにはアクセスできないことを指定します。 可能なバッファー アクセス方法として機能する DDI は 14 個あります。 |
|
BufAfterReqCompletedWrite ルールは、EvtIoWrit コールバック関数内で、I/O 要求の完了後に取得された I/O 要求バッファーにはアクセスできないことを指定します。 |
|
BufAfterReqCompletedWriteA ルールは、EvtIoWrit コールバック関数内で、I/O 要求の完了後に取得された I/O 要求バッファーにはアクセスできないことを指定します。 |
|
ChildDeviceInitApi ルールは、子デバイスの場合、ドライバーが子デバイス オブジェクトの WdfDeviceCreate メソッドを呼び出す前に、フレームワーク デバイス オブジェクトの初期化メソッドを呼び出す必要があることを指定します。 |
|
ControDeviceDeleted ルールは、PnP ドライバーがコントロール デバイス オブジェクトを作成する場合、ドライバーがアンロードする前に、クリーンアップ コールバック関数のいずれかでコントロール デバイス オブジェクトを削除する必要があることを指定します。 |
|
ControlDeviceInitAPI ルールでは、コントロール デバイスの WDFDEVICE_INIT 構造体を設定する WdfControlDeviceInitAllocate およびその他のすべてのデバイス オブジェクト初期化 DDI を、コントロール デバイスの WdfDeviceCreate の前に呼び出さなければならないことを指定します。 |
|
CtlDeviceFinishInitDeviceAdd ルールは、ドライバーが EvtDriverDeviceAdd コールバック関数でコントロール デバイス オブジェクトを作成する場合、 WdfControlFinishInitializing をデバイスが作成された後、 および EvtDriverDeviceAdd コールバック関数から終了する前に、呼び出さなければならないことを規定します。 このルールは、PnP 以外のドライバーには適用されません。 |
|
CtlDeviceFinishInitDrEntry ルールは、ドライバーが DriverEntry コールバック関数でコントロール デバイス オブジェクトを作成する場合、デバイスが作成された後、および EvtDriverDeviceAdd コールバック関数から終了する前に、WdfControlFinishInitializing を呼び出さなければならないことを指定します。 このルールは、PnP 以外のドライバーには適用されません。 |
|
DeviceCreateFail ルールは、 WdfDeviceCreate の呼び出しに失敗したときに EVT_WDF_DRIVER_DEVICE_ADD がエラー状態を返すように指定します。 |
|
DeviceInitAllocate ルールは、PDO デバイスまたはコントロールデバイスオブジェクトの場合、フレームワークのデバイスオブジェクト初期化メソッド WdfPdoInitAllocate または、 WdfControlDeviceInitAllocate ドライバーが WdfDeviceCreateを呼び出す前に呼び出す必要があることを指定します。 |
|
FDO デバイスの場合、ドライバーがデバイス オブジェクトの WdfDeviceCreate メソッドを呼び出す前に、フレームワーク デバイス オブジェクト初期化メソッドとフレームワーク FDO 初期化メソッドを呼び出さなければなりません。 |
|
DoubleDeviceInitFree ルールは、ドライバーがデバイス初期化構造体を 2 回解放しないように指定します。 |
|
DriverCreate ルールは、カーネルモードドライバーフレームワーク(KMDF)を使用するドライバーは、 WdfDriverCreate メソッドを呼び出して、フレームワークドライバーオブジェクトを DriverEntry ルーチンの中から作成しなければならないことを規定しています。 |
|
InitFreeDeviceCallback ルールは、ドライバーが新しいフレームワーク デバイス オブジェクトの初期化中にエラーが発生した場合、またドライバーが WdfControlDeviceInitAllocate への呼び出しから WDFDEVICE_INIT 構造体を受け取った場合に、ドライバーが WdfDeviceInitFree を呼び出さなければならないことを指定します。 |
|
InitFreeDeviceCreate ルールは、ドライバが WdfDeviceInitFreeWdfDeviceCreate の代わりに呼び出さなければならないことを規定しています。 それは、デバイスオブジェクトの初期化メソッドのいずれかでエラーが発生した場合、およびドライバが WDFDEVICE_INIT 構造体を WdfControlDeviceInitAllocateの呼び出しから受け取った場合です。. |
|
InitFreeDeviceCreateType2 ルールは、ドライバーが WdfDeviceInitFree を呼び出した後に WdfDeviceCreate を呼び出してはならないことを指定します。 |
|
InitFreeDeviceCreateType4 ルールは、ドライバーが WdfDeviceInitFree を呼び出さなければならないことを規定しています。 それは、ドライバーが WdfDeviceCreate を呼び出している間にエラーが発生した場合、およびドライバーが WDFDEVICE_INIT 構造体を WdfControlDeviceInitAllocateの呼び出しによって受け取った場合です。 |
|
InitFreeNull ルールは、 NULL ポインターを使用して WDFDEVICE_INIT 構造体を呼び出すことはできないことを規定しています。 |
|
MdlAfterReqCompletedIntIoctl ルールは、EvtIoInternalDeviceControl コールバック関数内で、I/O 要求の完了後にメモリ記述子リスト (MDL) にアクセスできないことを指定します。 |
|
MdlAfterReqCompletedIntIoctlA ルールは、 EvtIoInternalDeviceControl コールバック関数内で、I/O 要求の完了後にメモリ記述子リスト (MDL) にアクセスできないことを規定しています。 |
|
MdlAfterReqCompletedIoctl ルールは、 EvtIoDeviceControl ールバック関数内で、I/O 要求の完了後にメモリ記述子リスト (MDL) にアクセスできないことを規定します。 |
|
MdlAfterReqCompletedIoctlA ルールは、 EvtIoDeviceControl コールバック関数内で、I/O 要求の完了後にメモリ記述子リスト (MDL) にアクセスできないことを既定します。 |
|
MdlAfterReqCompletedRead ルールは、 EvtIoRead コールバック関数内で、I/O 要求の完了後に取得されたメモリ記述子リスト (MDL) オブジェクトにアクセスできないことを規定します。 |
|
MdlAfterReqCompletedReadA ルールは、 EvtIoRead コールバック関数内で、I/O 要求の完了後に取得されたメモリ記述子リスト (MDL) オブジェクトにアクセスできないことを指定します。 |
|
MdlAfterReqCompletedWrite ルールは、 EvtIoWrite コールバック関数内で、I/O 要求の完了後に取得されたメモリ記述子リスト (MDL) オブジェクトにアクセスできないことを規定します。 |
|
MdlAfterReqCompletedWriteA ルールは、 EvtIoWrite コールバック関数内で、I/O 要求の完了後に取得されたメモリ記述子リスト (MDL) オブジェクトにアクセスできないことを指定します。 |
|
MemAfterReqCompletedIntIoctl ルールは、 EvtIoInternalDeviceControl コールバック関数内で、I/O 要求の完了後にフレームワーク メモリ オブジェクトにアクセスできないことを規定します。 |
|
MemAfterReqCompletedIntIoctlA ルールは、 EvtIoInternalDeviceControl コールバック関数内で、I/O 要求の完了後にフレームワーク メモリ オブジェクトにアクセスできないことを規定します。 |
|
MemAfterReqCompletedIoctl ルールは、 EvtIoDeviceControl コールバック関数内で、I/O 要求の完了後にフレームワーク メモリ オブジェクトにアクセスできないことを規定します。 |
|
MemAfterReqCompletedIoctlA ルールは、 EvtIoDeviceControl コールバック関数内で、I/O 要求の完了後にフレームワーク メモリ オブジェクトにアクセスできないことを規定します。 |
|
MemAfterReqCompletedRead ルールは、 EvtIoRead コールバック関数内で、I/O 要求の完了後にフレームワーク メモリ オブジェクトにアクセスできないことを規定します。 |
|
MemAfterReqCompletedReadA ルールは、 EvtIoRead コールバック関数内で、I/O 要求の完了後にフレームワーク メモリ オブジェクトにアクセスできないことを規定します。 |
|
MemAfterReqCompletedWrite ルールは、 EvtIoWrite コールバック関数内で、I/O 要求の完了後にフレームワーク メモリ オブジェクトにアクセスできないことを規定します。 |
|
MemAfterReqCompletedWriteA ルールは、 EvtIoWrite コールバック関数内で、I/O 要求の完了後にフレームワーク メモリ オブジェクトにアクセスできないことを規定します。 |
|
NullCheck ルールは、ドライバー コード内の NULL 値が後でドライバーで逆参照されないことを確認します。 次のいずれかの条件に該当する場合、このルールは欠陥を報告します。
NullCheck ルール違反では、最も関連性の高いコード ステートメントがトレース ツリー ウィンドウで強調表示されます。 レポート出力の操作の詳細については、「静的ドライバー検証ツールのレポート」および「トレース ビューアーの概要」を参照してください。 |
|
PdoDeviceInitAPI ルールは、ドライバーが PDO の WdfDeviceCreate を呼び出す前に、物理デバイス オブジェクト (PDO) の WDFDEVICE_INIT 構造体を設定する WdfPdoInitAllocate およびその他のすべてのデバイス オブジェクト初期化 DDI を呼び出す必要があることを規定しています。 |
|
PdoInitFreeDeviceCallback ルールは、ドライバーがフレームワーク デバイス オブジェクト初期化関数を呼び出すときにエラーが発生した場合に、ドライバーが WdfDeviceInitFree を呼び出す必要があることを規定します。 |
|
PdoInitFreeDeviceCreate ルールは、ドライバーは WdfDeviceInitFreeWdfDeviceCreate の代わりに呼び出さなければならないと規定しています。 それは、デバイスオブジェクトの初期化関数のいずれかでエラーが発生し、ドライバーが WdfPdoInitAllocateの呼び出しからWDFDEVICE_INIT構造体を受け取った場合です。 |
|
PdoInitFreeDeviceCreateType2 ルールは、ドライバーが WdfDeviceInitFree を呼び出した後に WdfDeviceCreate を呼び出してはならないことを指定します。 |
|
PdoInitFreeDeviceCreateType4 規則は、ドライバーが WdfDeviceCreate を呼び出すときにエラーが発生した場合に、ドライバーが WdfDeviceInitFree を呼び出す必要があることを指定します。 |
|
ControlDeviceInitAllocate ルールは、制御デバイスオブジェクトに対して、 ドライバーが、フレームワークのデバイスオブジェクト初期化メソッド WdfControlDeviceInitAllocate を先に呼び出してから、 WdfDeviceCreateを呼び出す必要があることを規定しています。 |
|
InputBufferAPI ルールは、バッファー取得用の適切な DDI が EvtIoReadコールバック関数で使用されることを指定します。 EvtIoRead コールバック関数内では、バッファー取得のために次の DDI を呼び出すことはできません。 |
DDI 使用量ルール セットを選択するには
Microsoft Visual Studio でドライバー プロジェクト (.vcxProj) を選択します。 Driver メニューから Launch Static Driver Verifier… をクリックします。
ルール タブをクリックします。 ルール セット で、 DDIUsage を選択します。
Visual Studio の開発者コマンド プロンプト ウィンドウから既定のルール セットを選択するには、 /check オプションで DDIUsage.sdv を指定します。 次に例を示します。
msbuild /t:sdv /p:Inputs="/check:DDIUsage.sdv" mydriver.VcxProj /p:Configuration="Win8 Release" /p:Platform=Win32
詳細については、「静的ドライバー検証ツールを使用して、ドライバーの欠陥を検出する」と「静的ドライバー検証ツールコマンド (MSBuild)」を参照してください。