Condividi tramite


Esempio di pacchetto DCH-Compliant driver

Questo articolo descrive come l'esempio di driver DCHU applica i principi di progettazione DCH. È possibile usarlo come modello per applicare i principi di progettazione DCH al proprio pacchetto driver.

Se si vuole una copia locale del repository di esempio, clonare da Windows-driver-samples.

Alcune parti dell'esempio possono usare direttive e API disponibili solo in determinate versioni di Windows 10 e versioni successive. Fare riferimento all'installazione del dispositivo e del driver per visualizzare la versione del sistema operativo su cui è supportata una determinata direttiva.

Prerequisiti

Prima di leggere questa sezione, è necessario acquisire familiarità con i principi di progettazione DCH.

Panoramica

L'esempio fornisce scenari di esempio in cui due partner hardware, Contoso (generatore di sistema o OEM) e Fabrikam (produttore di dispositivi o IHV) lavorano insieme per creare un driver conforme a DCH per un dispositivo nel sistema futuro di Contoso. Il dispositivo in questione è un kit di apprendimento USB FX2 OSR. In passato, Fabrikam scriverebbe un pacchetto driver legacy personalizzato in una specifica linea di prodotti Contoso e quindi passarlo all'OEM per gestire la manutenzione. Ciò comportava un notevole sovraccarico di manutenzione, quindi Fabrikam decise di eseguire il refactoring del codice e di creare invece un pacchetto driver conforme a DCH.

Usare sezioni/direttive dichiarative e isolare correttamente INF

Prima di tutto, Fabrikam esamina l'elenco delle sezioni e delle direttive INF non valide nei pacchetti di driver conformi a DCH. Durante questo esercizio, Fabrikam noterà che usano molte di queste sezioni e direttive nel pacchetto driver.

Il driver INF registra un co-installer che applica impostazioni e file dipendenti dalla piattaforma. Ciò significa che il pacchetto driver è più grande di quello che deve essere, ed è più difficile eseguire il servizio del driver quando un bug influisce solo su un subset dei sistemi OEM che spediscono il driver. Inoltre, la maggior parte delle modifiche specifiche dell'OEM è correlata alla personalizzazione, quindi Fabrikam deve aggiornare il pacchetto driver ogni volta che un OEM viene aggiunto o quando un problema secondario influisce su un subset di sistemi OEM.

Fabrikam rimuove le sezioni e le direttive non dichiarative e usa lo strumento InfVerif per verificare che il nuovo file INF del pacchetto driver segue il requisito INF dichiarativo.

Usare gli INFS di estensione per componentizzare un pacchetto driver

Successivamente, Fabrikam separa le personalizzazioni specifiche dei partner OEM (ad esempio Contoso) dal pacchetto del driver di base in un'estensione INF.

Il frammento di codice seguente, aggiornato da [osrfx2_DCHU_extension.inx], specifica la Extension classe e identifica Contoso come provider poiché sarà proprietario del pacchetto del driver di estensione:

[Version]
...
Class       = Extension
ClassGuid   = {e2f84ce7-8efa-411c-aa69-97454ca4cb57}
Provider    = Contoso
ExtensionId = {zzzzzzzz-zzzz-zzzz-zzzz-zzzzzzzzzzzz} ; replace with your own GUID
...

In [osrfx2_DCHU_base.inx], Fabrikam specifica le voci seguenti:

[OsrFx2_AddReg]
HKR, OSR, "OperatingMode",, "Default" ; FLG_ADDREG_TYPE_SZ
HKR, OSR, "OperatingParams",, "None" ; FLG_ADDREG_TYPE_SZ

In [osrfx2_DCHU_extension.inx]Contoso esegue l'override del valore del Registro di sistema OperatingParams impostato dalla base e aggiunge OperatingExceptions:

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

Le estensioni vengono sempre elaborate dopo l'INF di base, ma in nessun ordine definito. Se un INF di base viene aggiornato a una versione più recente, le estensioni verranno comunque applicate nuovamente dopo l'installazione del nuovo INF di base.

