为不同版本的 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) 为目标配置。

  • 使用 RtlIsNtDdiVersionAvailableRtlIsServicePackVersionInstalled 函数来确定你的驱动程序在运行时可用的 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 中打开该项目文件并生成驱动程序。