Verwenden der statischen Treiberüberprüfung zum Auffinden von Fehlern in Windows-Treibern

Static Driver Verifier (SDV) verwendet eine Reihe von Schnittstellenregeln und ein Modell des Betriebssystems, um zu bestimmen, ob der Treiber ordnungsgemäß mit dem Windows-Betriebssystem interagiert. SDV findet Fehler im Treibercode, die auf potenzielle Fehler in Treibern hinweisen können.

SDV kann Kernelmodustreiber analysieren, die einem der folgenden Treibermodelle entsprechen: WDM, KMDF, NDIS oder Storport. Weitere Informationen finden Sie unter Unterstützte Treiber und Ermitteln, ob die statische Treiberüberprüfung Ihren Treiber oder Ihre Bibliothek unterstützt. Darüber hinaus bietet SDV eingeschränkte Unterstützung (ein stark eingeschränkter Regelsatz, der sich auf allgemeine Fehler wie NULL-Dereferenzen konzentriert) für Treiber, die nicht den oben genannten Treibermodellen folgen.

Vorbereiten des Quellcodes

Führen Sie die folgenden Schritte aus, um Ihren Code für die Analyse vorzubereiten.

  1. Deklarieren von treiberseitig bereitgestellten Funktionen mithilfe von Funktionsrollentypen

    SDV erfordert, dass die Funktionen mithilfe von Funktionsrollentypdeklarationen deklariert werden. Beispielsweise muss eine DriverEntry-Routine mit dem Rollentyp DRIVER_INITIALIZE deklariert werden:

    DRIVER_INITIALIZE DriverEntry;
    

    Nach der Deklaration implementieren (oder definieren) Sie Ihre Rückrufroutine wie folgt:

    /
    // Driver initialization routine
    //
    NTSTATUS
      DriverEntry(
        _In_ struct _DRIVER_OBJECT  *DriverObject,
        _In_ PUNICODE_STRING  RegistryPath
        )
      {
          // Function body
      }
    

    Jedes unterstützte Treibermodell verfügt über einen Satz von Funktionsrollentypen für die Treiberrückruffunktionen und Dispatchroutinen. Diese Funktionsrollentypen werden in den WDK-Headerdateien deklariert. Hier sehen Sie beispielsweise den Funktionsprototyp für den DRIVER_INITIALIZE Rollentyp, wie er in Wdm.h angezeigt wird.

    /
    // Define driver initialization routine type.
    //
    _Function_class_(DRIVER_INITIALIZE)
    _IRQL_requires_same_
    typedef
    NTSTATUS
    DRIVER_INITIALIZE (
        _In_ struct _DRIVER_OBJECT *DriverObject,
        _In_ PUNICODE_STRING RegistryPath
        );
    
    typedef DRIVER_INITIALIZE *PDRIVER_INITIALIZE;
    

    Da die Funktionsrollentypen bereits in den WDK-Headerdateien definiert sind, müssen Sie nur Die Rückruffunktionen als von diesem Typ deklarieren. In diesem Fall deklarieren Sie DriverEntry als vom Typ DRIVER_INITIALIZE. Eine vollständige Liste der Funktionsrollentypen für die Treibermodelle finden Sie unter Verwenden von Funktionsrollentypdeklarationen.

  2. Ausführen der Codeanalyse für C/C++

    Führen Sie das Codeanalysetool in Visual Studio aus, um festzustellen, ob der Quellcode vorbereitet ist. Das Codeanalysetool sucht nach Funktionsrollentypdeklarationen, die für SDV erforderlich sind. Mit dem Codeanalysetool können Sie alle Funktionsdeklarationen identifizieren, die möglicherweise verpasst wurden, oder Sie warnen, wenn die Parameter der Funktionsdefinition nicht mit denen im Funktionsrollentyp übereinstimmen.

    • Öffnen Sie Ihr Treiberprojekt in Visual Studio.
    • Klicken Sie im Menü Erstellen auf Codeanalyse für Projektmappe ausführen.

    Die Ergebnisse werden im Fenster Codeanalyse angezeigt. Korrigieren Sie alle Funktionsdeklarationen, die Sie möglicherweise verpasst haben. Sie können das Codeanalysetool auch so konfigurieren, dass es ausgeführt wird, wenn Sie Ihre Projektmappe erstellen.

    Die folgende Tabelle enthält einige Warnungen, die das Codeanalysetool möglicherweise in Ihrem Treibercode findet. Um static Driver Verifier ausführen zu können, muss Ihr Treiber frei von diesen Fehlern sein.

    Codeanalyse für C/C++-Warnung BESCHREIBUNG
    C28101 Das Treibermodul hat abgeleitet, dass die aktuelle Funktion eine <function-type>-Funktion ist
    C28022 Die Funktionsklasse(n) in dieser Funktion stimmt/stimmen nicht mit der/den Funktionsklasse(n) in der Typendefinition überein, die zu deren Definition verwendet wird.
    C28023 Die zuzuweisende bzw. zu übergebene Funktion sollte über eine _Function_class_-Anmerkung für mindestens eine der Klassen verfügen in
    C28024 Der zuzuweisende Funktionszeiger wurde mit der Funktionsklasse versehen, die nicht in der Liste der Funktionsklassen enthalten ist.
    C28169 Die Dispatchfunktion <> verfügt nicht über _Dispatch_type_ Anmerkungen.
    C28208 Die Funktionssignatur stimmt nicht mit den Funktionsdeklarationen überein.

