Sdílet prostřednictvím


Sada pravidel použití DDI (KMDF)

Pomocí těchto pravidel ověřte, že ovladač správně používá DDI služby KMDF.

V této části

Téma Popis

BufAfterReqCompletedIoctl

Pravidlo BufAfterReqCompletedIoctl určuje, že v rámci funkce zpětného volání EvtIoDeviceControl nelze přistupovat k vyrovnávací paměti V/V požadavku poté, co je dokončen.

BufAfterReqCompletedIntIoctl

Pravidlo BufAfterReqCompletedIntIoctl určuje, že po dokončení požadavku nelze získat přístup k jeho vyrovnávací paměti (pouze uvnitř funkce zpětného volání EvtIoInternalDeviceControl ). Vyrovnávací paměť se načte voláním WdfRequestRetrieveOutputBuffer nebo WdfRequestRetrieveUnsafeUserOutputBuffer nebo WdfRequestRetrieveInputBuffer nebo WdfRequestRetrieveUnsafeUserInputBuffer.

BufAfterReqCompletedIntIoctlA

Pravidlo BufAfterReqCompletedIntIoctlA ověřuje, že po dokončení požadavku není k jeho vyrovnávací paměti možné přistupovat (pouze při zpětném volání EvtIoInternalDeviceControl). Vyrovnávací paměť byla načtena voláním WdfRequestRetrieveInputBuffer nebo WdfRequestRetrieveOutputBuffer nebo WdfRequestRetrieveUnsafeUserInputBuffer nebo WdfRequestRetrieveUnsafeUserOutputBuffer.

BufAfterReqCompletedIoctlA

Pravidlo BufAfterReqCompletedIoctlA určuje, že v rámci funkce zpětného volání EvtIoDeviceControl nelze přistupovat k vyrovnávací paměti získané z I/O operace po dokončení této operace.

BufAfterReqCompletedRead

Pravidlo BufAfterReqCompletedRead určuje, že v rámci funkce zpětného volání EvtIoRead nelze po dokončení V/V požadavku načíst vyrovnávací paměť vstupně-výstupních požadavků. Existují 14 DDI, které slouží jako možné metody přístupu k vyrovnávací paměti.

BufAfterReqCompletedReadA

Pravidlo BufAfterReqCompletedReadA určuje, že v rámci funkce zpětného volání EvtIoRead nelze po dokončení V/V požadavku přistupovat k vyrovnávací paměti. Existují 14 DDI, které slouží jako možné metody přístupu k vyrovnávací paměti.

BufAfterReqCompletedWrite

Pravidlo BufAfterReqCompletedWrite specifikuje, že v rámci funkce zpětného volání EvtIoWrite nelze přistupovat k vyrovnávací paměti V/V po dokončení V/V požadavku.

BufAfterReqCompletedWriteA

Pravidlo BufAfterReqCompletedWriteA určuje, že v rámci funkce zpětného volání EvtIoWrite nelze přistupovat k vyrovnávací paměti V/V požadavku po jeho dokončení.

ChildDeviceInitApi

Pravidlo ChildDeviceInitApi určuje, že u podřízeného zařízení musí být framework metody inicializace objektu zařízení zavolány předtím, než ovladač zavolá metodu WdfDeviceCreate pro podřízený objekt zařízení.

ControlDeviceDeleted

Pravidlo ControDeviceDeleted určuje, že pokud ovladač PnP vytvoří řídicí objekt zařízení, musí tento objekt být odstraněn v některé z funkcí zpětného volání pro čištění, a to před uvolněním ovladače.

ControlDeviceInitAPI

Pravidlo ControlDeviceInitAPI určuje, že WdfControlDeviceInitAllocate a všechny ostatní inicializační DDI objektů zařízení, které nastaví strukturu WDFDEVICE_INIT pro řídicí zařízení, musí být zavolány před WdfDeviceCreate pro řídicí zařízení.

CtlDeviceFinishInitDeviceAdd

Pravidlo CtlDeviceFinishInitDeviceAdd určuje, že pokud ovladač vytvoří řídicí objekt zařízení ve funkci zpětného volání EvtDriverDeviceAdd, musí po vytvoření zařízení a před ukončením funkce zpětného volání EvtDriverDeviceAdd volat WdfControlFinishInitializing. Toto pravidlo se nevztahuje na ovladače jiného typu než PnP.

CtlDeviceFinishInitDrEntry

Pravidlo CtlDeviceFinishInitDrEntry určuje, že pokud ovladač vytvoří řídicí objekt zařízení ve funkci zpětného volání DriverEntry , musí zavolat WdfControlFinishInitializing po vytvoření zařízení a před ukončením z funkce zpětného volání EvtDriverDeviceAdd . Toto pravidlo se nevztahuje na ovladače jiného typu než PnP.

DeviceCreateFail

Pravidlo DeviceCreateFail určuje, že EVT_WDF_DRIVER_DEVICE_ADD vrátí stav chyby, když volání WdfDeviceCreate selže.

