Criando drivers para diferentes versões do Windows

Se você estiver escrevendo drivers para diferentes versões do Windows, a seção a seguir fornecerá algumas diretrizes sobre como você deve criar esses drivers usando o WDK (Kit de Driver do Windows), o Visual Studio e o MSBuild.

Diretrizes que se aplicam à criação de drivers no modo de usuário e no modo kernel

  • Crie seus drivers usando as configurações e plataformas de destino que o WDK fornece. Sempre use a versão mais recente do WDK que dá suporte à versão do Windows que você deseja direcionar. Para obter informações sobre o WDK e o suporte à versão do sistema operacional, consulte Instalando versões prévias do Kit de Driver do Windows e Baixar o Kit de Driver do Windows.
  • Se o driver precisar ser executado apenas em uma única versão do Windows, crie o driver para a configuração e a plataforma de destino que correspondem à sua versão de destino do Windows.
  • Se você quiser que o driver seja executado em várias versões do Windows, mas sem recursos disponíveis apenas em versões mais recentes, crie o driver para a versão mais antiga à qual você deseja que o driver dê suporte.

Se você estiver direcionando o Windows 7, Windows 8 ou Windows 8.1, defina TargetVersion usando o Configuration Manager ou manualmente no arquivo .vcxproj, por exemplo<TargetVersion>Windows7</TargetVersion>.

Se você estiver direcionando Windows 10 ou Windows 11, defina TargetVersion e _NT_TARGET_VERSION, por exemplo<TargetVersion>Windows10</TargetVersion> <_NT_TARGET_VERSION>0xA000006</_NT_TARGET_VERSION>.

_NT_TARGET_VERSION valores são listados no arquivo de cabeçalho Sdkddkver.h no formato NTDDI_WIN10_*, por exemplo #define NTDDI_WIN10_RS5 0x0A000006, .

Diretrizes que se aplicam à criação de drivers no modo kernel

  • Se você quiser que o driver do modo kernel seja executado em várias versões do Windows e determine dinamicamente os recursos disponíveis para o driver, crie o driver usando a configuração de build para a versão mais recente do sistema operacional. Por exemplo, se você quiser que o driver dê suporte a todas as versões do Windows começando com Windows 8.1, mas para usar determinados recursos que estavam disponíveis pela primeira vez em Windows 10 quando o driver estiver em execução em Windows 10 ou versões posteriores do sistema operacional, especifique Windows 10 (Win10) como a configuração de destino.

  • Use as funções RtlIsNtDdiVersionAvailable e RtlIsServicePackVersionInstalled para determinar a versão do Windows que está disponível para o driver em tempo de execução. Para obter mais informações, consulte Escrevendo drivers para versões diferentes do Windows.

  • Crie protótipos para ponteiros para funções que seu driver deve chamar condicionalmente.

  • Se você tiver um driver WDM ou um driver de modo kernel não KMDF e estiver direcionando Windows 8.1 ou Windows 8, mas também quiser executar em versões anteriores do Windows, será necessário substituir a opção $(KernelBufferOverflowLib) do vinculador. Quando você seleciona Windows 8 ou Windows 8.1 configurações, o driver é vinculado ao BufferOverflowFastFailK.lib, que não está disponível em versões anteriores do Windows. Para o Windows 7 e o Vista, você deve vincular ao BufferOverflowK.lib.

    Há duas maneiras de substituir a opção de vinculador $(KernelBufferOverflowLib), usando o MSBuild ou o Visual Studio.

    Usando o 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
    

    Usando o Visual Studio:

    Usando o Bloco de Notas ou outro editor de texto, abra o arquivo de projeto do driver (*.vcxproj). No arquivo de projeto, localize o <PropertyGroup> para as configurações compatíveis com o driver e adicione a seguinte linha para substituir a opção de vinculador padrão:

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

    Por exemplo, se o driver der suporte a Windows 8.1 e Windows 8 builds de depuração e lançamento, essas seções de configuração seriam semelhantes às seguintes:

    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>

    Os <elementos KernelBufferOverflowLib> devem aparecer no arquivo de projeto do driver antes do elemento que importa Microsoft.Cpp.props, que importa o conjunto de ferramentas.

    Depois de modificar e salvar o arquivo de projeto do driver, você pode abrir o arquivo de projeto no Visual Studio e compilar o driver.