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


Создание драйверов для различных версий 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 и создать драйвер.