Uso di un file INF di estensione

Prima di Windows 10, Windows ha selezionato un singolo pacchetto driver da installare per un determinato dispositivo. Ciò ha comportato pacchetti driver complessi di grandi dimensioni che includevano il codice per tutti gli scenari e le configurazioni e ogni aggiornamento secondario richiedeva un aggiornamento per l'intero pacchetto driver. A partire da Windows 10, è possibile suddividere le funzionalità INF in più componenti, ognuno dei quali può essere eseguito in modo indipendente. Il pacchetto driver principale installato in un dispositivo è ora denominato pacchetto driver di base e viene gestito dal sistema nello stesso modo in cui i pacchetti driver sono stati gestiti prima di Windows 10. Per estendere la funzionalità di un pacchetto driver di base, fornire un'estensione INF in un pacchetto driver separato. Un'estensione INF:

  • Può essere fornita da una società diversa e aggiornata in modo indipendente dalla base INF.

  • Usa la stessa sintassi INF di base, ma può estendere l'INF di base per la personalizzazione o la specializzazione.

  • Migliora il valore del dispositivo, ma non è necessario per il funzionamento del pacchetto driver di base. In assenza dell'estensione INF, il sistema deve essere in grado di avviare e connettersi alla rete con solo il pacchetto driver di base. I dispositivi di input integrati nel sistema, ad esempio una tastiera, devono essere in grado di funzionare con almeno funzionalità di base senza estensioni INFS.

  • Deve essere un file INF universale.

A ogni dispositivo deve essere installato un pacchetto driver di base e, facoltativamente, può avere uno o più file INFS di estensione associati. Un'estensione INF non sarà in grado di installare in un dispositivo se non è presente alcun pacchetto driver di base da installare anche nel dispositivo.

Gli scenari tipici in cui è possibile usare un'estensione INF includono:

  • Modifica delle impostazioni fornite in un pacchetto driver di base, ad esempio la personalizzazione del nome descrittivo del dispositivo o la modifica di un'impostazione di configurazione hardware.

  • Creazione di uno o più componenti software specificando la direttiva INF AddComponent e fornendo un file INF del componente.

  • Specifica delle impostazioni specifiche del modello o del fattore di forma del sistema che migliora l'esperienza o la funzionalità del dispositivo, ad esempio i dati di calibrazione hardware.

  • Aggiunta di un driver di filtro allo stack di dispositivi.

È possibile trovare il codice di esempio per alcuni di questi scenari negli esempi seguenti. Vedere anche DCH-Compliant Driver Package Example (Esempio di pacchetto del driver conforme a DCH) che descrive come l'esempio di driver universale DCHU usa le estensioni INFS.

Funzionamento del pacchetto di driver di base e INF dell'estensione

Durante l'installazione di un dispositivo, le impostazioni in un'estensione INF vengono applicate dopo le impostazioni in un pacchetto driver di base. Di conseguenza, se un'estensione INF e un pacchetto driver di base specificano la stessa impostazione, viene applicata la versione nell'estensione INF. Analogamente, se il pacchetto driver di base cambia, l'estensione INF rimane e viene applicata al nuovo pacchetto driver di base. Se nello stesso dispositivo sono installati più file INFS di estensione, non esiste alcun ordinamento predeterminato in cui verranno applicati gli INF di estensione, quindi un'estensione INF non può eseguire l'override deterministico dei valori forniti da un'estensione INF diversa. Gli INF di estensione distinti destinati agli stessi dispositivi non devono tentare di modificare le stesse impostazioni.

È utile includere commenti nel pacchetto driver di base che descrivono quali voci possono essere sostituite da un INF di estensione, nonché da intervalli di valori di parametro e vincoli applicabili.

Specifica di ExtensionId

Quando si scrive un'estensione INF, si genera un GUID speciale denominato ExtensionId, che è una voce nella sezione [Version] di INF.

Il sistema identifica i possibili INF di estensione per un dispositivo specifico associando l'ID hardware e gli ID compatibili del dispositivo a quelli specificati in un'estensione INF in una sezione Models che si applica a tale sistema.

Tra tutti i possibili INFS di estensione che specificano lo stesso valore ExtensionId , il sistema seleziona solo uno per installare e applica le relative impostazioni su quelle del pacchetto driver di base. La data del driver e la versione del driver specificata in INF vengono usate, in questo modo, per scegliere il singolo INF tra più file INF di estensione con lo stesso ExtensionId.

Per illustrare, si consideri lo scenario seguente che include un dispositivo ipotetico per il quale sono presenti tre file INF di estensione:

