Condividi tramite


Creazione di un pacchetto driver di aggiornamento

È necessario che il payload di aggiornamento per ogni risorsa del firmware descritto nella ESRT sia in bundle e distribuito nel proprio pacchetto driver in modo da consentire di mantenere uno schema di versionamento autonomo senza essere legato ad altri aggiornamenti delle risorse del firmware che potrebbero non essere aggiornati alla stessa cadenza.

L'esempio seguente fornisce una definizione di file INF del pacchetto driver di esempio per un aggiornamento delle risorse firmware destinato alla risorsa {SYSTEM_FIRMWARE} dell'esempio ESRT nella tabella 2, aggiornandolo dalla versione 1 alla versione 2. A scopo di riferimento, si supponga che il GUID assegnato per la risorsa SYSTEM_FIRMWARE sia 6bd4efb9-23cc-4b4a-ac37-016517413e9a.

[Version]
Signature   = "$WINDOWS NT$"
Provider    = %Provider%
Class       = Firmware
ClassGuid   = {f2e7dd72-6468-4e36-b6f1-6488f42c1b52}
DriverVer   = 01/01/2012,2.0.0.0
CatalogFile = catalog.cat
PnpLockdown = 1

[Manufacturer]
%MfgName% = Firmware,NTarm64.10.0...17134
; Prior to Windows 10, version 1803, the above should instead be:
; %MfgName% = Firmware,NTarm64

[Firmware.NTarm64.10.0...17134]
; Prior to Windows 10, version 1803, the above should instead be:
; [Firmware.NTarm64]
%FirmwareDesc% = Firmware_Install,UEFI\RES_{6bd4efb9-23cc-4b4a-ac37-016517413e9a}

[Firmware_Install.NT]
CopyFiles = Firmware_CopyFiles

[Firmware_CopyFiles]
firmware.bin

[Firmware_Install.NT.Hw]
AddReg = Firmware_AddReg

[Firmware_AddReg]
HKR,,FirmwareId,,{6bd4efb9-23cc-4b4a-ac37-016517413e9a}
HKR,,FirmwareVersion,%REG_DWORD%,0x00000002
HKR,,FirmwareFilename,,%13%\firmware.bin
; Prior to Windows 10, version 1803, the above should instead be:
; HKR,,FirmwareFilename,,{6bd4efb9-23cc-4b4a-ac37-016517413e9a}\firmware.bin

[SourceDisksNames]
1 = %DiskName%

[SourceDisksFiles]
firmware.bin = 1

[DestinationDirs]
DefaultDestDir = 13
; Prior to Windows 10, version 1803, the above should be:
; DefaultDestDir = 10,Firmware\{6bd4efb9-23cc-4b4a-ac37-016517413e9a}

[Strings]
; localizable
Provider     = "Contoso Ltd."
MfgName      = "Fabrikam Inc."
FirmwareDesc = "Fabrikam System Firmware 2.0"
DiskName     = "Firmware Update"

; non-localizable
REG_DWORD     = 0x00010001

Modificare le sezioni seguenti per personalizzare la configurazione.

[Version]
DriverVer --> The date on which this driver package was authored and the driver version of this driver package. Driver version in this driver package must be greater than the current driver version
CatalogFile --> Name of the catalog file

firmware.bin --> Change all instances of firmware.bin with the name of the firmware image name

[Manufacturer]
%MfgName% = Firmware,NTarm64.10.0...17134
[Firmware.NTarm64.10.0...17134] --> Change the architecture.
For x86, it should be NTx86
For AMD64, it should be NTamd64

[Firmware.NTarm64.10.0...17134]
%FirmwareDesc% = Firmware_Install,UEFI\RES_{6bd4efb9-23cc-4b4a-ac37-016517413e9a} --> The GUID of the firmware resource

