Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Podczas tworzenia projektu sterownika należy określić minimalny docelowy system operacyjny, czyli minimalną wersję systemu Windows uruchomioną przez sterownik. Można na przykład określić, że system Windows 7 jest minimalnym docelowym systemem operacyjnym. W takim przypadku sterownik będzie działać w systemie Windows 7 i nowszych wersjach systemu Windows.
Notatka
Jeśli tworzysz sterownik dla konkretnej minimalnej wersji systemu Windows i chcesz, aby sterownik działał w nowszych wersjach systemu Windows, nie można używać żadnych funkcji nieudokumentowanych i nie można używać udokumentowanych funkcji w żaden sposób inny niż opisany w dokumentacji. W przeciwnym razie sterownik może nie działać w nowszych wersjach systemu Windows. Nawet jeśli starano się używać tylko udokumentowanych funkcji, należy przetestować sterownik w nowej wersji systemu Windows za każdym razem, gdy zostanie wydany.
Pisanie sterownika z wieloma wersjami przy użyciu tylko typowych funkcji
Podczas projektowania sterownika, który będzie uruchamiany w wielu wersjach systemu Windows, najprostszym podejściem jest umożliwienie sterownikowi używania tylko funkcji I struktur DDI, które są wspólne dla wszystkich wersji systemu Windows, na których będzie działać sterownik. W takiej sytuacji należy ustawić minimalny docelowy system operacyjny na najwcześniejszą wersję systemu Windows obsługiwaną przez sterownik.
Aby na przykład obsługiwać wszystkie wersje systemu Windows, począwszy od systemu Windows 7, należy:
Zaprojektuj i zaimplementuj sterownik tak, aby używał tylko tych funkcji, które są obecne w systemie Windows 7.
Podczas tworzenia sterownika określ system Windows 7 jako minimalny docelowy system operacyjny.
Chociaż ten proces jest prosty, może ograniczyć sterownik do używania tylko podzestawu funkcji, które są dostępne w nowszych wersjach systemu Windows. W wielu przypadkach warto korzystać z nowszych funkcji systemu operacyjnego, gdy jest dostępna, aby zwiększyć bezpieczeństwo, zwiększyć niezawodność lub włączyć nowsze funkcje.
Pisanie sterownika z wieloma wersjami, który korzysta z funkcji zależnych od wersji
Sterownik trybu jądra może dynamicznie określić, czy dostępny jest interfejs API systemu operacyjnego lub na której wersji systemu Windows działa sterownik, i wybrać korzystanie z funkcji dostępnych w tym środowisku czasu wykonywania. Na przykład sterownik, który musi obsługiwać wszystkie wersje systemu Windows, począwszy od systemu Windows 7, może określić, w czasie wykonywania, wersję systemu Windows, na którym działa. Jeśli sterownik jest uruchomiony w systemie Windows 7, musi używać tylko funkcji DDI, które obsługuje system Windows 7. Jednak ten sam sterownik może używać dodatkowych funkcji DDI, które są unikatowe dla systemu Windows 8, na przykład gdy jego sprawdzanie czasu wykonywania określa, że te interfejsy API są obecnie obecne lub określa, że jest uruchomiony w systemie Windows 8.
Notatka
Zaleca się sprawdzenie dostępności funkcji lub interfejsu API zawsze, gdy jest to możliwe, zamiast sprawdzać, czy sterownik jest uruchomiony w określonej wersji systemu operacyjnego lub nowszej.
Warunkowe wywoływanie funkcji zależnych od wersji systemu Windows
Sterownik trybu jądra może używać MmGetSystemRoutineAddress lub MmGetSystemRoutineAddressEx funkcji w celu dynamicznego sprawdzenia, czy określony interfejs API, którego chce użyć, jest dostępny w bieżącym środowisku czasu wykonywania oraz uzyskania wskaźnika funkcji do użycia w celu wywołania tego interfejsu API.
Notatka
Aby ułatwić zachowanie sprawdzania typów i zapobiegania niezamierzonym błędom, należy utworzyć definicję typu, która odzwierciedla oryginalny typ funkcji.
Przykład: określanie dostępności interfejsu API i warunkowe wywoływanie interfejsu API
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
}
Określanie wersji systemu Windows
Sterownik trybu jądra może używać funkcji RtlVerifyVersionInfo, aby dynamicznie sprawdzić, która wersja systemu Windows jest aktualnie uruchomiona.
Notatka
Zaleca się sprawdzenie dostępności funkcji lub interfejsu API zawsze, gdy jest to możliwe, zamiast sprawdzać, czy sterownik jest uruchomiony w określonej wersji systemu operacyjnego lub nowszej.
Przykład: określanie wersji systemu Windows
Poniższy przykład wykrywa, czy aktualnie uruchomiona wersja systemu operacyjnego jest większa lub równa wersji 10.0 i wykrywa, czy numer kompilacji jest większy lub równy kompilacji 22000 (Windows 11, wersja 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.
//
}
...