DeviceInitAllocate

Pravidlo DeviceInitAllocate určuje, že pro zařízení PDO nebo řídicí objekt zařízení musí být metody inicializace objektů zařízení WdfPdoInitAllocate nebo WdfControlDeviceInitAllocate zavolány předtím, než ovladač zavolá WdfDeviceCreate.

DeviceInitAPI

Pro zařízení FDO musí být zavolány metody inicializace FDO a metody inicializace objektů zařízení architektury před voláním metody WdfDeviceCreate pro objekt zařízení ovladače.

DoubleDeviceInitFree

Pravidlo DoubleDeviceInitFree určuje, že ovladače by neměly uvolnit strukturu inicializace zařízení dvakrát.

DriverCreate

Pravidlo DriverCreate určuje, že ovladač používající rozhraní KMDF (Kernel Mode Driver Framework) musí volat metodu WdfDriverCreate k vytvoření objektu ovladače architektury z jeho rutiny DriverEntry .

InitFreeDeviceCallback

Pravidlo InitFreeDeviceCallback určuje, že ovladač musí volat WdfDeviceInitFree , pokud ovladač při inicializaci nového objektu zařízení rozhraní dojde k chybě, a pokud ovladač obdržel strukturu WDFDEVICE_INIT z volání WdfControlDeviceInitAllocate.

InitFreeDeviceCreate

Pravidlo InitFreeDeviceCreate určuje, že ovladač musí volat WdfDeviceInitFree místo WdfDeviceCreate , pokud dojde k chybě v některé z metod inicializace objektu zařízení a pokud ovladač obdržel strukturu WDFDEVICE_INIT z volání WdfControlDeviceInitAllocate.

InitFreeDeviceCreateType2

Pravidlo InitFreeDeviceCreateType2 určuje, že ovladač nesmí volat WdfDeviceCreate po volání WdfDeviceInitFree.

InitFreeDeviceCreateType4

Pravidlo InitFreeDeviceCreateType4 určuje, že ovladač musí volat WdfDeviceInitFree , pokud ovladač zaznamená chybu při volání WdfDeviceCreate a pokud ovladač obdržel strukturu WDFDEVICE_INIT z volání WdfControlDeviceInitAllocate.

InitFreeNull

Pravidlo InitFreeNull určuje, že DDI přijímající PWDFDEVICE_INIT jako parametr nelze volat pomocí ukazatele NULL na strukturu WDFDEVICE_INIT .

MdlAfterReqCompletedIntIoctl

Pravidlo MdlAfterReqCompletedIntIoctl určuje, že v rámci funkce zpětného volání EvtIoInternalDeviceControl nelze po dokončení V/V požadavku získat přístup k seznamu popisovačů paměti (MDL).

MdlAfterReqCompletedIntIoctlA

Pravidlo MdlAfterReqCompletedIntIoctlA určuje, že v rámci funkce zpětného volání EvtIoInternalDeviceControl nelze po dokončení V/V požadavku získat přístup k seznamu popisovačů paměti (MDL).

MdlAfterReqCompletedIoctl

Pravidlo MdlAfterReqCompletedIoctl určuje, že v rámci funkce zpětného volání EvtIoDeviceControl nelze po dokončení V/V požadavku získat přístup k seznamu popisovačů paměti (MDL).

MdlAfterReqCompletedIoctlA

Pravidlo MdlAfterReqCompletedIoctlA určuje, že v rámci funkce zpětného volání EvtIoDeviceControl nelze po dokončení V/V požadavku získat přístup k seznamu popisovačů paměti (MDL).

MdlAfterReqCompletedRead

Pravidlo MdlAfterReqCompletedRead určuje, že v rámci funkce zpětného volání EvtIoRead nelze získat přístup k objektu popisovače paměti (MDL) po dokončení V/V požadavku.

MdlAfterReqCompletedReadA

Pravidlo MdlAfterReqCompletedReadA určuje, že v rámci funkce zpětného volání EvtIoRead nelze získat přístup k objektu popisovače paměti (MDL) po dokončení V/V požadavku.

MdlAfterReqCompletedWrite

Pravidlo MdlAfterReqCompletedWrite určuje, že v rámci funkce zpětného volání EvtIoWrite nelze získat přístup k objektu popisovače paměti (MDL) po dokončení V/V požadavku.

MdlAfterReqCompletedWriteA

Pravidlo MdlAfterReqCompletedWriteA určuje, že v rámci funkce zpětného volání EvtIoWrite nelze získat přístup k objektu popisovače paměti (MDL) po dokončení V/V požadavku.

MemAfterReqCompletedIntIoctl

Pravidlo MemAfterReqCompletedIntIoctl určuje, že v rámci funkce zpětného volání EvtIoInternalDeviceControl nelze po dokončení V/V požadavku přistupovat k paměťovému objektu architektury.

MemAfterReqCompletedIntIoctlA

Pravidlo MemAfterReqCompletedIntIoctlA určuje, že v rámci funkce zpětného volání EvtIoInternalDeviceControl nelze přistupovat k objektu paměti rámce po dokončení V/V požadavku.

