Compartir vía


Compilar controladores para diferentes versiones de Windows

Si está escribiendo controladores para diferentes versiones de Windows, en la sección siguiente se proporcionan algunas directrices sobre cómo debe compilar esos controladores mediante el Kit de controladores de Windows (WDK), Visual Studio y MSBuild.

Directrices que se aplican a la creación de controladores en modo de usuario y modo kernel

  • Compile los controladores mediante las configuraciones y plataformas de destino que proporciona WDK. Use siempre la versión más reciente del WDK que admita la versión de Windows a la que desea dirigirse. Para obtener información sobre la compatibilidad con WDK y la versión del sistema operativo, consulta Instalar versiones preliminares del Kit de controladores de Windows y Descargar el Kit de controladores de Windows.
  • Si el controlador solo debe ejecutarse en una sola versión de Windows, compile el controlador para la configuración de destino y la plataforma que coincida con la versión de Windows de destino.
  • Si quiere que el controlador se ejecute en varias versiones de Windows, pero sin características que solo estén disponibles en versiones más recientes, compile el controlador para la versión más antigua que quiera que admita el controlador.

Si tiene como destino Windows 7, Windows 8 o Windows 8.1, establezca TargetVersion mediante el Configuration Manager o manualmente en el archivo .vcxproj, por ejemplo<TargetVersion>Windows7</TargetVersion>.

Si tiene como destino Windows 10 o Windows 11, establezca TargetVersion y _NT_TARGET_VERSION, por ejemplo<TargetVersion>Windows10</TargetVersion> <_NT_TARGET_VERSION>0xA000006</_NT_TARGET_VERSION>.

_NT_TARGET_VERSION valores se muestran en el archivo de encabezado Sdkddkver.h con el formato NTDDI_WIN10_*, por ejemplo #define NTDDI_WIN10_RS5 0x0A000006.

Directrices que se aplican a la creación de controladores en modo kernel

  • Si desea que el controlador en modo kernel se ejecute en varias versiones de Windows y determine dinámicamente las características que están disponibles para el controlador, compile el controlador mediante la configuración de compilación para la versión más reciente del sistema operativo. Por ejemplo, si quieres que el controlador admita todas las versiones de Windows a partir de Windows 8.1, pero para usar determinadas características que estaban disponibles por primera vez en Windows 10 cuando el controlador se ejecute en Windows 10 o versiones posteriores del sistema operativo, especifique Windows 10 (Win10) como configuración de destino.

  • Use las funciones RtlIsNtDdiVersionAvailable y RtlIsServicePackVersionInstalled para determinar la versión de Windows que está disponible para el controlador en tiempo de ejecución. Para obtener más información, consulte Escritura de controladores para diferentes versiones de Windows.

  • Cree prototipos para punteros a funciones a las que el controlador debe llamar condicionalmente.

  • Si tiene un controlador WDM o un controlador en modo kernel que no es KMDF, y tiene como destino Windows 8.1 o Windows 8, pero también quiere ejecutarse en versiones anteriores de Windows, debe invalidar la opción $(KernelBufferOverflowLib). Al seleccionar Windows 8 o Windows 8.1 configuraciones, el controlador está vinculado a BufferOverflowFastFailK.lib, que no está disponible en versiones anteriores de Windows. Para Windows 7 y Vista, debes vincular con BufferOverflowK.lib en su lugar.

    Hay dos maneras de invalidar la opción del enlazador $(KernelBufferOverflowLib), mediante MSBuild o Visual Studio.

    Uso de 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
    

    Uso de Visual Studio:

    Con el Bloc de notas u otro editor de texto, abra el archivo de proyecto de controlador (*.vcxproj). En el archivo del proyecto, busque propertyGroup<> para las configuraciones que admite el controlador y agregue la línea siguiente para invalidar la opción del enlazador predeterminado:

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

    Por ejemplo, si el controlador admite Windows 8.1 y Windows 8 compilaciones de depuración y versión, esas secciones de configuración tendrían el siguiente aspecto:

    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>

    Los <elementos KernelBufferOverflowLib> deben aparecer en el archivo de proyecto de controlador antes del elemento que importa Microsoft.Cpp.props, que importa el conjunto de herramientas.

    Después de modificar y guardar el archivo de proyecto de controlador, puede abrir el archivo de proyecto en Visual Studio y compilar el controlador.