DDI-Nutzungsregelsatz (KMDF)
Verwenden Sie diese Regeln, um zu überprüfen, ob Ihr Treiber KMDF-DDIs ordnungsgemäß verwendet.
In diesem Abschnitt
Thema | BESCHREIBUNG |
---|---|
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. |
|
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. |
|
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. |
|
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. |
|
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. |
|
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. |
|
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. |
|
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. |
|
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. |
|
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. |
|
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. |
|
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. |
|
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. |
|
Die DeviceCreateFail-Regel gibt an, dass EVT_WDF_DRIVER_DEVICE_ADD einen Fehler status zurückgibt, wenn der Aufruf von WdfDeviceCreate fehlschlägt. |
|
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. |
|
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. |
|
Die DoubleDeviceInitFree-Regel gibt an, dass Treiber die Geräteinitialisierungsstruktur nicht zweimal freigeben sollten. |
|
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. |
|
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. |
|
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. |
|
Die InitFreeDeviceCreateType2-Regel gibt an, dass ein Treiber WdfDeviceCreate nicht aufrufen darf, nachdem er WdfDeviceInitFree aufgerufen hat. |
|
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. |
|
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. |
|
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. |
|
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. |
|
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. |
|
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. |
|
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. |
|
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. |
|
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. |
|
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. |
|
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. |
|
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. |
|
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. |
|
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. |
|
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. |
|
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. |
|
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. |
|
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. |
|
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:
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. |
|
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. |
|
Die PdoInitFreeDeviceCallback-Regel gibt an, dass der Treiber WdfDeviceInitFree aufrufen muss, wenn ein Fehler auftritt, wenn der Treiber eine Framework-Geräteobjektinitialisierungsfunktion aufruft. |
|
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. |
|
Die PdoInitFreeDeviceCreateType2-Regel gibt an, dass ein Treiber WdfDeviceCreate nicht aufrufen darf, nachdem er WdfDeviceInitFree aufgerufen hat. |
|
Die PdoInitFreeDeviceCreateType4-Regel gibt an, dass der Treiber WdfDeviceInitFree aufrufen muss, wenn ein Fehler auftritt, wenn der Treiber WdfDeviceCreate aufruft. |
|
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. |
|
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
Wählen Sie Ihr Treiberprojekt (VCXProj) in Microsoft Visual Studio aus. Klicken Sie im Menü Treiber auf Statische Treiberüberprüfung starten....
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).