MemAfterReqCompletedIoctl

Pravidlo MemAfterReqCompletedIoctl určuje, že po dokončení V/V požadavku nelze v rámci funkce zpětného volání EvtIoDeviceControl přistupovat k objektu paměti architektury.

MemAfterReqCompletedIoctlA

Pravidlo MemAfterReqCompletedIoctlA určuje, že v rámci funkce zpětného volání EvtIoDeviceControl nelze přistupovat k paměťovému objektu prostředí po dokončení V/V požadavku.

MemAfterReqCompletedRead

Pravidlo MemAfterReqCompletedRead určuje, že v rámci funkce zpětného volání EvtIoRead nelze získat přístup k objektu paměti architektury po dokončení V/V požadavku.

MemAfterReqCompletedReadA

Pravidlo MemAfterReqCompletedReadA určuje, že v rámci funkce zpětného volání EvtIoRead nelze získat přístup k objektu paměti architektury po dokončení V/V požadavku.

MemAfterReqCompletedWrite

Pravidlo MemAfterReqCompletedWrite určuje, že v rámci funkce zpětného volání EvtIoWrite nelze objekt paměti architektury získat přístup po dokončení V/V požadavku.

MemAfterReqCompletedWriteA

Pravidlo MemAfterReqCompletedWriteA určuje, že v rámci funkce zpětného volání EvtIoWrite nelze získat přístup k objektu paměti architektury po dokončení V/V požadavku.

NullCheck

Pravidlo NullCheck ověřuje, zda hodnota NULL uvnitř kódu ovladače není později dereferencována. Toto pravidlo hlásí vadu, pokud je splněná některé z těchto podmínek:

  • Existuje přiřazení hodnoty NULL, které je později dereferencováno.
  • V ovladači existuje globální proměnná/parametr procedury, který může mít hodnotu NULL a je později dereferencován. V ovladači je explicitní kontrola, která naznačuje, že počáteční hodnota ukazatele může být NULL.

V případě porušení pravidel NullCheck jsou v podokně stromu trasování zvýrazněny nejrelevantnější příkazy kódu. Další informace o práci s výstupem sestavy naleznete v tématu Static Driver Verifier Report a Understanding the Trace Viewer.

PdoDeviceInitAPI

Pravidlo PdoDeviceInitAPI určuje, že WdfPdoInitAllocate a všechny ostatní DDI pro inicializaci zařízení, které nastavují strukturu WDFDEVICE_INIT pro fyzický objekt zařízení (PDO), musí být volány před voláním ovladačem WdfDeviceCreate pro PDO.

PdoInitFreeDeviceCallback

Pravidlo PdoInitFreeDeviceCallback určuje, že ovladač musí volat WdfDeviceInitFree , pokud dojde k chybě při volání jakékoli funkce inicializace objektu zařízení rozhraní.

PdoInitFreeDeviceCreate

Pravidlo PdoInitFreeDeviceCreate určuje, že ovladač musí volat WdfDeviceInitFree místo WdfDeviceCreate , pokud dojde k chybě v některé z inicializačních funkcí zařízení a pokud ovladač obdržel strukturu WDFDEVICE_INIT z volání WdfPdoInitAllocate.

PdoInitFreeDeviceCreateType2

Pravidlo PdoInitFreeDeviceCreateType2 určuje, že ovladač nesmí volat WdfDeviceCreate po volání WdfDeviceInitFree.

PdoInitFreeDeviceCreateType4

Pravidlo PdoInitFreeDeviceCreateType4 určuje, že ovladač musí volat WdfDeviceInitFree , pokud dojde k chybě, když ovladač volá WdfDeviceCreate.

ControlDeviceInitAllocate

Pravidlo ControlDeviceInitAllocate určuje, že pro objekt řídicího zařízení musí ovladač volat metodu inicializace objektu zařízení frameworku WdfControlDeviceInitAllocate předtím, než ovladač volá WdfDeviceCreate.

InputBufferAPI

Pravidlo InputBufferAPI určuje, že správné identifikátory DDI pro načtení vyrovnávací paměti se používají ve funkci zpětného volání EvtIoRead. V rámci funkce zpětného volání EvtIoRead nelze pro načtení vyrovnávací paměti volat následující DDI:

Výběr sady pravidel využití DDI

  1. Vyberte projekt ovladače (.vcxProj) v aplikaci Microsoft Visual Studio. V nabídce Ovladač klepněte na Spustit statický ověřovatel ovladače....

  2. Klikněte na kartu Pravidla . V části Sady pravidel vyberte DDIUsage.

    Pokud chcete vybrat výchozí sadu pravidel z okna příkazového řádku pro vývojáře sady Visual Studio, zadejte DDIUsage.sdv s možností /check . Například:

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

    Další informace naleznete v tématu Použití statického ověřovače ovladačů k nalezení vad v ovladačích a příkazy MSBuild (Statický ověřovač ovladačů).