Поделиться через


Сборка драйверов для различных версий Windows

Если вы создаете драйверы для разных версий Windows, в следующем разделе приведены рекомендации по созданию этих драйверов с помощью пакета драйверов Windows (WDK), Visual Studio и MSBuild.

Рекомендации по созданию драйверов в пользовательском режиме и в режиме ядра

  • Создавайте драйверы, используя целевые конфигурации и платформы, которые предоставляет WDK. Всегда используйте последнюю версию WDK, которая поддерживает целевую версию Windows. Сведения о поддержке версий WDK и операционной системы см. в разделах Установка предварительных версий комплекта драйверов Windows и Скачивание пакета драйверов Для Windows.
  • Если драйвер должен работать только в одной версии Windows, создайте драйвер для целевой конфигурации и платформы, которые соответствуют целевой версии Windows.
  • Если вы хотите, чтобы драйвер выполнялся в нескольких версиях Windows, но без функций, доступных только в более новых версиях, создайте драйвер для самой старой версии, которую будет поддерживать драйвер.

Если вы используете Windows 7, Windows 8 или Windows 8.1, задайте TargetVersion с помощью Configuration Manager или вручную в файле VCXPROJ, например <TargetVersion>Windows7</TargetVersion>.

Если вы используете Windows 10 или Windows 11, задайте targetVersion и _NT_TARGET_VERSION, например <TargetVersion>Windows10</TargetVersion> <_NT_TARGET_VERSION>0xA000006</_NT_TARGET_VERSION>.

_NT_TARGET_VERSION значения перечислены в файле заголовка Sdkddkver.h в формате NTDDI_WIN10_*, например #define NTDDI_WIN10_RS5 0x0A000006.

Рекомендации, применимые к созданию драйверов в режиме ядра

  • Если вы хотите, чтобы драйвер в режиме ядра работал в нескольких версиях Windows и динамически определял функции, доступные драйверу, выполните сборку драйвера, используя конфигурацию сборки для последней версии операционной системы. Например, если вы хотите, чтобы драйвер поддерживал все версии Windows, начиная с Windows 8.1, но использовал некоторые функции, которые были впервые доступны в 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 и выполнить сборку драйвера.