[Firmware_AddReg]
HKR,,FirmwareId,,{6bd4efb9-23cc-4b4a-ac37-016517413e9a} --> The GUID of the firmware resource
HKR,,FirmwareVersion,%REG_DWORD%,0x00000002 --> Version of the firmware for the update
HKR,,FirmwareFilename,,%13%\firmware.bin --> firmware.bin should be replaced with the firmware image name
; Prior to Windows 10, version 1803, the above should instead be:
HKR,,FirmwareFilename,,{6bd4efb9-23cc-4b4a-ac37-016517413e9a}\firmware.bin --> The subdirectory named after the GUID of the firmware resource and the firmware image name

[DestinationDirs]
DefaultDestDir = 13 --> The full destination path as a 'run from Driver Store' binary
; Prior to Windows 10, version 1803, the above should be:
; DefaultDestDir = 10,Firmware\{6bd4efb9-23cc-4b4a-ac37-016517413e9a} --> The full destination path for the firmware image file based under a subdirectory named after the GUID of the firmware resource within the %SystemRoot%\Firmware directory

[Strings]
; localizable
Modify any strings here [optional]

La tabella seguente descrive le varie sezioni e i vari campi INF del pacchetto driver con riferimento alla definizione di file INF del pacchetto driver di esempio precedente.

Sezione/Campo Valore Commento
[Versione] Definisce le informazioni sul versionamento dei pacchetti driver.
Fornitore %Provider% = Contoso Inc.

