Sdílet prostřednictvím


Použití nástroje Static Driver Verifier k vyhledání vad v ovladačích systému Windows

Static Driver Verifier (SDV) používá sadu pravidel rozhraní a model operačního systému k určení, jestli ovladač pracuje správně s operačním systémem Windows. SDV najde chyby v kódu ovladače, které můžou odkazovat na potenciální chyby v ovladačích.

SDV může analyzovat ovladače režimu jádra, které odpovídají jednomu z následujících modelů ovladačů: WDM, KMDF, NDIS nebo Storport. Další informace naleznete v tématu Podporované ovladače a určení, zda statický ovladač Verifier podporuje váš ovladač nebo knihovnu. SDV navíc poskytuje omezenou podporu (vážně omezená sada pravidel zaměřená na obecné chyby, jako jsou například dereference null) pro ovladače, které nedodržují výše uvedené modely ovladačů.

Důležité

SDV se už nepodporuje a SDV není k dispozici ve verzích Windows 24H2 WDK nebo EWDK. Není k dispozici v wdk novější než build 26017 a není součástí windows 24H2 RTM WDK. SDV lze stále používat stažením Windows 11 verze 22H2 EWDK, vydaného 24. října 2023, s nástroji Visual Studio Build Tools 17.1.5 z Stáhnout sadu Windows Driver Kit (WDK). Doporučuje se pouze použití sady Enterprise WDK ke spuštění SDV. Použití starších verzí standardní sady WDK ve spojení s nedávnými verzemi sady Visual Studio se nedoporučuje, protože to bude pravděpodobně mít za následek selhání analýzy.
V budoucnu bude CodeQL primárním nástrojem pro statickou analýzu ovladačů. CodeQL poskytuje výkonný dotazovací jazyk, který zpracovává kód jako databázi, která se má dotazovat, což usnadňuje psaní dotazů pro konkrétní chování, vzory a další. Další informace o použití CodeQL naleznete v tématu CodeQL a Static Tools Logo Test.

Příprava zdrojového kódu

Pomocí následujících kroků připravte kód na analýzu.

  1. Deklarace funkcí zadaných ovladačem pomocí typů rolí funkcí

    SDV vyžaduje, aby funkce byly deklarovány pomocí deklarací typu role funkce. Rutina DriverEntry musí být například deklarována pomocí typu role funkce DRIVER_INITIALIZE:

    DRIVER_INITIALIZE DriverEntry;
    

    Po deklaraci implementujete (nebo definujete) svoji rutinu zpětného volání následujícím způsobem:

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

    Každý podporovaný model ovladače má sadu typů rolí funkcí pro funkce zpětného volání ovladače a rutiny odesílání. Tyto typy rolí funkcí jsou deklarovány v souborech hlaviček WDK. Tady je například prototyp funkce pro typ role DRIVER_INITIALIZE, jak se zobrazí v wdm.h.

    /
    // 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;
    

    Vzhledem k tomu, že typy rolí funkce jsou již definovány v souborech hlaviček WDK, stačí deklarovat funkce zpětného volání, které mají být tohoto typu. V tomto případě deklarujete DriverEntry jako typ DRIVER_INITIALIZE. Úplný seznam typů rolí funkcí pro modely ovladačů naleznete v tématu Použití deklarací typu role funkce.

  2. Spuštění analýzy kódu pro C/C++

    Pokud chcete zjistit, jestli je zdrojový kód připravený, spusťte nástroj Pro analýzu kódu v sadě Visual Studio. Nástroj pro analýzu kódu kontroluje deklarace typu role funkce, které SDV vyžaduje. Nástroj Analýza kódu vám může pomoct identifikovat jakékoli deklarace funkcí, které by mohly být vynechány, nebo vás varovat, když parametry definice funkce neodpovídají těm, které jsou v typu role funkce.

    • Otevřete projekt ovladače v sadě Visual Studio.
    • V nabídce Sestavení klikněte na Spustit analýzu kódu v řešení.

    Výsledky se zobrazí v okně Analýza kódu . Opravte všechny deklarace funkcí, které jste mohli vynechat. Nástroj pro analýzu kódu můžete také nakonfigurovat tak, aby se spustil při každém sestavení řešení.

    Následující tabulka uvádí některá upozornění, která nástroj pro analýzu kódu může najít v kódu ovladače. Pokud chcete spustit ověření statického ovladače, musí být váš ovladač bez těchto vad.

    Upozornění analýzy kódu pro C/C++ Popis
    C28101 Modul Ovladače vyvodil, že aktuální funkce je funkce typu <>.
    C28022 Třídy funkce u této funkce neodpovídají třídám funkce u typedefu použitého k jejímu definování.
    C28023 Funkce, která je přiřazena nebo předána, by měla mít _Function_class_ poznámku alespoň pro jednu z tříd(es).
    C28024 Ukazatel funkce, ke kterému je přiřazen, je opatřen poznámkami s třídou funkce, která není obsažena v seznamu tříd funkcí.
    C28169 Funkce <function> nemá žádné anotace _Dispatch_type_.
    C28208 Podpis funkce se neshoduje s deklaracemi funkce.