Ausführen der statischen Treiberüberprüfung

  1. Öffnen Sie ihre Treiberprojektdatei (VCXPROJ) in Visual Studio. Klicken Sie im Menü Treiber auf Statische Treiberüberprüfung starten....

    Dadurch wird die Anwendung Static Driver Verifier geöffnet, in der Sie steuern, konfigurieren und planen können, wann die Static Driver Verifier eine Analyse durchführt.

  2. Wenn Ihr Treiber eine Bibliothek enthält, klicken Sie auf die Registerkarte Bibliotheken und dann auf Bibliothek hinzufügen , um die Bibliothek hinzuzufügen.

    Navigieren Sie zum Verzeichnis ihres Bibliotheksquellcodes, und wählen Sie die Projektdatei (.vcxProj) aus. Fügen Sie alle Bibliotheken hinzu, die Ihr Treiber enthält. Die Bibliotheken müssen hinzugefügt werden, bevor SDV Ihren Treiber analysiert. Wenn Sie eine Analyse Ihres Treibers starten, analysiert SDV auch die Bibliotheken, die nicht verarbeitet wurden. Nachdem eine Bibliothek verarbeitet wurde, wird sie im globalen SDV-Cache gespeichert. Weitere Informationen finden Sie unter Bibliotheksverarbeitung in der statischen Treiberüberprüfung.

  3. Überprüfen Sie die Konfigurationseinstellungen für die statische Treiberüberprüfung. Klicken Sie auf die Registerkarte Konfigurieren.

    Projektkonfiguration Die Projektkonfiguration zeigt die Konfigurations- und Plattformeinstellungen an, die Sie in Visual Studio ausgewählt haben.

    Ressourcen In den meisten Fällen können Sie die Standardeinstellungen verwenden. Wenn SDV Timeout, GiveUp oder Spaceout meldet, können Sie versuchen, diese Einstellungen anzupassen. Weitere Informationen finden Sie unter Empfehlungen für die Problembehandlung bei der statischen Treiberüberprüfung.

    Zeitplan Wählen Sie eine Startzeit für den Beginn der Überprüfung aus. Die Standardeinstellung besteht darin, die Analyse sofort zu starten, nachdem Sie auf der Registerkarte Haupt auf Start geklickt haben. Abhängig von der Größe des Treibers und seiner Komplexität kann die Ausführung der statischen Analyse sehr lange dauern. Möglicherweise möchten Sie die Analyse so planen, dass sie beginnt, wenn sie für Sie am besten geeignet ist. beispielsweise am Ende des Tages.

    Hinweis

    ]Überprüfen Sie unbedingt den Energieverwaltungsplan Ihres Computers, um sicherzustellen, dass der Computer während der Analyse nicht in den Ruhezustand wechselt.

  4. Klicken Sie auf die Registerkarte Regeln , um auszuwählen, welche Treiber-API-Nutzungsregeln beim Starten der Analyse überprüft werden sollen.

    Static Driver Verifier erkennt den Typ des Zu analysierenden Treibers (WDF, WDM, NDIS oder Storport) und wählt den Standardregelsatz für Ihren Treibertyp aus. Wenn Sie SDV zum ersten Mal auf Ihrem Treiber ausführen, sollten Sie den Standardregelsatz ausführen.

    Informationen zu den Regeln finden Sie unter DDI-Kompatibilitätsregeln.

  5. Starten Sie die statische Analyse. Klicken Sie auf die Registerkarte Main und dann auf Start. Wenn Sie auf Start klicken, wird eine Meldung angezeigt, die Sie darüber informiert, dass die statische Analyse geplant ist und dass die Ausführung der Analyse sehr lange dauern kann. Klicken Sie zum Fortsetzen des Vorgangs auf OK . Die Analyse beginnt zu dem von Ihnen geplanten Zeitpunkt.

