Condividi tramite


Creazione di driver per versioni diverse di Windows

Se si scrivono driver per versioni diverse di Windows, la sezione seguente fornisce alcune linee guida su come compilare tali driver usando Windows Driver Kit (WDK), Visual Studio e MSBuild.

Linee guida applicabili alla creazione di driver in modalità utente e in modalità kernel

  • Creare i driver usando le configurazioni di destinazione e le piattaforme fornite da WDK. Usare sempre la versione più recente di WDK che supporta la versione di Windows di destinazione. Per informazioni sul supporto di WDK e della versione del sistema operativo, vedere Installazione delle versioni di anteprima di Windows Driver Kit e Download di Windows Driver Kit.
  • Se il driver deve essere eseguito solo in una singola versione di Windows, compilare il driver per la configurazione di destinazione e la piattaforma corrispondente alla versione di Windows di destinazione.
  • Se si vuole che il driver venga eseguito in più versioni di Windows, ma senza funzionalità disponibili solo nelle versioni più recenti, compilare il driver per la versione meno recente che si vuole supportare il driver.

Se si usa Windows 7, Windows 8 o Windows 8.1, impostare TargetVersion usando Configuration Manager o manualmente nel file vcxproj, ad esempio <TargetVersion>Windows7</TargetVersion>.

Se si ha la destinazione Windows 10 o Windows 11, impostare TargetVersion e _NT_TARGET_VERSION, ad esempio <TargetVersion>Windows10</TargetVersion> <_NT_TARGET_VERSION>0xA000006</_NT_TARGET_VERSION>.

_NT_TARGET_VERSION valori sono elencati nel file di intestazione Sdkddkver.h nel formato NTDDI_WIN10_*, ad esempio #define NTDDI_WIN10_RS5 0x0A000006.

Linee guida applicabili alla creazione di driver in modalità kernel

  • Se si vuole che il driver in modalità kernel venga eseguito in più versioni di Windows e determinare dinamicamente le funzionalità disponibili per il driver, compilare il driver usando la configurazione di compilazione per la versione più recente del sistema operativo. Ad esempio, se si vuole che il driver supporti tutte le versioni di Windows a partire da Windows 8.1, ma per usare alcune funzionalità disponibili per la prima volta in Windows 10 quando il driver è in esecuzione in Windows 10 o versioni successive del sistema operativo, specificare Windows 10 (Win10) come configurazione di destinazione.

  • Usare le funzioni RtlIsNtDdiVersionAvailable e RtlIsServicePackVersionInstalled per determinare la versione di Windows disponibile per il driver in fase di esecuzione. Per altre informazioni, vedere Scrittura di driver per versioni diverse di Windows.

  • Creare prototipi per i puntatori alle funzioni che il driver deve chiamare in modo condizionale.

  • Se si dispone di un driver WDM o di un driver in modalità kernel non KMDF e si punta Windows 8.1 o Windows 8 ma si vuole eseguire anche nelle versioni precedenti di Windows, è necessario eseguire l'override dell'opzione linker $(KernelBufferOverflowLib). Quando si selezionano Windows 8 o Windows 8.1 configurazioni, il driver è collegato a BufferOverflowFastFailK.lib, che non è disponibile nelle versioni precedenti di Windows. Per Windows 7 e Vista, è necessario collegare invece BufferOverflowK.lib.

    Esistono due modi per eseguire l'override dell'opzione linker $(KernelBufferOverflowLib), usando MSBuild o Visual Studio.

    Uso di 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 di Visual Studio:

    Usando Blocco note o un altro editor di testo, aprire il file di progetto driver (*.vcxproj). Nel file di progetto individuare <PropertyGroup> per le configurazioni supportate dal driver e aggiungere la riga seguente per eseguire l'override dell'opzione del linker predefinito:

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

    Ad esempio, se il driver supporta Windows 8.1 e Windows 8 compilazioni di debug e versione, tali sezioni di configurazione sono simili alle seguenti:

    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>

    Gli <elementi KernelBufferOverflowLib> devono essere visualizzati nel file di progetto driver prima dell'elemento che importa Microsoft.Cpp.props, che importa il set di strumenti.

    Dopo aver modificato e salvato il file di progetto driver, è possibile aprire il file di progetto in Visual Studio e compilare il driver.