Unterstützte Treiber
Damit SDV einen Treiber überprüfen kann, muss er den Treibercode interpretieren können, insbesondere die Einstiegspunkte des Treibers und den Code in Funktionen und Routinen, die die erforderliche Treiberfunktionalität unterstützen.
In den folgenden Abschnitten werden die grundlegenden Anforderungen für Treiber und die spezifische Syntax beschrieben, die SDV von den überprüften Treibern erwartet. SDV überprüft nicht, ob Treiber diese Anforderungen erfüllen, aber wenn der Treiber nicht erfüllt, kann SDV nicht ausgeführt werden und meldet in seltenen Fällen falsch positive oder falsche negative Ergebnisse aufgrund von Fehlinterpretation.
Wichtig
SDV wird nicht mehr unterstützt, und SDV ist in Windows 24H2 WDK- oder EWDK-Versionen nicht verfügbar. Sie ist in WDKs neuer als Build 26017 nicht verfügbar und nicht im Windows 24H2 RTM WDK enthalten.
SDV kann weiterhin verwendet werden, indem Sie das Windows 11, Version 22H2 EWDK (veröffentlicht am 24. Oktober 2023) mit Visual Studio-Buildtools 17.1.5 aus dem Windows Driver Kit (WDK) herunterladen. Es wird nur die Verwendung von Enterprise WDK zum Ausführen von SDV empfohlen. Die Verwendung älterer Versionen des Standard-WDK in Verbindung mit den letzten Versionen von Visual Studio wird nicht empfohlen, da dies wahrscheinlich zu Analysefehlern führt.
In Zukunft wird CodeQL das primäre statische Analysetool für Treiber sein. CodeQL stellt eine leistungsstarke Abfragesprache bereit, die Code als abgefragte Datenbank behandelt, sodass Abfragen für bestimmte Verhaltensweisen, Muster und vieles mehr einfach geschrieben werden können.
Weitere Informationen zur Verwendung von CodeQL finden Sie unter CodeQL und dem Logotest für statische Tools.
Grundlegende Treibermerkmale
SDV kann nur Treiber mit den folgenden Merkmalen überprüfen:
SDV überprüft Treiber und Bibliotheken, die in C und C++ geschrieben wurden.
SDV führt die vollständige Überprüfung nur für KMDF-kompatible und WDM-kompatible Gerätetreiber (Funktionstreiber, Filtertreiber und Bustreiber), NDIS-Treiber (Filter-, Miniport- und Protokolltreiber) und Storport-Treiber durch.
SDV versucht eine eingeschränkte Überprüfung generischer Eigenschaften (z . B. NullCheck) auf Treibern, die nicht in die obigen Kategorien passen.
SDV kann WDM-Treiber überprüfen, die ihre Treiberrückruffunktionen mithilfe der Rollentypen der WDM-Funktion deklarieren. Informationen zum Deklarieren von Funktionen finden Sie unter Deklarieren von Funktionen mithilfe von Funktionsrollentypen für WDM-Treiber.
SDV kann Treiber überprüfen, die aus dem Kernelmodus-Treiberframework erstellt werden, vorausgesetzt, Sie deklarieren jede Rückruffunktion mithilfe eines SDV-KMDF-Rückruffunktionsrollentyps. Weitere Informationen finden Sie unter Deklarieren von Funktionen mithilfe von Funktionsrollentypen für KMDF-Treiber.
SDV kann NDIS-Treiber überprüfen, vorausgesetzt, Sie kommentieren jede Rückruffunktion mit der Funktionsdeklaration mithilfe eines SDV-NDIS-Rückruffunktionstyps. Weitere Informationen finden Sie unter Deklarieren von Funktionen mithilfe von Funktionsrollentypen für NDIS-Treiber.
SDV kann Storport-Treiber überprüfen, sofern Sie jede Rückruffunktion mit der Funktionsdeklaration kommentieren. Dazu verwenden Sie einen SDV-Storport-Rückruffunktionstyp. Weitere Informationen finden Sie unter Deklarieren von Funktionen mithilfe von Funktionsrollentypen für Storport-Treiber.
Grundlegende Treiberanforderungen
Damit SDV einen WDM-Treiber überprüfen kann, muss der Treiber:
Schließen Sie Wdm.h oder Ntddk.h ein (Wdm.h ist eine Teilmenge von Ntddk.h).
Erstellen Sie Geräteobjekte mithilfe von Methoden, die unter "Einführung in Geräteobjekte " beschrieben werden.
Verwenden Sie eine Unload-Routine, die in der Schreibform einer Unload-Routine geschrieben wird.
Deklarieren Sie jede Verteilerfunktion mithilfe einer Funktionsrollentypdeklaration, die unter Verwendung von Funktionsrollentypdeklarationen beschrieben wird. Informationen zu den WDM-Rollentypen und den _Dispatch_type_ (Typ) -Anmerkungen finden Sie unter Deklarieren von Funktionen mithilfe von Funktionsrollentypen für WDM-Treiber.
Damit SDV einen KMDF-Treiber überprüfen kann, muss der Treiber:
Schließen Sie Wdf.h und Ntddk.h ein.
Erstellen Sie die unter "Using the Framework to Develop a Driver" beschriebenen KMDF-Objekte.
Kommentieren Sie jede Rückruffunktion mithilfe eines ROLLENtyps der SDV-KMDF-Rückruffunktion, der unter Verwendung von Funktionsrollentypdeklarationen beschrieben wird. Eine Liste der unterstützten Rollentypen finden Sie unter "Static Driver Verifier KMDF Function Declarations".
Damit SDV einen NDIS-Treiber überprüfen kann, muss der Treiber:
Schließen Sie Ndis.h und Ntddk.h ein.
Befolgen Sie die Richtlinien im Netzwerkentwurfshandbuch zum Erstellen von NDIS-Treibern.
Kommentieren Sie jede Rückruffunktion mithilfe eines SDV-NDIS-Rückruffunktionsrollentyps, wie unter Verwendung von Funktionsrollentypdeklarationen beschrieben. Eine Liste der unterstützten Rollentypen finden Sie unter Deklarationen der Statischen Treiberüberprüfung NDIS-Funktion.
Darüber hinaus kann SDV Treiber überprüfen, die Folgendes unterstützen:
Reservierte Funktionsnamen
Das SDV-Überprüfungsmodul funktioniert nicht ordnungsgemäß, wenn der Treiber- oder Bibliothekscode dieselben Funktionsnamenmuster verwendet, die SDV intern verwendet.
Insbesondere interpretiert SDV Code nicht ordnungsgemäß, wenn:
Der Code enthält Funktionsnamen, die mit __init beginnen und auf eine oder mehrere ganze Zahlen folgen, z. B. __init123.
Der Code enthält Funktionsnamen, die mit sdv_ beginnen, z. B. sdv_Func, oder die Zeichenfolge _sdv_, z. B. Func_sdv_ oder Func_sdv_foo.
Die Bibliothek verwendet eine
.def
Datei, um eine exportierte Funktion umzubenennen, und der externe Name entspricht dem Namen einer anderen statischen Funktion in der Bibliothek.
Wenn der Treibercode oder Bibliothekscode diese Elemente enthält, versucht SDV, den Treiber zu überprüfen oder die Bibliothek zu verarbeiten, das Ergebnis wird jedoch nicht unterstützt Feature (NSF). Weitere Informationen zu SDV-Ergebnissen finden Sie unter Interpreting Static Driver Verifier Results.