Diagramma che mostra come sono selezionate le funzioni INF di base e le funzioni INF di estensione.

I valori {A} ExtensionId e {B} sono visualizzati tra parentesi graffe e la classificazione di ogni pacchetto driver di base viene visualizzata nelle barre multifunzione banner.

In primo luogo, il sistema seleziona il pacchetto driver di base con la migliore classificazione e la versione più alta.

Successivamente, il sistema elabora le funzioni infs di estensione disponibili. Due hanno il valore {B}ExtensionId e uno ha il valore {A}ExtensionId . Dai primi due, diciamo che la data del conducente è la stessa. Il tiebreaker successivo è la versione del driver, quindi il sistema seleziona l'estensione INF con v2.0.

Viene selezionata anche l'estensione INF con il valore ExtensionId univoco. Il sistema applica il pacchetto driver di base per il dispositivo e quindi applica le due estensioni INFS per tale dispositivo.

I file INF di estensione vengono sempre applicati dopo il pacchetto del driver di base, ma non esiste un ordine determinato in cui vengono applicati i file INF dell'estensione.

Creazione di un'estensione INF

Di seguito sono riportate le voci necessarie per definire un INF come estensione INF.

  1. Specificare questi valori per Class e ClassGuid nella sezione Version.Specify these values for Class and ClassGuid in the Version section. Per altre informazioni sulle classi di installazione, vedi Classi di installazione di dispositivi definite dal sistema disponibili per i fornitori.

    [Version]
    ...
    Class     = Extension
    ClassGuid = {e2f84ce7-8efa-411c-aa69-97454ca4cb57}
    ...
    
  2. Specificare una voce ExtensionId nella sezione [Versione]. Generare un nuovo GUID per la versione iniziale di un'estensione INF o riutilizzare l'ultimo GUID per gli aggiornamenti successivi dell'estensione INIZIALE INF.

    ExtensionId = {zzzzzzzz-zzzz-zzzz-zzzz-zzzzzzzzzzzz} ; replace with your own GUID
    

Un'organizzazione può usare solo un ExtensionID di cui è proprietario. Per informazioni sulla registrazione di un ID estensione, vedere Gestione degli invii di hardware nel dashboard di Windows Hardware Dev Center.

  1. Se si sta aggiornando un'estensione INF, mantenere extensionId uguale e incrementare la versione e la data specificate dalla direttiva DriverVer. Per un determinato valore ExtensionId, PnP seleziona INF con il driverVer più alto.

    Nota

    Se l'estensione INF è destinata a Windows 10 S, vedi Windows 10 in S Mode Driver Requirements per informazioni sull'installazione dei driver in tale versione di Windows.

  2. Nella sezione Modelli INF specificare uno o più ID hardware e compatibili che corrispondono a quelli del dispositivo di destinazione. Questi ID hardware e compatibili non devono corrispondere a quelli del pacchetto driver di base. In genere, un'estensione INF elenca un ID hardware più specifico rispetto al pacchetto driver di base, con l'obiettivo di specializzare ulteriormente una configurazione del driver specifica. Ad esempio, il pacchetto driver di base potrebbe usare un ID hardware PCI in due parti, mentre l'estensione INF specifica un ID hardware PCI in quattro parti, come illustrato di seguito:

    [DeviceExtensions.NTamd64]
    %Device.ExtensionDesc% = DeviceExtension_Install, PCI\VEN_XXXX&DEV_XXXX&SUBSYS_XXXXXXXX&REV_XXXX
    

    In alternativa, l'estensione INF potrebbe elencare lo stesso ID hardware del pacchetto del driver di base, ad esempio se il dispositivo è già di destinazione ristretta o se il pacchetto del driver di base elenca già l'ID hardware più specifico.

    In alcuni casi, l'estensione INF potrebbe fornire un ID dispositivo meno specifico, ad esempio un ID compatibile, per personalizzare un'impostazione in un set più ampio di dispositivi.

    La destinazione CHID può essere usata se un ID hardware in quattro parti non è possibile o non è sufficientemente restrittivo.

  3. Non definire un servizio con SPSVCINST_ASSOCSERVICE. Un'estensione INF non può fornire un driver di funzione per un dispositivo. Tuttavia, un'estensione INF può definire altri servizi, ad esempio un driver di filtro per il dispositivo. Per altre info sulla specifica dei servizi, vedi Direttiva INF AddService.

Nella maggior parte dei casi, si invierà un pacchetto di driver INF di estensione a Hardware Dev Center separatamente dal pacchetto driver di base. Per esempi su come creare pacchetti di file INFS di estensione e collegamenti al codice di esempio, vedere Esempio di pacchetto del driver conforme a DCH.

