Freigeben über


DDI-Nutzungsregelsatz (KMDF)

Verwenden Sie diese Regeln, um zu überprüfen, ob Ihr Treiber KMDF-DDIs ordnungsgemäß verwendet.

In diesem Abschnitt

Thema BESCHREIBUNG

BufAfterReqCompletedIoctl

Die BufAfterReqCompletedIoctl-Regel gibt an, dass innerhalb der Rückruffunktion EvtIoDeviceControl auf den abgerufenen E/A-Anforderungspuffer nach Abschluss der E/A-Anforderung nicht zugegriffen werden kann.

BufAfterReqCompletedIntIoctl

Die BufAfterReqCompletedIntIoctl-Regel gibt an, dass nach Abschluss einer Anforderung nicht auf den Puffer zugegriffen werden kann (nur innerhalb der Rückruffunktion EvtIoInternalDeviceControl ). Der Puffer wird abgerufen, indem WdfRequestRetrieveOutputBuffer oder WdfRequestRetrieveUnsafeUserOutputBuffer oder WdfRequestRetrieveInputBuffer oder WdfRequestRetrieveUnsafeUserInputBuffer aufgerufen wird.

BufAfterReqCompletedIntIoctlA

Die BufAfterReqCompletedIntIoctlA-Regel überprüft, ob nach Abschluss einer Anforderung kein Zugriff auf den Puffer möglich ist (nur innerhalb des Rückrufs von EvtIoInternalDeviceControl ). Der Puffer wurde durch Aufrufen von WdfRequestRetrieveInputBuffer oder WdfRequestRetrieveOutputBuffer oder WdfRequestRetrieveUnsafeUserInputBuffer oder WdfRequestRetrieveUnsafeUserOutputBuffer abgerufen.

BufAfterReqCompletedIoctlA

Die BufAfterReqCompletedIoctlA-Regel gibt an, dass innerhalb der Rückruffunktion EvtIoDeviceControl auf den abgerufenen E/A-Anforderungspuffer nach Abschluss der E/A-Anforderung nicht zugegriffen werden kann.

BufAfterReqCompletedRead

Die BufAfterReqCompletedRead-Regel gibt an, dass innerhalb der Rückruffunktion EvtIoRead auf den abgerufenen E/A-Anforderungspuffer nach Abschluss der E/A-Anforderung nicht zugegriffen werden kann. Es gibt 14 DDIs, die als mögliche Pufferzugriffsmethoden dienen.

BufAfterReqCompletedReadA

Die BufAfterReqCompletedReadA-Regel gibt an, dass innerhalb der EvtIoRead-Rückruffunktion nicht auf den abgerufenen E/A-Anforderungspuffer zugegriffen werden kann, nachdem die E/A-Anforderung abgeschlossen wurde. Es gibt 14 DDIs, die als mögliche Pufferzugriffsmethoden dienen.

BufAfterReqCompletedWrite

Die BufAfterReqCompletedWrite-Regel gibt an, dass innerhalb der Rückruffunktion EvtIoWrite auf den abgerufenen E/A-Anforderungspuffer nach Abschluss der E/A-Anforderung nicht zugegriffen werden kann.

BufAfterReqCompletedWriteA

Die BufAfterReqCompletedWriteA-Regel gibt an, dass innerhalb der Rückruffunktion EvtIoWrite auf den abgerufenen E/A-Anforderungspuffer nicht zugegriffen werden kann, nachdem die E/A-Anforderung abgeschlossen wurde.

ChildDeviceInitApi

Die ChildDeviceInitApi-Regel gibt an, dass für ein untergeordnetes Gerät die Framework-Methoden zur Geräteobjektinitialisierung aufgerufen werden müssen, bevor der Treiber die WdfDeviceCreate-Methode für das untergeordnete Geräteobjekt aufruft.

ControlDeviceDeleted

Die ControDeviceDeleted-Regel gibt an, dass der Treiber das Steuerelementgerätobjekt in einer der Rückruffunktionen für die Bereinigung löschen muss, bevor der Treiber entladen wird, wenn ein PnP-Treiber ein Steuerelementgerätobjekt erstellt.

ControlDeviceInitAPI

Die ControlDeviceInitAPI-Regel gibt an, dass WdfControlDeviceInitAllocate und alle anderen Geräteobjektinitialisierungs-DDIs, die eine WDFDEVICE_INIT-Struktur für das Steuerungsgerät einrichten, vor WdfDeviceCreate für das Steuerungsgerät aufgerufen werden müssen.

