DDI 使用規則集 (KMDF)

使用這些規則來確認您的驅動程式正確使用 KMDF DDI。

本節中

主題 說明

BufAfterReqCompletedIoctl

BufAfterReqCompletedIoctl 規則會指定在 EvtIoDeviceControl 回呼函式內,在 I/O 要求完成之後,無法存取擷取的 I/O 要求緩衝區。

BufAfterReq已完成IntIoctl

BufAfterReqCompletedIntIoctl 規則會指定要求完成之後,無法存取其緩衝區 (僅限 EvtIoInternalDeviceControl 回呼函式) 。 要擷取緩衝區,可以呼叫 WdfRequestRetrieveOutputBuffer、WdfRequestRetrieveUnsafeUserOutputBuffer、WdfRequestRetrieveInputBuffer 或 WdfRequestRetrieveUnsafeUserInputBuffer。

BufAfterReq已完成IntIoctlA

BufAfterReqCompletedIntIoctlA 規則會確認在要求完成之後,不可存取該要求的緩衝區(僅限於 EvtIoInternalDeviceControl 回呼中)。 緩衝區是藉由呼叫 WdfRequestRetrieveInputBuffer 或 WdfRequestRetrieveOutputBuffer 或 WdfRequestRetrieveUnsafeUserInputBuffer 或 WdfRequestRetrieveUnsafeUserOutputBuffer 來擷取。

BufAfterReq已完成IoctlA

BufAfterReqCompletedIoctlA 規則會指定在 EvtIoDeviceControl 回呼函式內,在 I/O 要求完成之後,無法存取擷取的 I/O 要求緩衝區。

BufAfterReq已完成閱讀

BufAfterReqCompletedRead 規則會指定在 EvtIoRead 回呼函式內,在 I/O 要求完成之後,無法存取擷取的 I/O 要求緩衝區。 有 14 個 DDI 可作為可能的緩衝區存取方法。

BufAfterReq已完成閱讀A

BufAfterReqCompletedReadA 規則會指定在 EvtIoRead 回呼函式內,在 I/O 要求完成之後,無法存取擷取的 I/O 要求緩衝區。 有 14 個 DDI 可作為可能的緩衝區存取方法。

BufAfterReqCompletedWrite

BufAfterReqCompletedWrite 規則會指定在 EvtIoWrite 回呼函式內,在 I/O 要求完成之後,無法存取擷取的 I/O 要求緩衝區。

BufAfterReqCompletedWriteA

BufAfterReqCompletedWriteA 規則指定在 EvtIoWrite 回呼函式內,在 I/O 要求完成之後,無法存取擷取的 I/O 要求緩衝區。

ChildDeviceInitApi

ChildDeviceInitApi 規則會指定針對子裝置,驅動程式呼叫子裝置物件的 WdfDeviceCreate 方法之前,必須先呼叫架構裝置物件初始化方法。

控制裝置已刪除

ControDeviceDeleted 規則指定如果 PnP 驅動程式建立控制裝置物件,驅動程式必須先刪除其中一個清除回呼函式中的控制裝置物件,才能卸載驅動程式。

ControlDeviceInitAPI

ControlDeviceInitAPI 規則指定,需要先呼叫 WdfControlDeviceInitAllocate 和所有用於初始化控制裝置的裝置物件初始化 DDI,以設定 WDFDEVICE_INIT 結構,才能為控制裝置呼叫 WdfDeviceCreate。

CtlDeviceFinishInitDeviceAdd

CtlDeviceFinishInitDeviceAdd 規則指定,如果驅動程式在 EvtDriverDeviceAdd 回呼函式中建立控制裝置物件,則必須在建立裝置之後,以及從 EvtDriverDeviceAdd 回呼函式結束之前呼叫 WdfControlFinishInitializing。 此規則不適用於非 PnP 驅動程式。

CtlDeviceFinishInitDrEntry

CtlDeviceFinishInitDrEntry 規則指定,如果驅動程式在 DriverEntry 回呼函式中建立控制裝置物件,則必須在建立裝置之後,以及從 EvtDriverDeviceAdd 回呼函式結束之前呼叫 WdfControlFinishInitializing。 此規則不適用於非 PnP 驅動程式。

裝置建立失敗

DeviceCreateFail 規則會指定當呼叫 WdfDeviceCreate 失敗時,EVT_WDF_DRIVER_DEVICE_ADD會傳回錯誤狀態。

