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