Anzeigen und Analysieren der Ergebnisse

Während die statische Analyse fortgesetzt wird, meldet SDV die status der Analyse. Nach Abschluss der Analyse meldet SDV die Ergebnisse und Statistiken. Wenn der Treiber eine API-Nutzungsregel nicht erfüllt, wird das Ergebnis als Fehler gemeldet.

Wenn Probleme aufgetreten sind, zeigt SDV diese auf den Seiten Warnungen und Fehler an. Auf der Seite Treibereigenschaften werden die Ergebnisse der Tests für bestimmte Treibereigenschaften angezeigt. Die Treibereigenschaftentests werden verwendet, um Treiberfeatures zu identifizieren, um die Analyse weiter zu qualifizieren. Sie können die Ergebnisse der Treibereigenschaften verwenden, um die erwarteten Eigenschaften und unterstützten Funktionen Ihres Treibers zu bestätigen.

Klicken Sie im Bereich Ergebnisse auf den Fehler, um bestimmte Mängel im Static Driver Verifier Report anzuzeigen. Dadurch wird der Ablaufverfolgungs-Viewer geöffnet, der eine Ablaufverfolgung des Codepfads zum Regelverstoß anzeigt. Weitere Informationen finden Sie unter Interpretieren der Ergebnisse der statischen Treiberüberprüfung.

Hinweis

Static Driver Verifier behält die Ergebnisse und Einstellungen aus der Analyse bei. Klicken Sie auf Bereinigen, um die Ergebnisse zu löschen.

Problembehandlung bei Ergebnissen der statischen Treiberüberprüfung

Wenn SDV meldet, dass keine Fehler gefunden wurden, überprüfen Sie die Registerkarte Main , um sicherzustellen, dass Einstiegspunkte erkannt werden. Wenn der Treiber funktionen nicht mithilfe der Funktionsrollentypen deklariert, kann SDV Fehler im Treibercode nicht analysieren und finden. Weitere Informationen finden Sie unter Verwenden von Funktionsrollentypdeklarationen.

Wenn SDV Timeouts meldet oder keine nützlichen Ergebnisse zurückgibt, müssen Sie möglicherweise einige SDV-Konfigurationsoptionen ändern. Weitere Informationen zur Problembehandlung bei SDV finden Sie unter Empfehlungen für die Problembehandlung bei der statischen Treiberüberprüfung.

Ermitteln, ob der Static Driver Verifier Ihren Treiber oder Ihre Bibliothek unterstützt

Verwenden von Funktionsrollentypdeklarationen

Statische Treiberüberprüfungsregeln

Codeanalysetool