Dela via


Verktyg för att verifiera drivrutiner

Windows Driver Kit (WDK) innehåller verktyg för drivrutinsverifiering som hjälper dig att identifiera och korrigera fel under utvecklingen. Dessa verktyg omfattar statiska analysverktyg som CodeQL och dynamiska verktyg som Drivrutinsverifierare som kan hitta kritiska buggar före distributionen. Att använda dessa verifieringsverktyg tidigt i utvecklingen sparar tid och förhindrar allvarliga drivrutinsproblem i produktionen.

WDK-dokumentationen beskriver dessa verifieringsverktyg och rekommenderar att de används eftersom varje verktyg identifierar olika typer av drivrutinsfel på olika sätt. Dessa verktyg är mycket effektivare än manuella kontroller. De kan identifiera fel som vanligtvis inte hittas i standarddrivrutinstester, och de förkroppsligar expertisen hos erfarna drivrutinsutvecklare och Windows-drivrutinsgränssnittsdesigners.

Använd alla verktyg som kan köras på drivrutinen för bästa resultat. Om du utelämnar något av dessa verktyg kan du missa en allvarlig bugg i din drivrutin.

Statiska och dynamiska verifieringsverktyg

Det finns två grundläggande typer av verifieringsverktyg:

  • Statiska verifieringsverktyg undersöker drivrutinskoden utan att köra drivrutinen. Eftersom dessa verktyg inte förlitar sig på tester som använder koden kan de vara mycket noggranna. Teoretiskt sett kan statiska verifieringsverktyg undersöka all drivrutinskod, inklusive kodsökvägar som sällan körs i praktiken. Men eftersom drivrutinen faktiskt inte körs kan dessa verktyg generera falska positiva resultat. Det innebär att de kan rapportera ett fel i en kodsökväg som inte inträffar i praktiken.

    CodeQL är det primära statiska analysverktyget för drivrutiner. CodeQL tillhandahåller ett kraftfullt frågespråk som behandlar kod som en databas som ska frågas, vilket gör det enkelt att skriva frågor för specifika beteenden och mönster. Windows maskinvarukompatibilitetsprogram kräver CODEQL för STL-tester (Static Tool Logo) på våra klient- och serveroperativsystem. Mer information finns i CodeQL och logotestet för statiska verktyg.

  • Dynamiska verifieringsverktyg undersöker drivrutinskoden medan drivrutinen körs, vanligtvis genom att fånga upp anrop till vanliga drivrutinsstödrutiner och ersätta anrop till sina egna felkontrollversioner av samma rutiner. Eftersom drivrutinen faktiskt körs medan de dynamiska verktygen utför verifieringen är falska positiva resultat sällsynta. Men eftersom de dynamiska verktygen bara identifierar de åtgärder som inträffar när de övervakar drivrutinen, kan verktygen missa vissa drivrutinsfel om förarens testtäckning inte är tillräcklig. Samtidigt kan dynamiska verifieringsverktyg genom att använda information som är tillgänglig vid körning – till exempel information som är svårare att extrahera statiskt från källkoden – identifiera vissa klasser av drivrutinsfel som är svårare att identifiera med statiska analysverktyg.

Använd en kombination av statiska och dynamiska verifieringsverktyg. Med statiska verktyg kan du kontrollera kodsökvägar som är svåra att träna i praktiken, medan de dynamiska verktygen hittar allvarliga fel som inträffar i drivrutinen.

Översikt över verifieringsverktyg

Viktigt!

Verktyget SDV (Static Driver Verifier) stöds inte längre. Den är inte tillgänglig i WDK:er som är nyare än version 26017, inklusive Windows 24H2 RTM WDK. Du rekommenderas inte att använda SDV för analys.

WDK beskriver följande verifieringsverktyg och rekommenderar att de används av drivrutinsutvecklare och testare. De visas i den ordning som du vanligtvis använder dem.

När koden har kompilerats

  • CodeQL är en kraftfull semantisk kodanalysmotor. Kombinationen av en omfattande uppsättning säkerhetsfrågor med högt värde och en robust plattform gör den till ett ovärderligt verktyg för att skydda drivrutinskoden. Mer information finns i CodeQL och logotestet för statiska verktyg.

Når drivrutinen körs

Använd följande dynamiska verifieringsverktyg så snart drivrutinen har skapats och körs utan uppenbara fel.

  • Drivrutinsverifierare är ett dynamiskt verifieringsverktyg som skrivits särskilt för Windows-drivrutiner. Den innehåller flera tester som du kan köra på flera drivrutiner samtidigt. Drivrutinsverifieraren är så effektiv på att hitta allvarliga buggar hos drivrutiner som erfarna drivrutinsutvecklare och testare konfigurerar den så att den körs när deras drivrutin körs i en utvecklings- eller testmiljö. Drivrutinsverifieraren ingår i Windows. När du aktiverar drivrutinsverifierare för en drivrutin måste du också köra flera tester på drivrutinen. Drivrutinsverifieraren kan identifiera vissa drivrutinsbuggar som är svåra att identifiera med hjälp av enbart statiska verifieringsverktyg. Exempel på dessa typer av buggar är följande:

    • Buffertöverskridningar i kernelpoolen. När den verifierade drivrutinen allokerar poolminnesbuffertar skyddar drivrutinsverifieraren dem med hjälp av en minnessida som inte är tillgänglig. Om drivrutinen försöker använda minne efter buffertens slut initierar drivrutinsverifieraren en buggkontroll.

    • Använda minne efter att ha frigjort det. Särskilda poolminnesblock använder sin egen minnessida och delar inte minnessidor med andra allokeringar. När drivrutinen frigör blocket med poolminne blir motsvarande minnessida inte tillgänglig. Om drivrutinen försöker använda det minnet efter att ha frigjort det kraschar drivrutinen omedelbart.

    • Använda växlingsbart minne när det körs vid förhöjd IRQL. När en verifierad drivrutin höjer IRQL vid DISPATCH_LEVEL eller högre trimmar Driver Verifier allt sidbart minne från systemets arbetsuppsättning och simulerar ett system under minnestryck. Drivrutinen kraschar om den försöker använda någon av dessa sidaindelade virtuella adresser.

    • Simulering av låga resurser. Om du vill simulera ett system under förhållanden med låga resurser kan drivrutinsverifieraren misslyckas med olika API:er för operativsystemkärnor som drivrutiner anropar.

    • Minnesläckor. Drivrutinsverifieraren spårar minnesallokeringar som görs av en drivrutin och ser till att drivrutinen frigör minnet innan det tas bort.

    • I/O-åtgärder som tar för lång tid att slutföra eller avbrytas. Drivrutinsverifieraren kan testa drivrutinslogik för att STATUS_PENDING svara på returvärden från IoCallDriver.

    • DDI-efterlevnadskontroll. (Tillgänglig från och med Windows 8) Drivrutinsverifieraren tillämpar en uppsättning DDI-regler (Device Driver Interface) som söker efter rätt interaktion mellan en drivrutin och kernelgränssnittet i operativsystemet.

  • Kernel Address Sanitizer (KASAN) är en teknik för felidentifiering som stöds på Windows-drivrutiner som gör att du kan identifiera flera klasser av otillåtna minnesåtkomster, till exempel buffertspill och användning efter kostnadsfria händelser.

  • Programverifierare är ett dynamiskt verifieringsverktyg för användarlägesprogram och drivrutiner som skrivits i C eller C++. Den verifierar inte hanterad kod.