为不同版本的 Windows 生成驱动程序
如果你在为不同版本的 Windows 编写驱动程序,以下部分提供了一些有关如何使用 Windows 驱动程序工具包 (WDK)、Visual Studio 和 MSBuild 生成这些驱动程序的指南。
用户模式和内核模式驱动程序均适用的生成指南
- 使用 WDK 提供的目标配置和平台生成驱动程序。 应始终使用支持目标 Windows 版本的最新版本的 WDK。 有关 WDK 和操作系统版本支持的信息,请参阅安装 Windows 驱动程序工具包的预览版本和下载 Windows 驱动程序工具包。
- 如果你的驱动程序只能在单个版本的 Windows 上运行,则应为与目标 Windows 版本匹配的目标配置和平台生成驱动程序。
- 如果希望驱动程序在多个版本的 Windows 上运行,但不使用只有较新版本才提供的功能,则应为你希望驱动程序支持的最旧版本生成驱动程序。
如果面向 Windows 7、Windows 8 或 Windows 8.1,则在 .vcxproj 文件中使用 Configuration Manager 或手动设置 TargetVersion,例如 <TargetVersion>Windows7</TargetVersion>
。
如果面向 Windows 10 或 Windows 11,请同时设置 TargetVersion 和 _NT_TARGET_VERSION,例如 <TargetVersion>Windows10</TargetVersion> <_NT_TARGET_VERSION>0xA000006</_NT_TARGET_VERSION>
。
_NT_TARGET_VERSION 值以 NTDDI_WIN10_*
的形式列在 Sdkddkver.h 头文件中,例如 #define NTDDI_WIN10_RS5 0x0A000006
。
内核模式驱动程序适用的生成指南
如果希望内核模式驱动程序在多个版本的 Windows 上运行,并且动态确定驱动程序可用的功能,则应使用最新版本操作系统的生成配置生成驱动程序。 例如,如果希望驱动程序支持从 Windows 8.1 起的所有 Windows 版本,但在驱动程序运行于 Windows 10 或更高版本的操作系统时使用 Windows 10 率先推出的某些功能,则应指定 Windows 10 (Win10) 为目标配置。
使用 RtlIsNtDdiVersionAvailable 和 RtlIsServicePackVersionInstalled 函数来确定你的驱动程序在运行时可用的 Windows 版本。 有关详细信息,请参阅为不同版本的 Windows 编写驱动程序。
创建驱动程序必须按条件调用的函数的指针原型。
如果你有 WDM 驱动程序或非 KMDF 内核模式驱动程序并且针对 Windows 8.1 或 Windows 8,但同时希望在较早版本的 Windows 上运行,则需要重写链接器 $(KernelBufferOverflowLib) 选项。 在选择 Windows 8 或 Windows 8.1 配置时,驱动程序与 BufferOverflowFastFailK.lib 链接,较早版本的 Windows 中没有这一项。 对于 Windows 7 和 Vista,则必须改为与 BufferOverflowK.lib 链接。
重写 $(KernelBufferOverflowLib) 链接器选项有两种方法:使用 MSBuild 或 Visual Studio。
使用 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
使用 Visual Studio:
使用记事本或其他文本编辑器打开驱动程序项目文件 (*.vcxproj)。 在项目文件中,找到驱动程序支持的配置的 <PropertyGroup> ,并添加以下行来重写默认的链接器选项:
XML <KernelBufferOverflowLib>$(DDK_LIB_PATH)\BufferOverflowK.lib</KernelBufferOverflowLib>
例如,如果你的驱动程序支持 Windows 8.1 和 Windows 8 调试和发布版本,这些配置部分会类似如下所示:
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>
<KernelBufferOverflowLib> 元素(导入工具集)必须在驱动程序项目文件中显示在导入 Microsoft.Cpp.props 的元素之前。
修改并保存驱动程序项目文件后,可以在 Visual Studio 中打开该项目文件并生成驱动程序。