CtlDeviceFinishInitDeviceAdd

Die CtlDeviceFinishInitDeviceAdd-Regel gibt an, dass ein Treiber WdfControlFinishInitializing aufrufen muss, nachdem das Gerät erstellt wurde und bevor es aus der Rückruffunktion EvtDriverDeviceAdd beendet wird. Diese Regel gilt nicht für Nicht-PnP-Treiber.

CtlDeviceFinishInitDrEntry

Die CtlDeviceFinishInitDrEntry-Regel gibt an, dass, wenn ein Treiber ein Steuerelementgerätobjekt in einer DriverEntry-Rückruffunktion erstellt, WdfControlFinishInitializing aufrufen muss, nachdem das Gerät erstellt wurde und bevor es aus der Rückruffunktion EvtDriverDeviceAdd beendet wird. Diese Regel gilt nicht für Nicht-PnP-Treiber.

DeviceCreateFail

Die DeviceCreateFail-Regel gibt an, dass EVT_WDF_DRIVER_DEVICE_ADD einen Fehler status zurückgibt, wenn der Aufruf von WdfDeviceCreate fehlschlägt.

DeviceInitAllocate

Die DeviceInitAllocate-Regel gibt an, dass für ein PDO-Gerät oder ein Steuerelementgerätobjektobjekt die Framework-Geräteobjektinitialisierungsmethoden WdfPdoInitAllocate oder WdfControlDeviceInitAllocate aufgerufen werden müssen, bevor der Treiber WdfDeviceCreate aufruft.

DeviceInitAPI

Bei einem FDO-Gerät müssen die Frameworkgeräteobjektinitialisierungsmethoden und die Framework-FDO-Initialisierungsmethoden aufgerufen werden, bevor der Treiber die WdfDeviceCreate-Methode für das Geräteobjekt aufruft.

DoubleDeviceInitFree

Die DoubleDeviceInitFree-Regel gibt an, dass Treiber die Geräteinitialisierungsstruktur nicht zweimal freigeben sollten.

TreiberErstellen

Die DriverCreate-Regel gibt an, dass ein Treiber, der kernel mode Driver Framework (KMDF) verwendet, die WdfDriverCreate-Methode aufrufen muss, um ein Frameworktreiberobjekt aus seiner DriverEntry-Routine zu erstellen.

InitFreeDeviceCallback

Die InitFreeDeviceCallback-Regel gibt an, dass ein Treiber WdfDeviceInitFree aufrufen muss, wenn beim Initialisieren eines neuen Frameworkgeräteobjekts ein Fehler auftritt und der Treiber die WDFDEVICE_INIT-Struktur von einem Aufruf von WdfControlDeviceInitAllocate erhalten hat.

InitFreeDeviceErstellen

Die InitFreeDeviceCreate-Regel gibt an, dass ein Treiber WdfDeviceInitFree anstelle von WdfDeviceCreate aufrufen muss, wenn in einer der Initialisierungsmethoden des Geräteobjekts ein Fehler auftritt und der Treiber die WDFDEVICE_INIT-Struktur von einem Aufruf von WdfControlDeviceInitAllocate erhalten hat.

InitFreeDeviceCreateType2

Die InitFreeDeviceCreateType2-Regel gibt an, dass ein Treiber WdfDeviceCreate nicht aufrufen darf, nachdem er WdfDeviceInitFree aufgerufen hat.

InitFreeDeviceCreateType4

Die InitFreeDeviceCreateType4-Regel gibt an, dass ein Treiber WdfDeviceInitFree aufrufen muss, wenn beim Aufrufen von WdfDeviceCreate ein Fehler auftritt und der Treiber die WDFDEVICE_INIT-Struktur von einem Aufruf von WdfControlDeviceInitAllocate erhalten hat.

InitFreeNull

Die InitFreeNull-Regel gibt an, dass DDIs, die PWDFDEVICE_INIT als Parameter empfangen, nicht mithilfe eines NULL-Zeigers auf eine WDFDEVICE_INIT-Struktur aufgerufen werden können.

MdlAfterReqCompletedIntIoctl

Die MdlAfterReqCompletedIntIoctl-Regel gibt an, dass innerhalb der Rückruffunktion EvtIoInternalDeviceControl nicht auf die Speicherbeschreibungsliste (Memory Descriptor List, MDL) zugegriffen werden kann, nachdem die E/A-Anforderung abgeschlossen wurde.