Il processo di convalida e invio del driver è lo stesso per le funzioni INFS di estensione per i pacchetti driver di base. Per altre info, vedi Introduzione a Windows HLK.

Disinstallazione di un driver di estensione

Per rimuovere un pacchetto driver di estensione dal sistema e disinstallarlo da tutti i dispositivi che lo usano, usare il comando di delete-driver PnPUtil con il uninstall flag . Ciò consente di disinstallare il pacchetto driver di estensione dai dispositivi senza rimuovere il pacchetto driver di base.

Trovare il nome oem<#>.inf del pacchetto driver per disinstallare e usare pnputil /delete-driver oem<#>.inf /uninstall.

pnputil /enum-drivers può essere usato per identificare il nome oem<#>.inf appropriato.

Esempio 1: Uso di un'estensione INF per impostare il nome descrittivo del dispositivo

In uno scenario comune, un produttore di dispositivi (IHV) fornisce un pacchetto driver di base e quindi un generatore di sistema (OEM) fornisce un'estensione INF che integra e in alcuni casi sostituisce la configurazione e le impostazioni del pacchetto driver di base. Il frammento di codice seguente è un'estensione COMPLETA INF che mostra come impostare il nome descrittivo del dispositivo.

[Version]
Signature   = "$WINDOWS NT$"
Class       = Extension
ClassGuid   = {e2f84ce7-8efa-411c-aa69-97454ca4cb57}
Provider    = %CONTOSO%
ExtensionId = {zzzzzzzz-zzzz-zzzz-zzzz-zzzzzzzzzzzz} ; replace with your own GUID
DriverVer   = 05/28/2013,1.0.0.0
CatalogFile = delta.cat
PnpLockdown = 1

[Manufacturer]
%CONTOSO% = DeviceExtensions,NTamd64

[DeviceExtensions.NTamd64]
%Device.ExtensionDesc% = DeviceExtension_Install, PCI\VEN_XXXX&DEV_XXXX&SUBSYS_XXXXXXXX&REV_XXXX

[DeviceExtension_Install]
; No changes

[DeviceExtension_Install.HW]
AddReg = FriendlyName_AddReg

[FriendlyName_AddReg]
HKR,,FriendlyName,, "New Device Friendly Name"

[Strings]
CONTOSO              = "Contoso"
Device.ExtensionDesc = "Sample Device Extension"

Esempio 2: Uso di un'estensione INF per installare software aggiuntivo

Il frammento di codice seguente è un'estensione completa inF inclusa nel toolkit di installazione dei pacchetti driver per i driver universali. In questo esempio viene utilizzata la direttiva INF AddComponent per creare componenti che installano un servizio e un eseguibile. Per altre informazioni sulle operazioni che è possibile eseguire in un componente INF, vedi Uso di un file INF del componente.

Per accedere a questo file online, vedere osrfx2_DCHU_extension.inx.

;/*++
;
;Copyright (c) Microsoft Corporation.  All rights reserved.
;
;   THIS CODE AND INFORMATION IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY
;   KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
;   IMPLIED WARRANTIES OF MERCHANTABILITY AND/OR FITNESS FOR A PARTICULAR
;   PURPOSE.
;
;Module Name:
;
;    osrfx2_DCHU_extension.INF
;
;Abstract:
;
;    Extension inf for the OSR FX2 Learning Kit
;
;--*/

[Version]
Signature   = "$WINDOWS NT$"
Class       = Extension
ClassGuid   = {e2f84ce7-8efa-411c-aa69-97454ca4cb57}
Provider    = %ManufacturerName%
ExtensionId = {3846ad8c-dd27-433d-ab89-453654cd542a}
CatalogFile = osrfx2_DCHU_extension.cat
DriverVer   = 05/16/2017,15.14.36.721
PnpLockdown = 1

[Manufacturer]
%ManufacturerName% = OsrFx2Extension, NT$ARCH$

[OsrFx2Extension.NT$ARCH$]
%OsrFx2.ExtensionDesc% = OsrFx2Extension_Install, USB\Vid_045e&Pid_94aa&mi_00
%OsrFx2.ExtensionDesc% = OsrFx2Extension_Install, USB\Vid_0547&PID_1002

[OsrFx2Extension_Install.NT]
CopyInf=osrfx2_DCHU_usersvc.inf

[OsrFx2Extension_Install.NT.HW]
AddReg = OsrFx2Extension_AddReg
AddReg = OsrFx2Extension_COMAddReg