Installare un servizio da un file INF

Fabrikam usa un servizio Win32 per controllare i LED nella scheda OSR. Visualizzano questo componente come parte della funzionalità principale del dispositivo, quindi lo includono come parte della loro base INF ([osrfx2_DCHU_base.inx]). Questo servizio in modalità utente (usersvc) può essere aggiunto e avviato in modo dichiarativo specificando la direttiva AddService nel file INF:

[OsrFx2_Install.NT]
CopyFiles = OsrFx2_CopyFiles

[OsrFx2_Install.NT.Services]
AddService = WUDFRd, 0x000001fa, WUDFRD_ServiceInstall    ; Flag 0x2 sets this as the service for the device
AddService = osrfx2_DCHU_usersvc,, UserSvc_ServiceInstall

[UserSvc_ServiceInstall]
DisplayName = %UserSvcDisplayName%
ServiceType = 0x10                                ; SERVICE_WIN32_OWN_PROCESS
StartType = 0x3                                   ; SERVICE_DEMAND_START
ErrorControl = 0x1                                ; SERVICE_ERROR_NORMAL
ServiceBinary = %13%\osrfx2_DCHU_usersvc.exe
AddTrigger = UserSvc_AddTrigger                   ; AddTrigger syntax is only available in Windows 10 Version 2004 and above

[UserSvc_AddTrigger]
TriggerType = 1                                   ; SERVICE_TRIGGER_TYPE_DEVICE_INTERFACE_ARRIVAL
Action = 1                                        ; SERVICE_TRIGGER_ACTION_SERVICE_START
SubType = %GUID_DEVINTERFACE_OSRFX2%              ; Interface GUID
DataItem = 2, "USB\VID_0547&PID_1002"             ; SERVICE_TRIGGER_DATA_TYPE_STRING

[OsrFx2_CopyFiles]
osrfx2_DCHU_base.dll
osrfx2_DCHU_filter.dll
osrfx2_DCHU_usersvc.exe

Tale servizio può essere installato anche in un componente o in un'estensione INF, a seconda dello scenario.

Usare un componente per installare software legacy da un pacchetto driver

Fabrikam ha un file osrfx2_DCHU_componentsoftware.exe eseguibile installato in precedenza usando un co-installer. Questo software legacy visualizza le chiavi del Registro di sistema impostate dalla scheda ed è richiesto dall'OEM. Si tratta di un eseguibile basato su GUI che viene eseguito solo in Windows per le edizioni desktop. Per installarlo, Fabrikam crea un pacchetto di driver del componente separato e lo aggiunge nell'estensione INF.

Il frammento di codice seguente da [osrfx2_DCHU_extension.inx] usa la direttiva AddComponent per creare un dispositivo figlio virtuale:

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


[OsrFx2Extension_ComponentInstall]
ComponentIds=VID_045e&PID_94ab

Nel componente INF [osrfx2_DCHU_component.inx], Fabrikam specifica quindi la direttiva AddSoftware per installare il file eseguibile facoltativo:

[OsrFx2Component_Install.NT.Software]
AddSoftware = osrfx2_DCHU_componentsoftware,, OsrFx2Component_SoftwareInstall

[OsrFx2Component_SoftwareInstall]
SoftwareType = 1
SoftwareBinary = osrfx2_DCHU_componentsoftware.exe
SoftwareArguments = <<DeviceInstanceId>>
SoftwareVersion = 1.0.0.0

[OsrFx2Component_CopyFiles]
osrfx2_DCHU_componentsoftware.exe

Il codice sorgente per l'app Win32 è incluso nell'esempio .

Il pacchetto del driver del componente viene distribuito solo negli SKU desktop a causa della destinazione impostata nella Windows Hardware Dev Center dashboard. Per altre informazioni, vedere Pubblicare un driver in Windows Update.

Consentire la comunicazione con un'app di supporto hardware