MdlAfterReqCompletedIntIoctlA

Die MdlAfterReqCompletedIntIoctlA-Regel gibt an, dass innerhalb der Rückruffunktion EvtIoInternalDeviceControl nicht auf die Speicherbeschreibungsliste (Memory Descriptor List, MDL) zugegriffen werden kann, nachdem die E/A-Anforderung abgeschlossen wurde.

MdlAfterReqCompletedIoctl

Die MdlAfterReqCompletedIoctl-Regel gibt an, dass innerhalb der Rückruffunktion EvtIoDeviceControl nicht auf die Speicherbeschreibungsliste (Memory Descriptor List, MDL) zugegriffen werden kann, nachdem die E/A-Anforderung abgeschlossen wurde.

MdlAfterReqCompletedIoctlA

Die MdlAfterReqCompletedIoctlA-Regel gibt an, dass innerhalb der Rückruffunktion EvtIoDeviceControl auf die Speicherdeskriptorliste (MDL) nicht zugegriffen werden kann, nachdem die E/A-Anforderung abgeschlossen wurde.

MdlAfterReqCompletedRead

Die MdlAfterReqCompletedRead-Regel gibt an, dass innerhalb der Rückruffunktion EvtIoRead auf das abgerufene MDL-Objekt (Memory Descriptor List) nicht zugegriffen werden kann, nachdem die E/A-Anforderung abgeschlossen wurde.

MdlAfterReqCompletedReadA

Die MdlAfterReqCompletedReadA-Regel gibt an, dass innerhalb der Rückruffunktion EvtIoRead auf das abgerufene MDL-Objekt (Memory Descriptor List) nicht zugegriffen werden kann, nachdem die E/A-Anforderung abgeschlossen wurde.

MdlAfterReqCompletedWrite

Die MdlAfterReqCompletedWrite-Regel gibt an, dass innerhalb der Rückruffunktion EvtIoWrite auf das abgerufene MDL-Objekt (Memory Descriptor List) nach Abschluss der E/A-Anforderung nicht zugegriffen werden kann.

MdlAfterReqCompletedWriteA

Die MdlAfterReqCompletedWriteA-Regel gibt an, dass innerhalb der Rückruffunktion EvtIoWrite auf das abgerufene MDL-Objekt (Memory Descriptor List) nach Abschluss der E/A-Anforderung nicht zugegriffen werden kann.

MemAfterReqCompletedIntIoctl

Die MemAfterReqCompletedIntIoctl-Regel gibt an, dass innerhalb der Rückruffunktion EvtIoInternalDeviceControl nicht auf das Frameworkspeicherobjekt zugegriffen werden kann, nachdem die E/A-Anforderung abgeschlossen wurde.

MemAfterReqCompletedIntIoctlA

Die MemAfterReqCompletedIntIoctlA-Regel gibt an, dass innerhalb der Rückruffunktion EvtIoInternalDeviceControl nicht auf das Frameworkspeicherobjekt zugegriffen werden kann, nachdem die E/A-Anforderung abgeschlossen wurde.

MemAfterReqCompletedIoctl

Die MemAfterReqCompletedIoctl-Regel gibt an, dass innerhalb der Rückruffunktion EvtIoDeviceControl nicht auf das Frameworkspeicherobjekt zugegriffen werden kann, nachdem die E/A-Anforderung abgeschlossen wurde.

MemAfterReqCompletedIoctlA

Die MemAfterReqCompletedIoctlA-Regel gibt an, dass innerhalb der Rückruffunktion EvtIoDeviceControl nicht auf das Frameworkspeicherobjekt zugegriffen werden kann, nachdem die E/A-Anforderung abgeschlossen wurde.

MemAfterReqCompletedRead

Die MemAfterReqCompletedRead-Regel gibt an, dass innerhalb der Rückruffunktion EvtIoRead nicht auf das Framework-Speicherobjekt zugegriffen werden kann, nachdem die E/A-Anforderung abgeschlossen wurde.

MemAfterReqCompletedReadA

Die MemAfterReqCompletedReadA-Regel gibt an, dass innerhalb der Rückruffunktion EvtIoRead nicht auf das Frameworkspeicherobjekt zugegriffen werden kann, nachdem die E/A-Anforderung abgeschlossen wurde.

MemAfterReqCompletedWrite

