異なるバージョンの Windows に対するドライバーのビルド

以下のセクションでは、異なるバージョンの Windows 用にドライバーを作成している方のために、Windows Driver Kit (WDK)、Visual Studio、MSBuild を使ってドライバーをビルドするためのガイドラインをいくつか紹介しています。

ユーザー モード ドライバーとカーネル モード ドライバーをビルドする際の共通のガイドライン

  • WDK が提供するターゲット構成とプラットフォームを使用してドライバーをビルドします。 対象とする Windows のバージョンをサポートする最新バージョンの WDK を常に使用してください。 WDK とオペレーティング システムのバージョン サポートについては、「プレビュー バージョンの Windows Driver Kit (WDK) のインストール」と「Windows Driver Kit のダウンロード」をご覧ください。
  • ドライバーが 1 つのバージョンの Windows でのみ実行する必要がある場合は、ターゲットの Windows バージョンに一致するターゲット構成およびプラットフォーム用のドライバーをビルドします。
  • ドライバーを複数のバージョンの Windows で実行したいが、新しいバージョンでのみ利用できる機能は備えていない場合は、ドライバーでサポートしたい最も古いバージョン用のドライバーをビルドします。

Windows 7、Windows 8、または Windows 8.1 がターゲットの場合は、構成マネージャーを使用して、または、.vcxproj ファイルに手動で 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) を指定します。

  • 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 を使用する 2 つの方法があります。

    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 でプロジェクト ファイルを開いてドライバーをビルドできます。