Udostępnij przez


Kompilowanie sterowników dla różnych wersji systemu Windows

Jeśli jesteś piszesz sterowniki dla różnych wersji systemu Windows, poniższa sekcja zawiera pewne wskazówki dotyczące sposobu kompilowania tych sterowników przy użyciu zestawu Windows Driver Kit (WDK), programu Visual Studio i MSBuild.

wytyczne dotyczące tworzenia sterowników trybu użytkownika i trybu jądra

  • Skompiluj sterowniki przy użyciu konfiguracji docelowych i platform zapewnianych przez zestaw WDK. Zawsze używaj najnowszej wersji zestawu WDK obsługującego wersję systemu Windows, która ma być docelowa. Aby uzyskać informacje o obsłudze wersji zestawu WDK i systemu operacyjnego, zobacz Instalowanie wersji zapoznawczej zestawu Windows Driver Kit i Pobierz zestaw sterowników systemu Windows.
  • Jeśli sterownik musi działać tylko w jednej wersji systemu Windows, skompiluj sterownik konfiguracji docelowej i platformy zgodnej z docelową wersją systemu Windows.
  • Jeśli chcesz, aby sterownik działał w wielu wersjach systemu Windows, ale bez funkcji, które są dostępne tylko w nowszych wersjach, skompiluj sterownik dla najstarszej wersji, którą chcesz obsługiwać sterownik.

Jeśli używasz systemu Windows 7, Windows 8 lub Windows 8.1, ustaw TargetVersion przy użyciu programu Configuration Manager lub ręcznie w pliku .vcxproj, na przykład <TargetVersion>Windows7</TargetVersion>.

Jeśli celem są systemy Windows 10 lub Windows 11, ustaw TargetVersion oraz _NT_TARGET_VERSION, na przykład <TargetVersion>Windows10</TargetVersion> <_NT_TARGET_VERSION>0xA000006</_NT_TARGET_VERSION>.

_NT_TARGET_VERSION wartości są wymienione w pliku nagłówkowym Sdkddkver.h w formie NTDDI_WIN10_*, na przykład #define NTDDI_WIN10_RS5 0x0A000006.

wytyczne dotyczące tworzenia sterowników trybu jądra

  • Jeśli chcesz, aby sterownik trybu jądra działał w wielu wersjach systemu Windows i dynamicznie określać funkcje dostępne dla sterownika, skompiluj sterownik przy użyciu konfiguracji kompilacji dla najnowszej wersji systemu operacyjnego. Jeśli na przykład chcesz, aby sterownik obsługiwał wszystkie wersje systemu Windows, począwszy od systemu Windows 8.1, ale aby używać niektórych funkcji, które były najpierw dostępne w systemie Windows 10, gdy sterownik jest uruchomiony w systemie Windows 10 lub nowszych wersjach systemu operacyjnego, określ windows 10 (Win10) jako konfigurację docelową.

  • Użyj funkcji RtlIsNtDdiVersionAvailable i RtlIsServicePackVersionInstalled, aby określić wersję systemu Windows dostępną dla sterownika w czasie wykonywania. Aby uzyskać więcej informacji, zobacz Zapisywanie sterowników dla różnych wersji systemu Windows.

  • Utwórz prototypy wskaźników do funkcji, które sterownik musi wywołać warunkowo.

  • Jeśli masz sterownik WDM lub sterownik trybu jądra innego niż KMDF i celujesz w system Windows 8.1 lub Windows 8, ale także chcesz uruchomić na wcześniejszych wersjach systemu Windows, musisz zastąpić opcję linkera $(KernelBufferOverflowLib). Po wybraniu konfiguracji systemu Windows 8 lub Windows 8.1 sterownik jest połączony z bufferOverflowFastFailK.lib, który nie jest dostępny we wcześniejszych wersjach systemu Windows. W przypadku systemów Windows 7 i Vista należy zamiast tego połączyć się z plikiem BufferOverflowK.lib.

    Istnieją dwa sposoby zastąpienia opcji linkera $(KernelBufferOverflowLib), przy użyciu narzędzi MSBuild lub Visual Studio.

    przy użyciu programu 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
    

    Korzystanie z programu Visual Studio:

    Za pomocą Notatnika lub innego edytora tekstów otwórz plik projektu sterownika (*.vcxproj). W pliku projektu zlokalizuj <PropertyGroup> dla konfiguracji, które obsługuje Twój sterownik, i dodaj następującą linię, aby zastąpić domyślną opcję linkera:

    XML
     
       <KernelBufferOverflowLib>$(DDK_LIB_PATH)\BufferOverflowK.lib</KernelBufferOverflowLib>
    

    Jeśli na przykład sterownik obsługuje kompilacje debugowania i wydania systemów Windows 8.1 i Windows 8, te sekcje konfiguracji będą wyglądać następująco:

    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>

    Elementy <KernelBufferOverflowLib> muszą pojawić się w pliku projektu sterownika przed elementem, który importuje zestaw narzędzi Microsoft.Cpp.props.

    Po zmodyfikowaniu i zapisaniu pliku projektu sterownika możesz otworzyć plik projektu w programie Visual Studio i skompilować sterownik.