Die MemAfterReqCompletedWrite-Regel gibt an, dass innerhalb der Rückruffunktion EvtIoWrite nicht auf das Frameworkspeicherobjekt zugegriffen werden kann, nachdem die E/A-Anforderung abgeschlossen wurde.

MemAfterReqCompletedWriteA

Die MemAfterReqCompletedWriteA-Regel gibt an, dass innerhalb der Rückruffunktion EvtIoWrite nicht auf das Frameworkspeicherobjekt zugegriffen werden kann, nachdem die E/A-Anforderung abgeschlossen wurde.

NullCheck

Die NullCheck-Regel überprüft, ob ein NULL-Wert im Treibercode später im Treiber nicht abgeleitet wird. Diese Regel meldet einen Fehler, wenn eine der folgenden Bedingungen zutrifft:

  • Es gibt eine Zuweisung von NULL, die später dereferenziert wird.
  • Es gibt einen globalen Parameter für eine Prozedur in einem Treiber, die möglicherweise NULL ist, die später abgeleitet wird, und es gibt eine explizite Überprüfung im Treiber, die darauf hindeutet, dass der Anfangswert des Zeigers NULL sein kann.

Bei NullCheck-Regelverletzungen werden die relevantesten Codeanweisungen im Ablaufverfolgungsstrukturbereich hervorgehoben. Weitere Informationen zum Arbeiten mit der Berichtsausgabe finden Sie unter Static Driver Verifier Report und Grundlegendes zum Ablaufverfolgungs-Viewer.

PdoDeviceInitAPI

Die PdoDeviceInitAPI-Regel gibt an, dass WdfPdoInitAllocate und alle anderen Geräteobjektinitialisierungs-DDIs, die eine WDFDEVICE_INIT-Struktur für das physische Geräteobjekt (PDO) einrichten, aufgerufen werden müssen, bevor der Treiber WdfDeviceCreate für das PDO aufruft.

PdoInitFreeDeviceCallback

Die PdoInitFreeDeviceCallback-Regel gibt an, dass der Treiber WdfDeviceInitFree aufrufen muss, wenn ein Fehler auftritt, wenn der Treiber eine Framework-Geräteobjektinitialisierungsfunktion aufruft.

PdoInitFreeDeviceCreate

Die PdoInitFreeDeviceCreate-Regel gibt an, dass ein Treiber WdfDeviceInitFree anstelle von WdfDeviceCreate aufrufen muss, wenn in einer der Initialisierungsfunktionen des Geräteobjekts ein Fehler auftritt und der Treiber die WDFDEVICE_INIT-Struktur von einem Aufruf von WdfPdoInitAllocate empfangen hat.

PdoInitFreeDeviceCreateType2

Die PdoInitFreeDeviceCreateType2-Regel gibt an, dass ein Treiber WdfDeviceCreate nicht aufrufen darf, nachdem er WdfDeviceInitFree aufgerufen hat.

PdoInitFreeDeviceCreateType4

Die PdoInitFreeDeviceCreateType4-Regel gibt an, dass der Treiber WdfDeviceInitFree aufrufen muss, wenn ein Fehler auftritt, wenn der Treiber WdfDeviceCreate aufruft.

ControlDeviceInitAllocate

Die ControlDeviceInitAllocate-Regel gibt an, dass der Treiber für ein Steuerelementgerätobjekt die Framework-Geräteobjektinitialisierungsmethode WdfControlDeviceInitAllocate aufrufen muss, bevor der Treiber WdfDeviceCreate aufruft.

InputBufferAPI

Die InputBufferAPI-Regel gibt an, dass die richtigen DDIs für den Pufferabruf in der EvtIoRead-Rückruffunktionverwendet werden. Innerhalb der EvtIoRead-Rückruffunktion können die folgenden DDIs nicht für den Pufferabruf aufgerufen werden:

So wählen Sie den DDI-Nutzungsregelsatz aus

  1. Wählen Sie Ihr Treiberprojekt (VCXProj) in Microsoft Visual Studio aus. Klicken Sie im Menü Treiber auf Statische Treiberüberprüfung starten....

  2. Klicken Sie auf die Registerkarte Regeln . Wählen Sie unter Regelsätze die Option DDIUsage aus.

    Um den Standardregelsatz in einem Visual Studio-Entwicklereingabeaufforderungsfenster auszuwählen, geben Sie DDIUsage.sdv mit der Option /check an. Beispiel:

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

    Weitere Informationen finden Sie unter Using Static Driver Verifier to Find Defects in Drivers and Static Driver Verifier commands (MSBuild).