DeviceInitAllocate

DeviceInitAllocate 規則會指定針對 PDO 裝置或控制裝置物件,必須先呼叫架構裝置物件初始化方法 WdfPdoInitAllocate 或 WdfControlDeviceInitAllocate ,驅動程式呼叫 WdfDeviceCreate。

裝置初始API

針對 FDO 裝置,驅動程式呼叫裝置物件的 WdfDeviceCreate 方法之前,必須先呼叫架構裝置物件初始化方法和架構 FDO 初始化方法。

DoubleDeviceInitFree

DoubleDeviceInitFree 規則指定驅動程式不應該釋放裝置初始化結構兩次。

驅動程式創建

DriverCreate 規則指定使用核心模式驅動程式架構 (KMDF) 的驅動程式必須呼叫 WdfDriverCreate 方法,才能從其 DriverEntry 常式內建立架構驅動程式物件。

InitFreeDevice回呼

InitFreeDeviceCallback 規則會指定驅動程式在初始化新的架構裝置物件時遇到錯誤,以及驅動程式從呼叫 WdfControlDeviceInitAllocate 收到WDFDEVICE_INIT結構時,驅動程式必須呼叫 WdfDeviceInitFree。

InitFreeDeviceCreate

InitFreeDeviceCreate 規則指定驅動程式必須呼叫 WdfDeviceInitFree,而不是 WdfDeviceCreate,如果其中一個裝置物件初始化方法發生錯誤,而且驅動程式從呼叫 WdfControlDeviceInitAllocate 收到WDFDEVICE_INIT結構。

InitFreeDeviceCreateType2

InitFreeDeviceCreateType2 規則會指定驅動程式在呼叫 WdfDeviceInitFree 之後不得呼叫 WdfDeviceCreate。

InitFreeDeviceCreateType4

InitFreeDeviceCreateType4 規則指定驅動程式在呼叫 WdfDeviceCreate 時遇到錯誤,而且驅動程式從呼叫 WdfControlDeviceInitAllocate 收到WDFDEVICE_INIT結構時,驅動程式必須呼叫 WdfDeviceInitFree。

InitFreeNull

InitFreeNull 規則會指定接收PWDFDEVICE_INIT作為參數的 DDI 無法使用WDFDEVICE_INIT結構的 NULL 指標來呼叫。

MdlAfterReq已完成IntIoctl

MdlAfterReqCompletedIntIoctl 規則會指定在 EvtIoInternalDeviceControl 回呼函式內,無法在 I/O 要求完成之後存取記憶體描述元清單 (MDL) 。

MdlAfterReq已完成IntIoctlA

MdlAfterReqCompletedIntIoctlA 規則會指定在 EvtIoInternalDeviceControl 回呼函式內,I/O 要求完成之後,無法存取記憶體描述元清單 (MDL) 。

MdlAfterReqCompletedIoctl

MdlAfterReqCompletedIoctl 規則會指定在 EvtIoDeviceControl 回呼函式內,在 I/O 要求完成之後,無法存取記憶體描述元清單 (MDL) 。

MdlAfterReq已完成IoctlA

MdlAfterReqCompletedIoctlA 規則會指定在 EvtIoDeviceControl 回呼函式內,在 I/O 要求完成之後,無法存取記憶體描述元清單 (MDL) 。

MdlAfterReqCompletedRead

MdlAfterReqCompletedRead 規則會指定在 EvtIoRead 回呼函式內,在 I/O 要求完成之後,無法存取擷取的記憶體描述元清單 (MDL) 物件。

MdlAfterReq已完成讀取A

MdlAfterReqCompletedReadA 規則會指定在 EvtIoRead 回呼函式內,在 I/O 要求完成之後,無法存取擷取的記憶體描述元清單 (MDL) 物件。

MdlAfterReqCompletedWrite

MdlAfterReqCompletedWrite 規則會指定在 EvtIoWrite 回呼函式內,在 I/O 要求完成之後,無法存取擷取的記憶體描述元清單 (MDL) 物件。

MdlAfterReqCompletedWriteA

MdlAfterReqCompletedWriteA 規則會指定在 EvtIoWrite 回呼函式內,在 I/O 要求完成之後,無法存取擷取的記憶體描述元清單 (MDL) 物件。

MemAfterReq已完成IntIoctl

