Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Wanneer u een stuurprogrammaproject maakt, geeft u het minimale doelbesturingssysteem op. Dit is de minimale versie van Windows waarop uw stuurprogramma wordt uitgevoerd. U kunt bijvoorbeeld opgeven dat Windows 7 het minimale doelbesturingssysteem is. In dat geval zou uw stuurprogramma worden uitgevoerd op Windows 7 en latere versies van Windows.
Notitie
Als u een stuurprogramma ontwikkelt voor een bepaalde minimale versie van Windows en u wilt dat uw stuurprogramma in latere versies van Windows werkt, mag u geen niet-gedocumenteerde functies gebruiken en mag u geen gedocumenteerde functies gebruiken op een andere manier dan hoe dit wordt beschreven in de documentatie. Anders kan uw stuurprogramma niet worden uitgevoerd in de latere versies van Windows. Zelfs als u voorzichtig bent geweest met het gebruik van alleen gedocumenteerde functies, moet u uw stuurprogramma testen op de nieuwe versie van Windows telkens wanneer er een wordt uitgebracht.
Een stuurprogramma met meerdere versies schrijven met alleen algemene functies
Wanneer u een stuurprogramma ontwerpt dat wordt uitgevoerd op meerdere versies van Windows, is de eenvoudigste methode om het stuurprogramma toe te staan om alleen DDI-functies en -structuren te gebruiken die gebruikelijk zijn voor alle versies van Windows waarop het stuurprogramma wordt uitgevoerd. In deze situatie stelt u het minimale doelbesturingssysteem in op de vroegste versie van Windows die door het stuurprogramma wordt ondersteund.
Als u bijvoorbeeld alle versies van Windows wilt ondersteunen, vanaf Windows 7, moet u het volgende doen:
Ontwerp en implementeer het stuurprogramma zodat alleen de functies worden gebruikt die aanwezig zijn in Windows 7.
Wanneer u uw stuurprogramma bouwt, geeft u Windows 7 op als het minimale doelbesturingssysteem.
Hoewel dit proces eenvoudig is, kan het stuurprogramma beperken tot het gebruik van slechts een subset van de functionaliteit die beschikbaar is in latere versies van Windows. In veel gevallen wilt u gebruikmaken van nieuwere functionaliteit van het besturingssysteem wanneer deze beschikbaar is om de beveiliging te verbeteren, de betrouwbaarheid te verbeteren of nieuwere functies in te schakelen.
Een stuurprogramma met meerdere versies schrijven dat gebruikmaakt van versieafhankelijke functies
Een stuurprogramma in de kernelmodus kan dynamisch bepalen of een api van een besturingssysteem beschikbaar is of welke versie van het stuurprogramma wordt uitgevoerd en ervoor kiezen om functies te gebruiken die beschikbaar zijn in die runtime-omgeving. Een stuurprogramma dat alle versies van Windows moet ondersteunen, vanaf Windows 7, kan bijvoorbeeld bepalen op runtime welke versie van Windows wordt uitgevoerd. Als het stuurprogramma wordt uitgevoerd in Windows 7, moet het alleen de DDI-functies gebruiken die door Windows 7 worden ondersteund. Hetzelfde stuurprogramma kan echter gebruikmaken van extra DDI-functies die uniek zijn voor Windows 8, bijvoorbeeld wanneer de runtimecontrole bepaalt dat deze API's momenteel aanwezig zijn of bepaalt dat deze worden uitgevoerd in Windows 8.
Notitie
Het wordt aanbevolen om waar mogelijk te controleren op functie- of API-beschikbaarheid in plaats van te controleren of uw stuurprogramma wordt uitgevoerd op een bepaalde besturingssysteemversie of hoger.
Afhankelijke functies van Windows-versies voorwaardelijk aanroepen
Een kernelmodusstuurprogramma kan gebruikmaken van de functies MmGetSystemRoutineAddress of MmGetSystemRoutineAddressEx functies om dynamisch te controleren of een bepaalde API die deze wil gebruiken beschikbaar is in de huidige uitvoeringstijdomgeving en om een functieaanwijzer op te halen die moet worden gebruikt om die API aan te roepen.
Notitie
Als u typecontrole wilt behouden en onbedoelde fouten wilt voorkomen, moet u een typedef maken die het oorspronkelijke functietype weerspiegelt.
Voorbeeld: API-beschikbaarheid bepalen en API voorwaardelijk aanroepen
typedef
NTSTATUS
(*PFN_IoOpenDriverRegistryKey)(
PDRIVER_OBJECT DriverObject,
DRIVER_REGKEY_TYPE RegKeyType,
ACCESS_MASK DesiredAccess,
ULONG Flags,
PHANDLE DriverRegKey
);
VOID ExampleFunction(VOID) {
NTSTATUS status = STATUS_UNSUCCESSFUL;
HANDLE persistentStateKey = NULL;
PFN_IoOpenDriverRegistryKey pfnIoOpenDriverRegistryKey = NULL;
UNICODE_STRING functionName = {0};
RtlInitUnicodeString(&functionName, L"IoOpenDriverRegistryKey");
pfnIoOpenDriverRegistryKey = (PFN_IoOpenDriverRegistryKey)MmGetSystemRoutineAddress(&functionName);
if (pfnIoOpenDriverRegistryKey != NULL) {
// Open a key to where state can be stored under the driver service
status = pfnIoOpenDriverRegistryKey(g_GlobalStructure.DriverObject,
DriverRegKeyPersistentState,
KEY_WRITE,
0,
&persistentStateKey);
} else {
// Fall back to opening up a different location to store state in
}
// Use the opened registry key
}
De Windows-versie bepalen
Een kernelmodusstuurprogramma kan de functie RtlVerifyVersionInfo gebruiken om dynamisch te controleren op welke versie van Windows deze momenteel wordt uitgevoerd.
Notitie
Het wordt aanbevolen om waar mogelijk te controleren op functie- of API-beschikbaarheid in plaats van te controleren of uw stuurprogramma wordt uitgevoerd op een bepaalde besturingssysteemversie of hoger.
Voorbeeld: De Windows-versie bepalen
In het volgende voorbeeld wordt gedetecteerd of de huidige versie van het besturingssysteem groter is dan of gelijk is aan versie 10.0 en detecteert of het buildnummer groter is dan of gelijk is aan build 22000 (Windows 11, versie 21H2).
...
NTSTATUS Status = STATUS_SUCCESS;
RTL_OSVERSIONINFOEXW VersionInfo = {0};
ULONG TypeMask = 0;
ULONGLONG ConditionMask = 0;
VersionInfo.dwOSVersionInfoSize = sizeof(VersionInfo);
VersionInfo.dwMajorVersion = 10;
VersionInfo.dwMinorVersion = 0;
VersionInfo.dwBuildNumber = 22000;
TypeMask = VER_MAJORVERSION | VER_MINORVERSION | VER_BUILDNUMBER;
VER_SET_CONDITION(ConditionMask, VER_MAJORVERSION, VER_GREATER_EQUAL);
VER_SET_CONDITION(ConditionMask, VER_MINORVERSION, VER_GREATER_EQUAL);
VER_SET_CONDITION(ConditionMask, VER_BUILDNUMBER, VER_GREATER_EQUAL);
Status = RtlVerifyVersionInfo(&VersionInfo,
TypeMask,
ConditionMask);
if (NT_SUCCESS(Status)) {
//
// The call to RtlVerifyVersionInfo succeeded, so the running OS
// version and build number is greater than or equal to the value
// specified. Do appropriate action for newer OS versions.
//
} else if (Status == STATUS_REVISION_MISMATCH) {
//
// The running OS version is less than the value specified. Do
// appropriate action for older OS versions.
//
} else {
//
// There was an error comparing to the running OS version. Do
// appropriate action for when the OS version is not known.
//
}
...