Not
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
CodeQL är en kraftfull statisk analysmotor som hjälper utvecklare att identifiera säkerhetsrisker och kodöverträdelser i Windows-drivrutins källkod. Den här artikeln beskriver hur du använder CodeQL-analys för att skapa en drivrutinsverifieringsfil för WHCP-certifiering (Windows Hardware Compatibility Program).
I den här artikeln kommer du att:
- Installera lämplig CodeQL-version.
- Installera nödvändiga CodeQL-paket och frågepaket.
- Kör CodeQL för att skapa en databas och analysera koden.
- Skapa en drivrutinsverifieringsfil.
Välj lämplig CodeQL-version för drivrutinen
Note
Visual Studio (VS) 17.8 bröt kompatibiliteten med äldre versioner av CodeQL som används i grenarna WHCP_21H2 och WHCP_22H2. CodeQL CLI version 2.15.4 verifieras för användning med WHCP 21H2 och WHCP 22H2 när du använder Visual Studio 17.8 eller senare. När du använder Visual Studio 17.7 eller tidigare använder du version 2.4.6 eller version 2.6.3. För WHCP-programmet använder du den CodeQL CLI-version och Windows-version som du certifierar för – version 2.4.6, version 2.6.3 eller version 2.15.4. Använd CodeQL CLI version 2.15.4 för allmän användning med huvudgrenen.
Välj fliken för ditt scenario:
Använd den här matrisen för att fastställa vilka versioner som ska laddas ned.
| Windows-utgåva | CodeQL CLI-version | microsoft/windows-drivers CodeQL-paketversion | microsoft/cpp-queries CodeQL-paketversion | codeql/cpp-queries version | Associerad lagringsplatsgren att använda |
|---|---|---|---|---|---|
| Windows Server 2022 | 2.4.6 eller 2.15.4 | 1.0.13 (Om du använder codeql 2.15.4) | N/A | 0.9.0 (Om du använder codeql 2.15.4) | WHCP_21H2 |
| Windows 11 | 2.4.6 eller 2.15.4 | 1.0.13 (Om du använder codeql 2.15.4) | N/A | 0.9.0 (Om du använder codeql 2.15.4) | WHCP_21H2 |
| Windows 11, version 22H2 | 2.6.3 eller 2.15.4 | 1.0.13 (Om du använder codeql 2.15.4) | N/A | 0.9.0 (Om du använder codeql 2.15.4) | WHCP_22H2 |
| Windows 11, version 23H2 | 2.6.3 eller 2.15.4 | 1.0.13 (Om du använder codeql 2.15.4) | N/A | 0.9.0 (Om du använder codeql 2.15.4) | WHCP_22H2 |
| Windows 11, version 24H2 | 2.15.4 | 1.1.0 | N/A | 0.9.0 | WHCP_24H2 |
| Windows Server 2025 | 2.20.1 | 1.6.0 | 0.0.4 | N/A | WHCP_25H2 |
| Windows 11, version 25H2 | 2.20.1 | 1.6.0 | 0.0.4 | N/A | WHCP_25H2 |
Note
En version av CodeQL-paketet har inte angetts för CodeQL CLI 2.4.6 och 2.6.3 eftersom endast versioner av CodeQL senare än v2.7.0 stöder CodeQL-paket.
CodeQL-versioner som verifierats för användning med WHCP
Den senaste versionsinformationen, inklusive testning av det senaste under utveckling, finns i Tilläggsverktyg för Windows-drivrutinsutvecklare.
| CodeQL CLI-version |
|---|
| 2.21.4 |
| 2.21.2 |
| 2.20.1 |
| 2.15.4 |
Ladda ned och installera CodeQL
Skapa en katalog som ska innehålla CodeQL. I det här exemplet används
C:\codeql-home\C:\> mkdir C:\codeql-homeSe föregående tabeller för att välja vilken version av CodeQL CLI som ska användas i enlighet med den önskade grenen av Microsofts drivrutinsfrågor. Om du utför analys som en del av WHCP-programmet läser du tabellen För användning av Windows maskinvarukompatibilitetsprogram, annars använder du Main-grenen och 2.15.4. Om du använder en annan version kan det leda till att en databas är inkompatibel med biblioteken.
Gå till CodeQL CLI-binärversion som är associerad med de tidigare tabellerna och ladda ned zip-filen i enlighet med projektets arkitektur. Till exempel för 64-bitars Windows codeql-win64.zip.
Extrahera Codeql CLI-katalogen till den du nyss skapade, till exempel : C:\codeql-home\codeql\.
Kontrollera att CodeQL är korrekt installerat genom att kontrollera versionen:
C:\codeql-home\codeql>codeql --version CodeQL command-line toolchain release 2.15.4. Copyright (C) 2019-2023 GitHub, Inc. Unpacked in: C:\codeql-home\codeql Analysis results depend critically on separately distributed query and extractor modules. To list modules that are visible to the toolchain, use 'codeql resolve qlpacks' and 'codeql resolve languages'.
Använda CodeQL-hjälp
C:\codeql-home\codeql\>codeql --help
Usage: codeql <command> <argument>...
Create and query CodeQL databases, or work with the QL language.
GitHub makes this program freely available for the analysis of open-source software and certain other uses, but it is
not itself free software. Type codeql --license to see the license terms.
--license Show the license terms for the CodeQL toolchain.
Common options:
-h, --help Show this help text.
-v, --verbose Incrementally increase the number of progress messages printed.
-q, --quiet Incrementally decrease the number of progress messages printed.
Some advanced options have been hidden; try --help -v for a fuller view.
Commands:
query Compile and execute QL code.
bqrs Get information from .bqrs files.
database Create, analyze and process CodeQL databases.
dataset [Plumbing] Work with raw QL datasets.
test Execute QL unit tests.
resolve [Deep plumbing] Helper commands to resolve disk locations etc.
execute [Deep plumbing] Low-level commands that need special JVM options.
version Show the version of the CodeQL toolchain.
generate Generate formatted QL documentation.
Om du vill ha hjälp med ett specifikt kommando kör du codeql-kommandot <> --help. Till exempel:
codeql create --help
Om du vill få hjälp med underkommandon listar du dem hierarkiskt, till exempel
codeql create language --help
Installera CodeQL-paketen
Välj fliken för din byggmiljö:
Använd den här proceduren om du använder Visual Studio 2022 17.8 eller senare med WHCP_21H2 eller WHCP_22H2 och CodeQL CLI version 2.15.4.
Note
Om du körde CodeQL-tester med en tidigare version av CodeQL ska du ta bort den gamla CodeQL-undermodulen om du fortfarande har en gammal version av den klonade lagringsplatsen. CodeQL kan försöka använda frågorna i undermodulen som standard, vilket kan orsaka fel på grund av felaktiga versioner.
Ladda ned CodeQL-frågepaketen
CodeQL introducerade CodeQL-paket (CodeQL-paket eller frågepaket) i version 2.7.0, vilket eliminerar behovet av att klona lagringsplatsen Windows-Driver-Developer-Supplemental-Tools för att använda frågorna för certifiering.
Note
Du kan hoppa över steg 1 eftersom --download alternativet laddar ned alla nödvändiga frågor senare när du kör analysprocessen.
- Ladda ned rätt version av microsoft/windows-drivers-paketet från tabellen Windows Hardware Compatibility Program Use . Specificera
@<version>i följande kommando.
C:\codeql-home\> codeql pack download microsoft/windows-drivers@<version>
Om du till exempel använder WHCP_24H2 kör du följande kommando för att ladda ned frågepaketet 1.1.0 windows-drivers:
C:\codeql-home\> codeql pack download microsoft/windows-drivers@1.1.0
Använd det här kommandot för att ladda ned version 0.9.0 av frågepaketet CodeQL cpp-querys.
C:\codeql-home\> codeql pack download microsoft/cpp-queries@0.9.0
CodeQL installerar frågepaketen i standardkatalogen:
C:\Users\<current user>\.codeql\packages\microsoft\windows-drivers\<downloaded version>\
Important
Ändra inte installationskatalogen eller flytta det installerade frågepaketet.
Ladda ned Windows-drivrutinsfrågepaketen
Microsoft tillhandahåller två frågepaket för att förenkla arbetsflödet för utvecklare från slutpunkt till slutpunkt. Den rekommenderade.qls-sviten är en superuppsättning av alla frågor som Microsoft anser vara värdefulla för drivrutinsutvecklare, och mustfix.qls-sviten innehåller frågor som anses vara "Must-Fix" för WHCP-certifiering . mustfix.qls måste köras och skickas för att klara logotestet för statiska verktyg.
Kopiera de två frågesvitfilerna från https://github.com/microsoft/Windows-Driver-Developer-Supplemental-Tools/tree/main/src/windows-driver-suites till din lokala dator.
- recommended.qls
- mustfix.qls
Mer information om innehållet i frågesviterna finns i CodeQL-frågor och sviter.
Skapa CodeQL-databasen
De här exemplen förutsätter användning av en Windows-utvecklingsmiljö och att installationsplatsen är C:\codeql-home, men du kan använda den konfiguration som passar dig. En lista över vilka kompilatorer som stöds finns i Språk och ramverk som stöds av CodeQL .
Skapa en katalog för CodeQL för att placera de databaser som skapas. Exempel: C:\codeql-home\databases
mkdir C:\codeql-home\databasesAnvänd CodeQL-kommandot för att skapa en databas med följande parametrar:
- Den första parametern är en länk till din databaskatalog. Till exempel C:\codeql-home\databases\MyDriverDatabase. (Det här kommandot misslyckas om katalogen redan finns.)
-
--languageeller-langer det språk eller språk som källkoden finns i. Det kan vara en kommaavgränsad lista, till exempel [cpp, javascript]. -
--source-rooteller-sanger sökvägen till källkoden. -
--commandeller-canger byggkommandot eller sökvägen till byggfilen.
codeql database create <path to new database> --language=<cpp> --source-root=<driver parent directory> --command=<build command or path to build file>
Examples
Exempel på enskild förare.
C:\codeql-home\codeql> codeql database create D:\DriverDatabase --language=cpp --source-root=D:\Drivers\SingleDriver --command="msbuild /t:rebuild D:\Drivers\SingleDriver\SingleDriver.sln"
Exempel på flera drivrutiner.
C:\codeql-home\codeql> codeql database create D:\SampleDriversDatabase --language=cpp --source-root=D:\AllMyDrivers\SampleDrivers --command=D:\AllMyDrivers\SampleDrivers\BuildAllSampleDrivers.cmd
Mer information eller hjälp med att använda kommandot finns i database createSkapa CodeQL-databaser eller Använda CodeQL-hjälp.
Utföra analys
Nu är det klart att skapa databasen och nästa steg är att utföra den faktiska analysen av drivrutins källkoden.
Använd CodeQL-kommandot för att analysera databasen med hjälp av följande parametrar:
- den första parametern är en länk till din databaskatalog. Till exempel C:\codeql-home\databases\MyDriverDatabase. (Obs! Det här kommandot misslyckas om katalogen inte finns.)
-
--formatär filtypen för utdatafilen. Alternativen är: SARIF och CSV. (För WHCP-användare använder du SARIF-format.) -
--outputär sökvägen till den plats där du vill ha utdatafilen, se till att inkludera formatet i filnamnet. (Det här kommandot misslyckas om katalogen inte redan finns.) - parametern query specifiers är en blankstegsavgränsad lista med argument som kan innehålla:
- en sökväg till en frågefil
- en sökväg till en katalog som innehåller frågefiler
- en sökväg till en frågesvitfil
- namnet på ett CodeQL-frågepaket
codeql database analyze <path to database> <path to query suite .qls file> --format=sarifv2.1.0 --output=<outputname>.sarifExample:
codeql database analyze D:\DriverDatabase suites/windows\recommended.qls --format=sarifv2.1.0 --output=D:\DriverAnalysis1.sarifMer information eller hjälp med att använda
database analyzekommandot finns i Analysera databaser med CodeQL CLI, Använda ett CodeQL-paket för att analysera en CodeQL-databas eller Använda CodeQL-hjälp.
Visa och tolka resultat
Vi kommer att fokusera på SARIF-format för det här avsnittet eftersom det är vad som krävs för följande steg, även om du är välkommen att använda CSV-format om det passar dina behov bättre.
SARIF (Static Analysis Results Interchange Format) är ett JSON-typformat som används för att dela statiska analysresultat. Läs mer om standarden på OASIS Static Analysis Results Interchange Format (SARIF), hur CodeQL använder SARIF-utdata och schema-json.
Det finns flera metoder för att tolka analysresultaten, inklusive manuellt sortering genom objekten. Här är några som vi använder:
Microsoft Sarif Viewer (Web) har funktioner som gör att du kan dra och släppa din SARIF-fil i visningsprogrammet och sedan visa resultat kategoriserade efter regel. Det här är ett mycket snabbt och enkelt sätt att se antalet överträdelser eller vilka frågor som har överträdelser, men mindre enkelt att hitta källkodsinformation förutom radnumret. Observera att sidan inte uppdateras om det inte finns några överträdelser.
Microsoft SARIF Viewer för Visual Studio är perfekt för att visa resultaten i Visual Studio för sömlös övergång från resultat till källkod.
SARIF-tillägget för Visual Studio Code öppnar en förhandsgranskningsruta och visar eventuella fel, varningar eller problem som rapporterats av CodeQL. Om du vill visa Sarif-filen i ett läsbart format öppnar du filen i Visual Studio Code och väljer Skift-Alt-F.
Det viktigaste avsnittet i SARIF-filen är Results egenskapen i Run objektet. Varje fråga har en results-egenskap med information om eventuella identifierade överträdelser och var den inträffade. Om inga överträdelser hittas kommer egenskapsvärdet att vara tomt.
Frågor klassificeras med hjälp av statusar som fel, varning och problem. Den här klassificeringen skiljer sig dock från hur Windows Maskinvarukompatibilitetsprogram och Static Tools Logo Test betygsätter resultaten. Alla drivrutiner med defekter från en fråga i Must-Fix-paketetklarar inte logotestet för statiska verktyg och kommer inte att certifieras, oavsett frågeklassificeringen i den råa frågefilen (till exempel varning).
Konvertera SARIF till drivrutinsverifieringsloggformat (DVL)
Logotestet för statiska verktyg parsar en drivrutinsverifieringslogg (DVL), som är det kompilerade resultatet av den statiska CodeQL-analys som du kör på drivrutins källkoden. Det finns tre sätt att konvertera SARIF-filen till DVL-format: Visual Studio, MSBuild eller från kommandoraden med hjälp av verktygetdvl.exe . Fullständiga steg finns i Skapa en drivrutinsverifieringslogg.
Ytterligare instruktioner för HLK-test för statiska verktygslogotyp och vägledning om var du ska placera DVL-filen finns i Köra test av static tools-logotypen.
Troubleshooting
Om du certifierar med WHCP kontrollerar du först att du använder den HLK-version som är associerad med Windows-versionen som du riktar in dig på, den associerade grenen i lagringsplatsen tilläggsverktyg för Windows-drivrutinen och den efterföljande CodeQL CLI-versionen. Information om HLK/Windows Release-kompatibilitetsmatris finns i Windows Hardware Lab Kit och för Windows Release/Windows Driver Developer Supplemental Tools repo branch/CodeQL CLI-versionen. Mer information finns i WHCP-tabellen i avsnittet Välj CodeQL-version .
Fel och lösningar
För problem med matchning av databasversioner kan följande verktyg vara till hjälp.
Använd kommandot codeql-version för att visa versionen av codeql exe.
C:\codeql-home\codeql\>codeql version
CodeQL command-line toolchain release 2.4.0.
Copyright (C) 2019-2020 GitHub, Inc.
Unpacked in: C:\codeql-home\codeql\
Analysis results depend critically on separately distributed query and
extractor modules. To list modules that are visible to the toolchain,
use 'codeql resolve qlpacks' and 'codeql resolve languages'.
Kommandot för databasuppgradering uppdaterar en databas. Tänk på att detta är en enkelriktad uppgradering och inte är reversibel. Mer information finns i databasuppgradering.
Valfria procedurer
Du kan också utelämna CodeQL-resultat eller köra bygg- och analysprocedurerna som en händelse efter bygget i Visual Studio.
Utelämna CodeQL-resultat
CodeQL för drivrutiner stöder undertryckning av resultat. Undertryckningar tillhandahålls för närvarande som ett hjälpmedel för att hjälpa utvecklare att sortera problem och minska bruset, och inte som ett sätt att kringgå Must-Fix-kontrollerna. De har ingen inverkan på att generera en drivrutinsverifieringslogg eller klara det statiska verktyg-logotestet för närvarande. Om du vill använda undertryckningar måste du köra frågan DriverAlertSuppression.ql samtidigt som de andra frågorna eller sviterna som du vill köra. Som standard är den här frågan aktiverad när du kör våra sviter från vår githubs main/development-gren.
För kontroller som har överförts från kodanalys kommer befintliga undantag för kodanalys att respekteras. Mer information finns i C++-varnings pragma.
-
Known limitation:Du kan inte kombinera en #pragma(inaktivera) och #pragma(utelämna) på samma rad just nu.
För kontroller som är nya för CodeQL undertrycker du dem genom att göra en av två saker:
Skriv en
#pragma(suppress:the-rule-id-here)anteckning (utan citattecken) på raden ovanför överträdelsen, som du gör för kodanalys. Ersätt "regeln-id-här" med@idvärdet i frågans metadata, som kan visas överst i filen.Skriv en kommentar på raden ovan som består av texten "lgtm[the-rule-id-here]" (minus citattecken). Du måste köra standardfråga för undertryckning av C/C++-aviseringar i stället för frågan för undertryckning av drivrutinsaviseringar.
När en undertryckning finns och identifieras innehåller den resulterande SARIF-filen data som ett resultat har undertryckts, och de flesta resultatvisningsprogram visar inte resultatet som standard.
Visual Studio-händelse efter kompilering
Om du skapar drivrutinen med Visual Studio kan du konfigurera CodeQL-frågor så att de körs som en händelse efter bygget.
I det här exemplet skapas en liten batchfil i målkatalogen och körs som en händelse efter kompileringen. Mer information om Visual Studio C++-bygghändelser finns i Ange bygghändelser.
Skapa en liten batchfil som återskapar CodeQL-databasen och kör sedan önskade frågor på den. I det här exemplet får batchfilen namnet
RunCodeQLRebuildQuery.bat. Ändra sökvägarna som visas i batch-exempelfilen så att de matchar dina katalogplatser.ECHO ">>> Running CodeQL Security Rule V 1.0 <<<" ECHO ">>> Removing previously created rules database <<<" rmdir /s/q C:\codeql-home\databases\kmdf CALL C:\codeql-home\codeql\codeql\codeql.cmd database create -l=cpp -s="C:\codeql-home\drivers\kmdf" -c "msbuild /p:Configuration=Release /p:Platform=x64 C:\codeql-home\drivers\kmdf\kmdfecho.sln /t:rebuild /p:PostBuildEventUseInBuild=false " "C:\codeql-home\databases\kmdf" -j 0 CALL C:\codeql-home\codeql\codeql\codeql database analyze "C:\codeql-home\databases\kmdf" "<path to query suite .qls file>" --format=sarifv2.1.0 --output=C:\codeql-home\databases\kmdf.sarif -j 0 --rerun ECHO ">>> Loading SARIF Results in Visual Studio <<<" CALL devenv /Edit C:\codeql-home\databases\kmdf.sarif SET ERRORLEVEL = 0Alternativet devenv.exe/redigera används i batchfilen för att öppna SARIF-resultatfilen i den befintliga instansen av Visual Studio. Om du vill visa SARIF-resultaten installerar du Microsoft SARIF Viewer för Visual Studio och läser anvisningarna där för mer information.
I drivrutinsprojektet navigerar du till projektegenskaper. I rullgardinsmenyn Konfiguration, välj den konfiguration som du vill kontrollera med CodeQL – vi rekommenderar Release. Det tar några minuter att skapa CodeQL-databasen och köra frågorna, så vi rekommenderar inte att du kör CodeQL i felsökningskonfigurationen för projektet.
Välj Skapa händelser och Händelse efter bygge i egenskaperna för drivrutinsprojektet.
Ange en sökväg till batchfilen och en beskrivning av händelsen efter bygget.
Batchfilens resultat visas i slutet av byggutdata.
1>Starting evaluation of codeql-cpp\Likely Bugs\Underspecified Functions\MistypedFunctionArguments.ql. 1>Starting evaluation of codeql-cpp\Likely Bugs\Underspecified Functions\TooManyArguments.ql. 1>Starting evaluation of codeql-cpp\Likely Bugs\Underspecified Functions\TooFewArguments.ql. 1>Starting evaluation of codeql-cpp\Likely Bugs\Underspecified Functions\ImplicitFunctionDeclaration.ql. 1>[1/4 eval 4.4s] Evaluation done; writing results to codeql-cpp\Likely Bugs\Underspecified Functions\TooManyArguments.bqrs. 1>[2/4 eval 4.4s] Evaluation done; writing results to codeql-cpp\Likely Bugs\Underspecified Functions\TooFewArguments.bqrs. 1>[3/4 eval 4.5s] Evaluation done; writing results to codeql-cpp\Likely Bugs\Underspecified Functions\ImplicitFunctionDeclaration.bqrs. 1>[4/4 eval 5.2s] Evaluation done; writing results to codeql-cpp\Likely Bugs\Underspecified Functions\MistypedFunctionArguments.bqrs. 1>Shutting down query evaluator. 1>Interpreting results. 1>">>> Loading SARIF Results in Visual Studio <<<"