Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Bir sürücü projesi oluşturduğunuzda, sürücünüzün üzerinde çalıştıracağı en düşük Windows sürümü olan en düşük hedef işletim sistemini belirtirsiniz. Örneğin, Windows 7'nin en düşük hedef işletim sistemi olduğunu belirtebilirsiniz. Bu durumda, sürücünüz Windows'un Windows 7 ve sonraki sürümlerinde çalışır.
Uyarı
Windows'un belirli bir en düşük sürümü için bir sürücü geliştirirseniz ve sürücünüzün Windows'un sonraki sürümlerinde çalışmasını istiyorsanız, belgelenmemiş işlevler kullanmamalısınız ve belgelenmiş işlevleri belgelerde açıklanandan başka bir şekilde kullanmamalısınız. Aksi takdirde sürücünüz Windows'un sonraki sürümlerinde çalışamayabilir. Yalnızca belgelenmiş işlevleri kullanmaya dikkat etseniz bile, sürücünüzü her yayınlandığında yeni Windows sürümünde test etmelisiniz.
Yalnızca ortak özellikleri kullanarak çok sürümlü sürücü yazma
Windows'un birden çok sürümünde çalışacak bir sürücü tasarlarken en basit yaklaşım, sürücünün yalnızca sürücünün üzerinde çalıştırılacağı tüm Windows sürümlerinde ortak olan DDI işlevlerini ve yapılarını kullanmasına izin vermektir. Bu durumda, en düşük hedef işletim sistemini sürücünün destekleyeceği en eski Windows sürümüne ayarlarsınız.
Örneğin, Windows 7'den başlayarak windows'un tüm sürümlerini desteklemek için şunları yapmalısınız:
Sürücüyü yalnızca Windows 7'de bulunan özellikleri kullanabilecek şekilde tasarlayın ve uygulayın.
Sürücünüzü oluştururken en düşük hedef işletim sistemi olarak Windows 7'yi belirtin.
Bu işlem basit olsa da, sürücüyü Windows'un sonraki sürümlerinde kullanılabilen işlevselliğin yalnızca bir alt kümesini kullanacak şekilde kısıtlayabilir. Çoğu durumda, güvenliği geliştirmek, güvenilirliği artırmak veya daha yeni özellikleri etkinleştirmek için kullanılabilir olduğunda daha yeni işletim sistemi işlevselliğinden yararlanmak isteyeceksiniz.
Sürüm bağımlı özellikleri kullanan çoklu sürüm bir sürücü yazma
Çekirdek modu sürücüsü, sağlanan bir işletim sistemi API'sinin kullanılabilir olup olmadığını veya sürücünün hangi Windows sürümünün üzerinde çalıştığını dinamik olarak belirleyebilir ve bu çalışma zamanı ortamında kullanılabilen özellikleri kullanmayı seçebilir. Örneğin, Windows 7'den başlayarak tüm Windows sürümlerini desteklemesi gereken bir sürücü, çalışma zamanında üzerinde çalıştığı Windows sürümünü belirleyebilir. Sürücü Windows 7'de çalışıyorsa yalnızca Windows 7'nin desteklediği DDI işlevlerini kullanmalıdır. Ancak, aynı sürücü Windows 8'e özgü ek DDI işlevleri kullanabilir; örneğin, çalışma zamanı denetimi söz konusu API'lerin şu anda mevcut olduğunu belirlediğinde veya Windows 8'de çalıştığını belirlediğinde.
Uyarı
Sürücünüzün belirli bir işletim sistemi sürümünde veya sonraki bir sürümde çalışıp çalışmadığını denetlemeye çalışmak yerine mümkün olduğunda özellik veya API kullanılabilirliğini denetlemeniz önerilir.
Windows sürümüne bağımlı işlevleri koşullu olarak çağırma
Çekirdek modu sürücüsü, kullanmak istediği belirli bir API'nin geçerli çalışma zamanı ortamında kullanılabilir olup olmadığını dinamik olarak denetlemek ve bu API'yi çağırmak için kullanılacak işlev işaretçisini almak için MmGetSystemRoutineAddress veya MmGetSystemRoutineAddressEx işlevlerini kullanabilir.
Uyarı
Tür denetimini korumaya ve istenmeyen hataları önlemeye yardımcı olmak için özgün işlev türünü yansıtan bir tür tanımı oluşturmanız gerekir.
Örnek: API kullanılabilirliğini belirleme ve API'yi koşullu olarak çağırma
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
}
Windows sürümünü belirleme
Çekirdek modu sürücüsü, şu anda hangi Windows sürümünde çalıştığını dinamik olarak denetlemek için RtlVerifyVersionInfo işlevini kullanabilir.
Uyarı
Sürücünüzün belirli bir işletim sistemi sürümünde veya sonraki bir sürümde çalışıp çalışmadığını denetlemeye çalışmak yerine mümkün olduğunda özellik veya API kullanılabilirliğini denetlemeniz önerilir.
Örnek: Windows sürümünü belirleme
Aşağıdaki örnek, şu anda çalışan işletim sistemi sürümünün sürüm 10.0'dan büyük veya buna eşit olup olmadığını algılar ve derleme numarasının derleme 22000'den büyük veya buna eşit olup olmadığını algılar (Windows 11, sürüm 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.
//
}
...