Fabrikam vuole fornire un'app complementare basata su GUI come parte del pacchetto driver di Windows. Poiché le applicazioni complementari basate su Win32 non possono far parte di un pacchetto di Driver di Windows, portano l'app Win32 all'piattaforma UWP (Universal Windows Platform) (UWP) e associano l'app al dispositivo.

Il frammento di codice osrfx2_DCHU_base/device.c seguente mostra come il pacchetto driver di base aggiunge una funzionalità personalizzata all'istanza dell'interfaccia del dispositivo:

    WDF_DEVICE_INTERFACE_PROPERTY_DATA PropertyData = { 0 };
    static const wchar_t customCapabilities[] = L"CompanyName.yourCustomCapabilityName_YourStorePubId\0";

    WDF_DEVICE_INTERFACE_PROPERTY_DATA_INIT(&PropertyData,
                                            &GUID_DEVINTERFACE_OSRUSBFX2,
                                            &DEVPKEY_DeviceInterface_UnrestrictedAppCapabilities);

    Status = WdfDeviceAssignInterfaceProperty(Device,
                                              &PropertyData,
                                              DEVPROP_TYPE_STRING_LIST,
                                              sizeof(customCapabilities),
                                              (PVOID)customCapabilities);

La nuova app (non inclusa nell'esempio) è sicura e può essere aggiornata facilmente in Microsoft Store. Con l'applicazione UWP pronta, Contoso usa gestione e manutenzione immagini di distribuzione per pre-caricare l'applicazione nelle immagini di Windows Desktop Edition.

Accoppiamento stretto di più file INF

Idealmente, dovrebbe esserci contratti di controllo delle versioni forti tra base, estensioni e componenti. Esistono vantaggi di manutenzione per avere questi tre pacchetti gestiti in modo indipendente (lo scenario "associato in modo libero"), ma ci sono scenari in cui devono essere raggruppati in un singolo pacchetto driver ("strettamente accoppiato") a causa di contratti di controllo delle versioni scarsi. L'esempio include esempi di entrambi gli scenari:

[OsrFx2Extension_Install.NT]
CopyInf=osrfx2_DCHU_component.inf

Questa direttiva può essere usata anche per coordinare l'installazione dei file INF nei dispositivi multifunzione. Per altre informazioni, vedere Copia di file INF.

Nota

Mentre un driver di base può eseguire il payload di un'estensione (e indirizzare il driver di base nell'etichetta di spedizione), un'estensione in bundle con un altro driver non può essere pubblicata nell'ID hardware dell'estensione.

Eseguire dall'archivio driver

Per semplificare l'aggiornamento del driver, Fabrikam specifica l'archivio driver come destinazione per copiare i file driver usando dirid 13 , se possibile. L'uso di un valore della directory di destinazione pari a 13 può comportare una maggiore stabilità durante il processo di aggiornamento del driver. Ecco un esempio di [osrfx2_DCHU_base.inx]:

[DestinationDirs]
OsrFx2_CopyFiles = 13 ; copy to Driver Store

Per altre informazioni su come trovare e caricare in modo dinamico i file dall'Archivio driver, vedere la pagina Esegui dall'Archivio driver.

Riepilogo

Il diagramma seguente illustra i pacchetti driver creati da Fabrikam e Contoso per il driver conforme a DCH. Nell'esempio associato in modo libero, verranno inviati tre invii separati sul Windows Hardware Dev Center dashboard: uno per la base, uno per l'estensione e uno per il componente. Nell'esempio strettamente associato verranno inviati due invii: base e estensione/componente.

Pacchetti di driver di estensione, base e componente.

Il componente INF corrisponde all'ID hardware del componente, mentre le estensioni e di base corrispondono all'ID hardware della scheda.

Vedi anche

Introduzione con i driver di Windows

Uso di un file INF di estensione

osrfx2_DCHU_base.inx

osrfx2_DCHU_component.inx

osrfx2_DCHU_extension.inx "associato in modo libero"

"strettamente accoppiato" osrfx2_DCHU_component.inx

"strettamente accoppiato" osrfx2_DCHU_extension.inx