Skapa en WDF-drivrutin för flera versioner av Windows
WDF har alltid gjort det möjligt för dig att skapa en drivrutin en gång och använda den resulterande binärfilen på flera versioner av Windows, men före Windows 10 version 1803 (Redstone 4) var detta begränsat till att "bygga vidare på äldre, köra på nyare". Från och med Windows 10 version 1803 lägger WDF till "build on newer, run on older" med den ytterligare fördelen med villkorsstyrd körning. Sammanfatta:
- Befintlig: Binärfiler som skapats med äldre versioner av ramverket körs på versioner av Windows som innehåller nyare versioner av ramverket, förutsatt att större versioner matchar. Till exempel körs en drivrutin som skapats med KMDF 1.9 (Windows 7) på ett Windows 8-system (KMDF 1.11). I exemplet är drivrutinen begränsad till funktionerna i KMDF 1.9.
- Lade till: Från och med KMDF version 1.25 och UMDF version 2.25 på Windows 10 version 1803 kan du skapa en drivrutin med en nyare ramverksversion och den resulterande drivrutinsbinären körs på tidigare versioner av Windows (minst Windows 10 version 1803). Dessutom kan drivrutinen villkorligt använda funktioner som endast är tillgängliga i nyare ramverksversioner.
Det innebär att drivrutinen inte bara körs på framtida versioner av Windows, som den alltid har gjort, utan även körs på tidigare versioner, tillbaka till Windows 10 version 1803.
Det finns två steg för att göra detta: ange bygginställningar i Visual Studio och utföra en körningskontroll innan du anropar ett API eller öppnar en struktur eller ett fält som kanske eller kanske inte finns.
Obs: Den här funktionen är valfri och en drivrutin bör bara göra det möjligt för den att skapa en drivrutin som använder de senaste WDF-funktionerna samtidigt som den förblir läsbar i tidigare versioner av Windows som inte har de senaste WDF-funktionerna.
Om du inte anger Version Minor (målversion) eller Version Minor (lägsta kravnivå)förblir versioneringen densamma som tidigare.
Ange minsta krav
De nya konfigurationsinställningarna i Visual Studio är:
- KMDF-version mindre (minimalt krävs)
- Mindre version av UMDF (minimikrav)
I enlighet med den här ändringen uppdaterades namnen på två befintliga inställningar:
- DEL- i KMDF-version –>delversion av KMDF (målversion)
- DEL- för UMDF-version –>delversion av UMDF (målversion)
Om du inte ställer in minimikravet för, bygger Visual Studio för målversion och uppåt och erbjuder inte stöd för äldre versioner. Detta matchar beteendet hos de gamla egenskaperna för mindre version.
Om du ställer in lägsta obligatoriskagäller följande krav:
- 25 <= Lägsta obligatoriska <= Målversion
- I Konfigurationsegenskaper –>Drivrutinsinställningar –>Allmännaanger du
_NT_TARGET_VERSION
till0x0A000005
(RS4) eller senare.
Kontrollera om det finns funktioner
Innan du använder ett API, en struktur eller en medlem som kanske inte finns, måste du anropa något av följande makron, som definieras i WdfFuncEnum.h:
BOOLEAN
WDF_IS_FUNCTION_AVAILABLE (
FunctionName
);
BOOLEAN
WDF_IS_STRUCTURE_AVAILABLE (
StructName
);
BOOLEAN
WDF_IS_FIELD_AVAILABLE (
StructName,
FieldName
);
Tänk dig följande exempel. När WDF v29 släpps lägger det till ett nytt API: WdfSomeNewFeature. Om du anger målversion till 29 och lägsta obligatoriska till 25 läses den resulterande drivrutinen in på valfri ramverksversion från 25 till 29 (och därefter, så länge huvudversionen inte ändras), anropar version 25-API:er som tidigare och gör följande kontroll före varje anrop av något v29-API:
if (WDF_IS_FUNCTION_AVAILABLE(WdfSomeNewFeature)) {
WdfSomeNewFeature();
}
Om du inte gör den villkorliga kontrollen kan du se följande:
- Om API:et returnerar NTSTATUS returnerar anropet en felkod.
- Om API:et returnerar något annat än NTSTATUS:
- KMDF: Datorns felkontroller.
- UMDF: WudfHost-processen kraschar med ett DriverStop-fel.
- Om drivrutinsverifieraren är aktiverad kraschar även drivrutinen. Detta hjälper till att identifiera problemet i en testmiljö.
- Tyst minneskorruption (vid åtkomst till en struktur eller ett fält).
En drivrutinskrasch innehåller det misslyckade drivrutinsnamnet, ramverksnamnet och det misslyckade API-indexet. Du kan hämta namnet på API:et genom att leta upp värdet för WDFFUNCENUM i WdfFuncEnum.h.
Mer information om Visual Studio-egenskaper för WDF finns i Egenskaper för drivrutinsmodellinställningar för drivrutinsprojekt.