Spuštění nástroje Static Driver Verifier

  1. Otevřete soubor projektu ovladače (.vcxProj) v prostředí Visual Studio. V nabídce Ovladač klepněte na Spustit statický ověřovatel ovladače....

    Tím se otevře aplikace Static Driver Verifier, kde můžete řídit, konfigurovat a plánovat, kdy nástroj Static Driver Verifier provádí analýzu.

  2. Pokud ovladač obsahuje knihovnu, klikněte na kartu Knihovny a kliknutím na Přidat knihovnu přidejte knihovnu.

    Přejděte do adresáře zdrojového kódu knihovny a vyberte soubor projektu (.vcxProj). Přidejte všechny knihovny, které ovladač obsahuje. Knihovny musí být přidány předtím, než SDV analyzuje váš ovladač. Když spustíte analýzu ovladače, SDV také analyzuje knihovny, které nebyly zpracovány. Po zpracování knihovny se uloží do globální mezipaměti SDV. Další informace naleznete v tématu Zpracování knihovny v nástroji Static Driver Verifier.

  3. Zkontrolujte nastavení konfigurace pro ověření statického ovladače. Klikněte na kartu Konfigurovat .

    Konfigurace projektu Konfigurace projektu zobrazuje nastavení konfigurace a platformy, které jste vybrali v sadě Visual Studio.

    Prostředky Ve většině případů můžete použít výchozí nastavení. Pokud SDV hlásí časový limit, vzdání se nebo ztrátu soustředění, můžete zkusit tato nastavení upravit. Další informace najdete v tématu Doporučení pro řešení potíží s ověřením statického ovladače.

    Naplánovat Vyberte čas zahájení ověření. Výchozí nastavení je zahájit analýzu okamžitě po kliknutí na tlačítko Start na kartě Hlavní . V závislosti na velikosti ovladače a jeho složitosti může statická analýza trvat dlouhou dobu. Možná budete chtít naplánovat analýzu tak, aby začala, když je pro vás nejvhodnější; Například na konci dne.

    Poznámka:

    Nezapomeňte zkontrolovat plán řízení spotřeby počítače, abyste měli jistotu, že počítač během analýzy nepřejde do stavu spánku.

  4. Kliknutím na kartu Pravidla vyberte pravidla použití rozhraní API ovladače, která se mají ověřit při spuštění analýzy.

    Nástroj Pro ověření statického ovladače zjistí typ ovladače, který analyzujete (WDF, WDM, NDIS nebo Storport) a vybere výchozí sadu pravidel pro váš typ ovladače. Pokud na ovladači spouštíte SDV poprvé, měli byste spustit výchozí sadu pravidel.

    Pro další informace o pravidlech, viz DDI Compliance Rules.

  5. Spusťte statickou analýzu. Klikněte na kartu Hlavní a klikněte na Tlačítko Start. Když kliknete na Tlačítko Start, zobrazí se zpráva s oznámením, že je naplánovaná statická analýza a že spuštění analýzy může trvat dlouhou dobu. Pokračujte kliknutím na OK. Analýza začíná v době, kterou jste naplánovali.

Zobrazení a analýza výsledků

Jak statická analýza pokračuje, SDV hlásí průběh analýzy. Po dokončení analýzy SDV hlásí výsledky a statistiky. Pokud ovladač nevyhovuje pravidlu použití rozhraní API, zobrazí se výsledek jako vada.

Pokud došlo k nějakým problémům, zobrazí SDV ty na stránkách Upozornění a Chyby . Na stránce Vlastnosti ovladače se zobrazí výsledky testů pro určité vlastnosti ovladače. Testy vlastností ovladačů slouží k identifikaci funkcí ovladačů pro další kvalifikaci analýzy. Výsledky vlastností ovladače můžete použít k potvrzení očekávaných vlastností a podporovaných možností ovladače.

Chcete-li zobrazit konkrétní vady v sestavě ověření statického ovladače, klikněte v podokně Výsledky na položku Chyba. Tím se otevře Prohlížeč trasování, který zobrazí trasování cesty kódu k porušení pravidla. Další informace naleznete v tématu Interpretace výsledků ověření statického ovladače.

Poznámka:

Ověřovatel statického ovladače zachovává výsledky a nastavení z analýzy. Chcete-li vymazat výsledky, klikněte na tlačítko Vyčistit.

Řešení potíží s výsledky ověření statického ovladače

Pokud SDV hlásí, že nebyly nalezeny žádné vady, zkontrolujte kartu Hlavní a ujistěte se, že jsou zjištěny vstupní body. Pokud ovladač nehlásí funkce pomocí typů rolí funkcí, nebude SDV schopen analyzovat a najít vady v kódu ovladače. Další informace naleznete v tématu Použití deklarací typu role funkce.

Pokud SDV hlásí vypršení časového limitu nebo se nepodaří vrátit užitečné výsledky, možná budete muset změnit několik možností konfigurace SDV. Další informace o řešení potíží s SDV naleznete v tématu Doporučení pro řešení potíží s ověřením statického ovladače.

Určení, jestli ověřovatel statického ovladače podporuje váš ovladač nebo knihovnu

Použití deklarací typu role funkce

Pravidla ověření statického ovladače

Nástroj Pro analýzu kódu