(localizzato nella sezione [Stringhe]
Identifica il provider/fornitore dell'intero pacchetto driver di aggiornamento delle risorse del firmware.
Classe/ClassGuid Firmware/

{f2e7dd72-6468-4e36-b6f1-6488f42c1b52}
Specifica la data del pacchetto driver. Sia la data che la versione devono riflettere la data e la versione dell'aggiornamento effettivo della risorsa firmware, nel modo più preciso possibile, per garantire che il sistema di installazione del dispositivo PnP possa scegliere in modo accurato il miglior pacchetto driver disponibile nel sistema.
File di Catalogo catalog.cat Specifica il file di catalogo associato che firma il file INF del pacchetto driver e tutti i file binari di aggiornamento delle risorse firmware associati.
PnpLockdown 1 Abilita il meccanismo di blocco dei file del driver PnP per proteggere i file del driver installati dall'essere modificati esternamente da applicazioni non correlate. Per gli aggiornamenti delle risorse del firmware, questa impostazione deve essere sempre abilitata per garantire che i file di immagine delle risorse del firmware non possano essere manomessi al di fuori del controllo del sistema PnP
[Produttore] Elenca tutti i produttori/fornitori di driver distinti che definiscono gli aggiornamenti delle risorse del firmware. Ogni linea del produttore specifica una sezione [<Models>] e identifica la piattaforma di destinazione supportata.
%MfgName% Fabrikam Inc.

(localizzato nella sezione [Stringhe]
Identifica il produttore/fornitore dell'aggiornamento delle risorse del firmware. Può essere uguale al campo Provider.
Firmware

NTarm64.10.0... 17134
Identifica la sezione [<Models>] che definisce le risorse firmware dei dispositivi supportati da questo pacchetto driver, includendo le piattaforme driver di destinazione. In questo esempio, i driver sono destinati solo alla piattaforma NT basata su Arm64 per windows 10 build 17134 e successive e la sezione [<Models>] è [Firmware.NTarm64.10.0... 17134].
[Firmware.NTarm64.10.0... 17134] [<Modelli>] sezione per la piattaforma NT basata su Arm64 per Windows 10 build 17134 e versioni successive che elenca tutti i dispositivi di risorse firmware per i quali sono definiti gli aggiornamenti. Ogni riga del modello hardware specifica una sezione [<DDInstall>] e la corrispondenza dell'ID hardware associato.
%FirmwareDesc% Firmware di sistema 2.0 di Fabrikam

(localizzato nella sezione [Stringhe]
Descrive l'aggiornamento delle risorse del firmware. Questa è la stringa di descrizione primaria usata per presentare l'istanza del dispositivo della risorsa firmware associata in Gestione dispositivi e in un'altra interfaccia utente correlata al dispositivo. Per questo motivo, la descrizione può includere il fornitore e la versione del firmware.
Firmware_Install,

UEFI\RES_{RESOURCE_GUID}
Identifica la sezione [<DDInstall] contenente i passaggi di installazione per l'aggiornamento delle risorse firmware destinato all'istanza del dispositivo identificata dall'ID hardware UEFI\RES_{RESOURCE_GUID}. Dove RESOURCE_GUID è il GUID della risorsa firmware da aggiornare.
[Firmware_Install.NT]

CopyFiles = Firmware_CopyFiles

[Firmware_CopyFiles]

...
[<sezione DDInstall>] che contiene i passaggi di installazione per l'aggiornamento della risorsa firmware. Per gli aggiornamenti delle risorse del firmware, questo definisce solo il file di immagine della risorsa firmware da copiare per un aggiornamento delle risorse firmware. In questo esempio la sezione [<DDInstall>] è [Firmware_Install.NT].
firmware.bin Specifica il file di immagine di aggiornamento delle risorse del firmware da copiare. Per informazioni dettagliate sulla posizione di copia di questo file, vedere la sezione [DestinationDirs] di seguito.
[Firmware_Install.NT.Hw]

AddReg = Firmware_AddReg

[Firmware_AddReg]

...
[<DDInstall>. Sezione Hw] che contiene i passaggi di installazione specifici dell'hardware per l'aggiornamento delle risorse del firmware. Per gli aggiornamenti delle risorse firmware, definisce le informazioni di configurazione dell'aggiornamento delle risorse firmware sotto forma di valori di registro impostati sotto la chiave hardware dell'istanza del dispositivo target.
FirmwareId {RESOURCE_GUID} GUID dell'aggiornamento della risorsa firmware. Si noti che questo è lo stesso GUID della risorsa firmware incorporato nell'ID hardware UEFI\RES_{RESOURCE_GUID}, ma deve essere specificato qui come valore autonomo poiché il sistema PnP considera tutti gli ID hardware come stringhe opache usate esclusivamente per scopi di corrispondenza di dispositivi/driver.
Versione firmware 0x00000002 Versione del firmware della risorsa di aggiornamento, specificata come valore REG_DWORD.
FirmwareFilename %13%\firmware.bin In Windows 10, versione 1803 e successive, deve trattarsi di un file 'run from Driver Store' e fornire il percorso completo al file binario, ad esempio nell'esempio. Per le versioni precedenti a Windows 10, versione 1803, si deve trattare del percorso relativo e del nome del file immagine Update Capsule per l'aggiornamento della risorsa firmware nella directory %SystemRoot%\Firmware, in cui {RESOURCE_GUID} designa una sottodirectory dedicata all'organizzazione di tutti i file immagine del firmware destinati a una specifica risorsa firmware. Ad esempio, {RESOURCE_GUID}\firmware.bin.
[SourceDisksNames] Elenca tutti i percorsi distinti del disco di origine del pacchetto driver in cui sono contenuti i file driver associati, ad esempio i file di immagine delle risorse di aggiornamento del firmware.
1 %DiskName% = Aggiornamento firmware

(localizzato nella sezione [Stringhe]
Specifica un ID numerato in modo arbitrario per il disco di origine del pacchetto driver e il relativo nome descrittivo. Non è specificata alcuna sottodirectory relativa per i pacchetti driver facoltativi, pertanto tutti i file driver associati a questo ID disco, come il file immagine di aggiornamento del firmware, dovrebbero essere presenti direttamente accanto al file INF.
[SourceDisksFiles] Elenca tutti i file di driver a cui fa riferimento il pacchetto driver e li collega a un ID disco dalla sezione [SourceDisksNames].
firmware.bin 1 Stabilisce il file di immagine di aggiornamento delle risorse del firmware firmware.bin come parte del pacchetto driver collegandolo all'ID disco primario. Non viene specificata alcuna sottodirectory specifica del file facoltativa, pertanto questo file del driver dovrebbe essere attivo rispetto alla sottodirectory dell'ID disco, che in questo caso si trova accanto al file INF.
[DestinationDirs] Elenca le directory di destinazione di tutti i file driver a cui fa riferimento il pacchetto driver.
DefaultDestDir 13 Specifica la directory di destinazione predefinita di tutti i file driver copiati da questo pacchetto driver. In Windows 10, versione 1803 e successive, deve trattarsi di DIRID 13 per rendere i file 'esegui da Driver Store'. Prima di Windows 10, versione 1803, deve essere 10,Firmware\{RESOURCE_GUID} per specificare che la destinazione di tutti i file è in %SystemRoot%\Firmware, dove 10 (DIRID_WINDOWS) rappresenta la directory di base %SystemRoot% e {RESOURCE_GUID} rappresenta una sottodirectory denominata dopo il GUID della risorsa firmware.
[Stringhe] Definisci i mapping chiave/valore per tutti i token stringa indiretti (%token%) nel file INF del pacchetto driver. L'uso di token stringa consente a un file INF del pacchetto driver di essere facilmente localizzato introducendo sezioni [Stringhe specifiche delle impostazioni locali.<LanguageID>] . Può anche essere utile usare la sostituzione dei token di stringa per definire valori numerici costanti, ad esempio REG_DWORD.
Fornitore "Contoso Ltd." Un esempio di associazione chiave/valore di una stringa token.

È importante usare un nome univoco per ogni versione del file di immagine di aggiornamento delle risorse del firmware per evitare potenziali conflitti con altri file di immagine del firmware, sia i propri che quelli di altri fornitori di firmware. Ad esempio, firmware.bin dal contesto precedente dovrebbe essere assegnato il seguente nome per soddisfare sia i vincoli del nome del fornitore sia quelli di versione: Fabrikam-System-Firmware-2.0.bin.

Per garantire che le varianti di un'immagine di aggiornamento della risorsa firmware specificata, potenzialmente usate a scopo di personalizzazione OEM/IHV, non si complicano quando vengono distribuite nella stessa immagine di sistema windows, è consigliabile che ogni immagine di aggiornamento delle risorse firmware distinto sia un 'esegui da Archivio driver' file (Windows 10, versione 1803 e successive) o gestito in una sottodirectory all'interno della directory %SystemRoot%\Firmware. Questa sottodirectory deve essere denominata in base al GUID della risorsa firmware di destinazione. Ad esempio, i percorsi dell'immagine di aggiornamento delle risorse firmware seguenti soddisfano i vincoli di distribuzione: %SystemRoot%\\Firmware\\{6bd4efb9-23cc-4b4a-ac37-016517413e9a}\\Fabrikam-System-Firmware-2.0.bin.

Testare la firma digitale del pacchetto del driver firmware

Quando il file INF del pacchetto driver e il file binario del firmware sono pronti, è necessario firmare l'intero pacchetto driver per produrre un file di catalogo. È fondamentale che questo file di catalogo garantisce la validità e l'autenticità del file INF e del file payload del firmware contenuti nel pacchetto driver per consentire a Windows di avviare in modo sicuro un aggiornamento delle risorse del firmware.

I passaggi per firmare automaticamente il pacchetto driver a scopo di test sono enumerati di seguito. Si noti che questi passaggi sono solo a scopo di test. Nell'ambiente di produzione, i pacchetti driver di aggiornamento del firmware devono essere inviati al Centro per i partner per la firma. Per la procedura per firmare un pacchetto driver del firmware per l'ambiente di produzione, vedere Certificazione e firma del pacchetto di aggiornamento.

  1. Installare la versione più recente di Windows SDK e Windows Driver Kit. Verranno installati gli strumenti makecert, pvk2pfx, inf2cat e signtool in %systemdir%\Program Files (x86)\Windows Kits\<*version*>\bin\x86.

  2. Eseguire il comando seguente per creare un certificato di test.

    makecert.exe -r -pe -a sha256 -eku 1.3.6.1.5.5.7.3.3 -n CN=Foo -sv fwu.pvk fwu.cer
    pvk2pfx.exe -pvk fwu.pvk -spc fwu.cer -pi <Password entered during makecert prompt> -spc fwu.cer -pfx fwu.pfx
    

    Per altre informazioni, vedere MakeCert.

  3. Eseguire il comando seguente per creare un file di catalogo.

    Inf2Cat.exe /driver:"." /os:8_x64
    

    L'argomento /driver punta alla posizione in cui si trova l'INF. Modificare il valore dell'argomento /os in base al sistema operativo a cui è destinato il pacchetto del driver del firmware. Per altre informazioni, vedere Inf2Cat.

    Per altre informazioni su cataloghi e driver di sicurezza, vedere File di catalogo e firme digitali e Creazione di un file di catalogo per un pacchetto driver PnP.

  4. Eseguire il comando seguente per firmare il file di catalogo.

    signtool sign /fd sha256 /f fwu.pfx /p <Password entered during makecert prompt> delta.cat
    

    Per altre informazioni, vedere SignTool.

  5. Installare il certificato di test nel sistema di test:

    1. Fare doppio clic sul file fwu.cer e scegliere l'opzione Installa certificato.

    2. Scegliere le opzioni seguenti durante l'installazione del certificato:

      • In Posizione dello Store scegliere Computer locale.

      • Per l'Archivio certificati, sfogliare e selezionare Autorità di certificazione radice attendibili.

  6. Disabilitare l'avvio protetto nelle opzioni firmware/BIOS.

  7. Abilitare la firma di test nelle opzioni del BCD in modo che il caricatore del sistema operativo possa caricare il file di immagine del firmware (firmware.bin) durante l'avvio anche se il catalogo non è firmato in produzione. Eseguire il comando seguente con privilegi di amministratore:

    bcdedit /set testsigning on
    

Dopo aver firmato il pacchetto driver, è possibile installarlo usando uno dei meccanismi seguenti:

  • Il gestore dei dispositivi. Per i test manuali, Gestione dispositivi fornisce un'interfaccia intuitiva per l'individuazione di un dispositivo di risorse firmware e l'aggiornamento del driver per avviare un aggiornamento delle risorse firmware.

    1. Individuare il dispositivo della risorsa firmware desiderato nella classe "Firmware" durante la visualizzazione dei dispositivi per tipo o nel dispositivo "Microsoft UEFI-Compliant System" durante la visualizzazione dei dispositivi in base alla connessione.

    2. Fare clic con il pulsante destro del mouse sul dispositivo della risorsa firmware e selezionare "Aggiorna software driver..." opzione.

    3. Usare l'opzione "Cerca software driver nel computer" per trovare e installare un pacchetto driver di aggiornamento del firmware della risorsa più recente sul dispositivo della risorsa firmware. Questa operazione garantisce che il pacchetto driver di aggiornamento delle risorse firmware specificato sia effettivamente più recente di qualsiasi pacchetto driver di aggiornamento risorse firmware esistente che potrebbe essere già presente nel dispositivo della risorsa firmware prima di aggiungerlo a Windows Driver Store e avviare un'installazione.

  • pnputil. Per i test automatizzati, l'utilità della riga di comando PnpUtil può essere usata da un prompt dei comandi con privilegi elevati dall'amministratore per importare un pacchetto driver di aggiornamento delle risorse del firmware in Windows Driver Store e avviare un'installazione del dispositivo in qualsiasi dispositivo di risorse firmware applicabile che attualmente usano una versione precedente della risorsa firmware, come stabilito dal driverVer del file INF attualmente installato o dalla mancanza di un pacchetto di driver fornito da terze parti File INF completamente. Ad esempio, usare la riga di comando seguente per aggiungere e installare X:\firmware.inf:

    pnputil -i -a X:\firmware.inf
    

Se l'aggiornamento delle risorse del firmware è stato installato correttamente in un dispositivo di risorse firmware e fornisce un aggiornamento della risorsa firmware che è una versione successiva rispetto alla versione corrente del firmware, il dispositivo sarà in attesa di un riavvio del sistema per completare l'operazione di aggiornamento. Un dispositivo in questo stato indicherà la necessità di riavviare il sistema mantenendo un problema del dispositivo, che impedisce l'avvio e il ripristino del dispositivo in uno stato stabile fino a quando non viene eseguito il riavvio.

Convalida dello stato dell'aggiornamento del firmware

Quando viene installato correttamente un pacchetto driver del firmware, PnP richiederà un riavvio del sistema per applicare gli aggiornamenti. Dopo il riavvio, lo stato dell'aggiornamento può essere convalidato. Lo stato dell'aggiornamento viene mantenuto nella chiave del Registro di sistema seguente: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FirmwareResources\{RESOURCE_GUID}.

RESOURCE_GUID è il GUID della risorsa (da ESRT) aggiornata.

Il valore del Registro di sistema "LastAttemptStatus" indica lo stato dell'aggiornamento del firmware, dove il valore 0 indica l'esito positivo e qualsiasi valore diverso da zero rappresenta un errore. Il valore per questa chiave del Registro di sistema è costituito da codici NTSTATUS popolati da OS Loader in base al valore di LastAttemptStatus di ESRT. La tabella seguente esegue il mapping del codice LastAttemptStatus al codice NTSTATUS corrispondente.

StatoUltimoTentativo Codice NTSTATUS Codice
Successo 0 STATO_RIUSCITO 0x00000000
Errore: Operazione non riuscita 1 STATO_NON RIUSCITO 0xC0000001
Errore: Risorse insufficienti 2 STATUS_INSUFFICIENT_RESOURCES 0xC000009A
Errore: Versione non corretta 3 STATO_REVISIONE_DISCREPANZA 0xC0000059
Errore: Formato immagine non valido 4 STATO_FORMATO_IMMAGINE_NON_VALIDO 0xC000007B
Errore: Errore di autenticazione 5 STATO_ACCESSO_NEGATO 0xC0000022
Errore: Evento di alimentazione, AC non connesso 6 STATUS_POWER_STATE_INVALID 0xC00002D3
Errore: Evento di alimentazione, Batteria insufficiente 7 STATO_ALIMENTAZIONE_INSUFFICIENTE 0xC00002DE

La proprietà ID hardware del nodo del dispositivo della risorsa firmware deve riflettere anche la modifica nella versione del firmware, dove XXX è la nuova versione del firmware.

  • UEFI\RES_{RESOURCE_GUID}&REV_XXX

Se l'aggiornamento del firmware non è riuscito, è possibile ritentare l'aggiornamento del firmware non riuscito:

  • In Gestione dispositivi espandere il nodo Firmware, fare clic con il pulsante destro del mouse sul dispositivo della risorsa firmware e scegliere Update Driver Software.

  • Fare clic su Sfoglia il mio computer per il software del drivere nella pagina successiva fare clic su Permettimi di scegliere da un elenco di driver di dispositivo sul mio computer.

  • Selezionare lo stesso driver installato in precedenza e fare clic su OK.

Dopo il riavvio successivo, il caricatore di sistema operativo richiamerà UpdateCapsule() con il payload del pacchetto del driver del firmware.

definizione di tabella ESRT

dispositivo Plug and play

l'elaborazione degli aggiornamenti

I/O del dispositivo dall'ambiente UEFI

Prevenzione e ripristino delle crisi senza intoppi

stato di aggiornamento del firmware