MemAfterReqCompletedIntIoctl 規則會指定在 EvtIoInternalDeviceControl 回呼函式內,在 I/O 要求完成之後,無法存取架構記憶體物件。

MemAfterReq已完成IntIoctlA

MemAfterReqCompletedIntIoctlA 規則會指定在 EvtIoInternalDeviceControl 回呼函式內,在 I/O 要求完成之後,無法存取架構記憶體物件。

MemAfterReqCompletedIoctl

MemAfterReqCompletedIoctl 規則會指定在 EvtIoDeviceControl 回呼函式內,在 I/O 要求完成之後,無法存取架構記憶體物件。

MemAfterReq已完成IoctlA

MemAfterReqCompletedIoctlA 規則會指定在 EvtIoDeviceControl 回呼函式內,I/O 要求完成之後,無法存取架構記憶體物件。

MemAfterReq已完成讀取

MemAfterReqCompletedRead 規則會指定在 EvtIoRead 回呼函式內,I/O 要求完成之後,無法存取架構記憶體物件。

MemAfterReq已完成ReadA

MemAfterReqCompletedReadA 規則會指定在 EvtIoRead 回呼函式內,I/O 要求完成之後,無法存取架構記憶體物件。

MemAfterReqCompleted寫入

MemAfterReqCompletedWrite 規則會指定在 EvtIoWrite 回呼函式內,I/O 要求完成之後,無法存取架構記憶體物件。

MemAfterReqCompletedWriteA

MemAfterReqCompletedWriteA 規則會指定在 EvtIoWrite 回呼函式內,I/O 要求完成之後,無法存取架構記憶體物件。

空值檢查

NullCheck 規則會驗證驅動程式程式碼中的 NULL 值稍後在驅動程式中不會被解引用。 如果下列任一條件為true,則此規則會報告缺陷:

  • 稍後會解除參考一個被指派為 NULL 的變數。
  • 驅動程式中有一個全域變數或參數,這個變數或參數的初始值可能為 Null,而且稍後可能會被取消參考。驅動程式中有一個明確的檢查指出指標的初始值可能是 Null。

如果 NullCheck 規則違規,最相關的程式碼陳述式會在追蹤樹狀結構窗格中醒目提示。 如需使用報表輸出的詳細資訊,請參閱 靜態驅動程式驗證器報表 和 瞭解追蹤檢視器。

PdoDeviceInitAPI

PdoDeviceInitAPI 規則指定,在驅動程式呼叫實體裝置物件(PDO)的 WdfDeviceCreate 之前,必須先呼叫 WdfPdoInitAllocate 和所有其他為 PDO 設定 WDFDEVICE_INIT 結構的裝置物件初始化 DDI。

PdoInitFreeDevice回呼

PdoInitFreeDeviceCallback 規則會指定驅動程式在呼叫任何架構裝置物件初始化函式時發生錯誤時,驅動程式必須呼叫 WdfDeviceInitFree。

PdoInitFreeDeviceCreate

PdoInitFreeDeviceCreate 規則指定驅動程式必須呼叫 WdfDeviceInitFree,而不是 WdfDeviceCreate,如果其中一個裝置物件初始化函式發生錯誤,而且驅動程式從呼叫 WdfPdoInitAllocate 收到WDFDEVICE_INIT結構。

PdoInitFreeDeviceCreateType2

PdoInitFreeDeviceCreateType2 規則會指定驅動程式在呼叫 WdfDeviceInitFree 之後,不得呼叫 WdfDeviceCreate。

PdoInitFreeDeviceCreateType4

PdoInitFreeDeviceCreateType4 規則會指定驅動程式在呼叫 WdfDeviceCreate 時發生錯誤時,驅動程式必須呼叫 WdfDeviceInitFree。

ControlDeviceInitAllocate

ControlDeviceInitAllocate 規則會指定針對控制裝置物件,驅動程式必須先呼叫架構裝置物件初始化方法 WdfControlDeviceInitAllocate ,再呼叫 WdfDeviceCreate。

輸入緩衝區API

InputBufferAPI 規則指定要在 EvtIoRead 回呼函式中使用正確的緩衝區檢索 DDI。 在 EvtIoRead 回呼函式內,無法呼叫下列 DDI 來擷取緩衝區:

選取 DDI 使用規則集

  1. 在 Visual Studio Microsoft中選取您的驅動程式專案 (.vcxProj)。 從 驅動程式 選單中,點擊 啟動靜態驅動程式驗證程式…。

  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)。