Erstellen von Treibern für verschiedene Windows-Versionen
Wenn Sie Treiber für verschiedene Versionen von Windows schreiben, enthält der folgende Abschnitt einige Richtlinien zum Erstellen dieser Treiber mit dem Windows Driver Kit (WDK), Visual Studio und MSBuild.
Richtlinien, die für die Erstellung von Treibern im Benutzermodus und Kernelmodus gelten
- Erstellen Sie Ihre Treiber mithilfe der Zielkonfigurationen und -plattformen, die vom WDK bereitgestellt werden. Verwenden Sie immer die neueste Version des WDK, die die Windows-Version unterstützt, die Sie als Ziel verwenden möchten. Informationen zur Unterstützung von WDK und Betriebssystemversionen finden Sie unter Installieren von Vorschauversionen des Windows Driver Kit und Herunterladen des Windows Driver Kit.
- Wenn Ihr Treiber nur unter einer einzelnen Windows-Version ausgeführt werden muss, erstellen Sie den Treiber für die Zielkonfiguration und -plattform, die Ihrer Windows-Zielversion entspricht.
- Wenn Ihr Treiber unter mehreren Versionen von Windows ausgeführt werden soll, aber ohne Features, die nur in neueren Versionen verfügbar sind, erstellen Sie den Treiber für die älteste Version, die der Treiber unterstützen soll.
Wenn Sie Windows 7, Windows 8 oder Windows 8.1 verwenden, legen Sie TargetVersion mithilfe des Configuration Manager oder manuell in der VCXPROJ-Datei fest, z. B<TargetVersion>Windows7</TargetVersion>
. .
Wenn Sie auf Windows 10 oder Windows 11 abzielen, legen Sie targetVersion und _NT_TARGET_VERSION fest, z. B<TargetVersion>Windows10</TargetVersion> <_NT_TARGET_VERSION>0xA000006</_NT_TARGET_VERSION>
. .
_NT_TARGET_VERSION Werte werden in der Headerdatei Sdkddkver.h im Format NTDDI_WIN10_*
aufgeführt, z. B #define NTDDI_WIN10_RS5 0x0A000006
. .
Richtlinien, die für die Erstellung von Kernelmodustreibern gelten
Wenn Der Kernelmodustreiber unter mehreren Versionen von Windows ausgeführt werden soll und die für den Treiber verfügbaren Features dynamisch bestimmt werden soll, erstellen Sie den Treiber mithilfe der Buildkonfiguration für die neueste Version des Betriebssystems. Wenn Ihr Treiber beispielsweise alle Versionen von Windows ab Windows 8.1 unterstützt, aber bestimmte Features verwenden soll, die zuerst in Windows 10 verfügbar waren, wenn der Treiber unter Windows 10 oder höheren Versionen des Betriebssystems ausgeführt wird, geben Sie Windows 10 (Win10) als Zielkonfiguration an.
Verwenden Sie die Funktionen RtlIsNtDdiVersionAvailable und RtlIsServicePackVersionInstalled , um die Windows-Version zu ermitteln, die ihrem Treiber zur Laufzeit zur Verfügung steht. Weitere Informationen finden Sie unter Schreiben von Treibern für verschiedene Versionen von Windows.
Erstellen Sie Prototypen für Zeiger auf Funktionen, die Ihr Treiber bedingt aufrufen muss.
Wenn Sie über einen WDM-Treiber oder einen Kernelmodustreiber ohne KMDF verfügen und auf Windows 8.1 oder Windows 8 abzielen, aber auch unter früheren Versionen von Windows ausführen möchten, müssen Sie die Linkeroption $(KernelBufferOverflowLib) überschreiben. Wenn Sie Windows 8- oder Windows 8.1-Konfigurationen auswählen, wird der Treiber mit BufferOverflowFastFailK.lib verknüpft, die in früheren Windows-Versionen nicht verfügbar ist. Für Windows 7 und Vista müssen Sie stattdessen mit BufferOverflowK.lib verknüpfen.
Es gibt zwei Möglichkeiten, die Linkeroption $(KernelBufferOverflowLib) mit MSBuild oder Visual Studio zu überschreiben.
Verwenden von MSBuild:
msbuild /p:KernelBufferOverflowLib="C:\Program Files (x86)\Windows Kits\8.1\Lib\win8\km\x64\BufferOverflowK.lib" /p:platform=x64 /p:Configuration="Win8 Release" myDriver.sln
Verwenden von Visual Studio:
Öffnen Sie mit Editor oder einem anderen Text-Editor die Treiberprojektdatei (*.vcxproj). Suchen Sie in der Projektdatei die <PropertyGroup> für die vom Treiber unterstützten Konfigurationen, und fügen Sie die folgende Zeile hinzu, um die Standardlinkeroption außer Kraft zu setzen:
XML <KernelBufferOverflowLib>$(DDK_LIB_PATH)\BufferOverflowK.lib</KernelBufferOverflowLib>
Wenn Ihr Treiber beispielsweise Windows 8.1 und Windows 8 Debug- und Releasebuilds unterstützt, würden diese Konfigurationsabschnitte wie folgt aussehen:
XML <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Debug|Win32'" Label="Configuration"> <TargetVersion>WindowsV6.3</TargetVersion> <UseDebugLibraries>true</UseDebugLibraries> <KernelBufferOverflowLib>$(DDK_LIB_PATH)\BufferOverflowK.lib</KernelBufferOverflowLib> <PlatformToolset>WindowsKernelModeDriver8.1</PlatformToolset> <ConfigurationType>Driver</ConfigurationType> <DriverType>KMDF</DriverType> </PropertyGroup> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8.1 Release|Win32'" Label="Configuration"> <TargetVersion>WindowsV6.3</TargetVersion> <UseDebugLibraries>false</UseDebugLibraries> <KernelBufferOverflowLib>$(DDK_LIB_PATH)\BufferOverflowK.lib</KernelBufferOverflowLib> <PlatformToolset>WindowsKernelModeDriver8.1</PlatformToolset> <ConfigurationType>Driver</ConfigurationType> <DriverType>KMDF</DriverType> </PropertyGroup> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Debug|Win32'" Label="Configuration"> <TargetVersion>Windows8</TargetVersion> <UseDebugLibraries>true</UseDebugLibraries> <KernelBufferOverflowLib>$(DDK_LIB_PATH)\BufferOverflowK.lib</KernelBufferOverflowLib> <PlatformToolset>WindowsKernelModeDriver8.1</PlatformToolset> <ConfigurationType>Driver</ConfigurationType> <DriverType>KMDF</DriverType> </PropertyGroup> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Win8 Release|Win32'" Label="Configuration"> <TargetVersion>Windows8</TargetVersion> <UseDebugLibraries>false</UseDebugLibraries> <KernelBufferOverflowLib>$(DDK_LIB_PATH)\BufferOverflowK.lib</KernelBufferOverflowLib> <PlatformToolset>WindowsKernelModeDriver8.1</PlatformToolset> <ConfigurationType>Driver</ConfigurationType> <DriverType>KMDF</DriverType> </PropertyGroup>
Die <KernelBufferOverflowLib-Elemente> müssen in der Treiberprojektdatei vor dem Element angezeigt werden, das Microsoft.Cpp.props importiert, das den Toolsatz importiert.
Nachdem Sie die Treiberprojektdatei geändert und gespeichert haben, können Sie die Projektdatei in Visual Studio öffnen und den Treiber erstellen.