[OsrFx2Extension_AddReg]
HKR, OSR, "OperatingParams",, "-Extended"
HKR, OSR, "OperatingExceptions",, "x86"

; Add all registry keys to successfully register the
; In-Process ATL COM Server MSFT Sample.
[OsrFx2Extension_COMAddReg]
HKCR,AppID\ATLDllCOMServer.DLL,AppID,,"{9DD18FED-55F6-4741-AF25-798B90C4AED5}"
HKCR,AppID\{9DD18FED-55F6-4741-AF25-798B90C4AED5},,,"ATLDllCOMServer"
HKCR,ATLDllCOMServer.SimpleObject,,,"SimpleObject Class"
HKCR,ATLDllCOMServer.SimpleObject\CLSID,,,"{92FCF37F-F6C7-4F8A-AA09-1A14BA118084}"
HKCR,ATLDllCOMServer.SimpleObject\CurVer,,,"ATLDllCOMServer.SimpleObject.1"
HKCR,ATLDllCOMServer.SimpleObject.1,,,"SimpleObject Class"
HKCR,ATLDllCOMServer.SimpleObject.1\CLSID,,,"{92FCF37F-F6C7-4F8A-AA09-1A14BA118084}"
HKCR,CLSID\{92FCF37F-F6C7-4F8A-AA09-1A14BA118084},,,"SimpleObject Class"
HKCR,CLSID\{92FCF37F-F6C7-4F8A-AA09-1A14BA118084}\InprocServer32,,%REG_EXPAND_SZ%,"%%SystemRoot%%\System32\ATLDllCOMServer.dll"
HKCR,CLSID\{92FCF37F-F6C7-4F8A-AA09-1A14BA118084}\InprocServer32,ThreadingModel,,"Apartment"
HKCR,CLSID\{92FCF37F-F6C7-4F8A-AA09-1A14BA118084}\ProgID,,,"ATLDllCOMServer.SimpleObject.1"
HKCR,CLSID\{92FCF37F-F6C7-4F8A-AA09-1A14BA118084}\Programmable,,%FLG_ADDREG_KEYONLY%
HKCR,CLSID\{92FCF37F-F6C7-4F8A-AA09-1A14BA118084}\TypeLib,,,"{9B23EFED-A0C1-46B6-A903-218206447F3E}"
HKCR,CLSID\{92FCF37F-F6C7-4F8A-AA09-1A14BA118084}\VersionIndependentProgID,,,"ATLDllCOMServer.SimpleObject"

[OsrFx2Extension_Install.NT.Components]
AddComponent = osrfx2_DCHU_component,,OsrFx2Extension_ComponentInstall
AddComponent = osrfx2_DCHU_usersvc,,OsrFx2Extension_ComponentInstall_UserSvc

[OsrFx2Extension_ComponentInstall]
ComponentIds=VID_045e&PID_94ab

[OsrFx2Extension_ComponentInstall_UserSvc]
ComponentIds=VID_045e&PID_94ac

[Strings]
ManufacturerName = "Contoso"
OsrFx2.ExtensionDesc = "OsrFx2 DCHU Device Extension"
REG_EXPAND_SZ = 0x00020000
FLG_ADDREG_KEYONLY = 0x00000010

Per informazioni su come usare un'estensione INF per installare un driver di filtro, vedi Ordinamento dei driver di filtro del dispositivo.

Per migliorare l'estendibilità, è consigliabile inserire funzionalità facoltative in un modello INF di estensione.

Compatibilità con le versioni precedenti

Qualsiasi modifica apportata al pacchetto driver di base deve essere testata accuratamente per assicurarsi che non interrompa la compatibilità con le versioni precedenti per gli INFS di estensione esistenti.

Quando si gestisce un pacchetto driver di base, seguire queste procedure consigliate:

  • Intervalli di valori e vincoli dei parametri del documento sia nei commenti di codice che in un documento di progettazione. Le modifiche future devono essere conformi agli intervalli specificati.
  • Per supportare nuovi intervalli, aggiungere un parametro facoltativo (nessun valore predefinito).

Invio di un'estensione INF per la certificazione

Per informazioni dettagliate su come usare gli INF di estensione in Hardware Dev Center, vedere Uso degli INF di estensione nel dashboard di Windows Hardware Dev Center.

Uso degli INF di estensione nel Centro per i partner

Esempio di pacchetto driver conforme a DCH

Uso di un file INF universale

Introduzione ai driver di Windows

Toolkit di installazione dei pacchetti driver per i driver universali