Condividi tramite


Creazione di un pacchetto driver di aggiornamento

È necessario che il payload di aggiornamento per ogni risorsa firmware descritto in ESRT sia aggrego e distribuito nel proprio pacchetto driver in modo da consentire di mantenere il proprio schema di controllo delle versioni senza essere associato ad altri aggiornamenti delle risorse del firmware che potrebbero non essere aggiornati con la stessa frequenza.

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} dall'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 controllo delle versioni dei pacchetti driver.
Provider %Provider% = Contoso Inc.

(localizzato nella sezione [Stringhe] )
Identifica il provider o il 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. La data e la versione devono riflettere la data e la versione dell'aggiornamento effettivo della risorsa firmware nel modo più vicino possibile per garantire che il sistema di installazione del dispositivo PnP possa selezionare accuratamente il pacchetto driver migliore disponibile nel sistema.
CatalogFile 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 di 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 riga del produttore specifica una sezione [<Models>] e identifica la piattaforma di destinazione supportata.
%MfgName% Fabrikam Inc.

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

NTarm64.10.0... 17134
Identifica la sezione [<Models>] che definisce i dispositivi di risorse firmware supportati da questo pacchetto driver, incluse 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 successive che elenca tutti i dispositivi di risorse firmware per i quali vengono definiti gli aggiornamenti. Ogni linea 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 della risorsa firmware destinata 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]

...
[<DDInstall>] sezione che contiene i passaggi di installazione per l'aggiornamento delle risorse del 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 del firmware. In questo esempio la sezione [<DDInstall>] è [Firmware_Install.NT].
firmware.bin Specifica il file di immagine di aggiornamento della risorsa firmware da copiare. Per informazioni dettagliate sulla posizione in cui viene copiato 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 del firmware sotto forma di valori del Registro di sistema impostati nella chiave hardware del dispositivo dell'istanza del dispositivo di destinazione.
FirmwareId {RESOURCE_GUID} GUID del firmware 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 che vengono usate esclusivamente per scopi di corrispondenza di dispositivi/driver.
FirmwareVersion 0x00000002 Versione del firmware dell'aggiornamento della risorsa firmware, specificata come valore REG_DWORD.
FirmwareFilename %13%\firmware.bin In Windows 10, versione 1803 e successive, questo deve essere un file "run from Driver Store" e fornire il percorso completo al file binario, ad esempio nell'esempio. Per prima di Windows 10, versione 1803, deve trattarsi del percorso relativo e del nome file del firmware del nome dell'immagine Update Capsule dell'aggiornamento della risorsa firmware nella directory %SystemRoot%\Firmware in modo che {RESOURCE_GUID} rappresenti una sottodirectory usata per organizzare tutti i file di immagine del firmware destinati a una risorsa firmware specifica. 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 disco di origine del pacchetto driver con numerazione arbitraria e il nome della descrizione. Non viene specificata alcuna sottodirectory relativa del pacchetto driver facoltativo, in modo che tutti i file driver associati a questo ID disco, ad esempio il file di immagine di aggiornamento delle risorse del firmware, si trovino direttamente accanto al file INF.
[SourceDisksFiles] Elenca tutti i file 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 firmware come parte del pacchetto driver collegandolo con l'ID disco primario. Non viene specificata alcuna sottodirectory facoltativa specifica del file in modo che questo file di driver sia attivo rispetto alla sottodirectory dell'ID disco, che in questo caso si trova proprio 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 essere DIRID 13 per eseguire i file dall'archivio driver. 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 %SystemRoot% di base e {RESOURCE_GUID} rappresenta una sottodirectory denominata dopo il GUID della risorsa firmware.
[Stringhe] Definisce i mapping chiave/valore per tutti i token di stringa indiretti (%token%) nel file INF del pacchetto driver. L'uso dei token di stringa consente a un file INF del pacchetto driver di essere facilmente localizzato introducendo impostazioni locali specifiche [Strings.<Sezioni LanguageID>] . Può anche essere utile usare la sostituzione del token di stringa per definire valori numerici costanti, ad esempio REG_DWORD.
Provider "Contoso Ltd." Esempio di mapping di chiave/valore del token stringa.

È importante usare un nome univoco per ogni versione del file di file di immagine dell'aggiornamento delle risorse del firmware per evitare eventuali potenziali collisioni con altri file di immagine del firmware, sia propri che di altri fornitori di firmware. Ad esempio, firmware.bin dall'oggetto precedente deve essere assegnato il nome seguente per soddisfare i vincoli di nome e versione del fornitore: Fabrikam-System-Firmware-2.0.bin.

Per garantire che le varianti di un'immagine di aggiornamento delle risorse firmware specificata, potenzialmente usate per scopi di personalizzazione OEM/IHV, non si confondano quando vengono distribuite nella stessa immagine del sistema Windows, è consigliabile che ogni immagine di aggiornamento delle risorse firmware distinta sia un file "run from Driver Store" (Windows 10, versione 1803 e successiva) o gestito in una sottodirectory all'interno della directory %SystemRoot%\Firmware. Questa sottodirectory deve essere denominata dopo il GUID della risorsa firmware di destinazione. Ad esempio, i percorsi di 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 del pacchetto del driver del firmware

Dopo aver pronto il file INF del pacchetto driver e il file payload del firmware, l'intero pacchetto driver deve essere firmato per produrre un file di catalogo. È fondamentale che questo file di catalogo consenta la validità e l'autenticità del file INF e del 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. In 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 la produzione, vedere Certificare e firmare il pacchetto di aggiornamento.

  1. Installare l'ultimo Windows SDK e Windows Driver Kit. In questo modo 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 INF. Modificare il valore dell'argomento /os a seconda del sistema operativo per cui è previsto il pacchetto del driver del firmware. Per altre informazioni, vedere Inf2Cat.

    Per altre informazioni sui cataloghi e i driver di sicurezza, vedere File di catalogo e firme digitali eCreazione 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:

      • Per Percorso archivio scegliere Computer locale.

      • Per Archivio certificati selezionare Autorità di certificazione radice attendibili.

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

  7. Abilitare l'accesso di test nelle opzioni 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 dall'ambiente di produzione. Eseguire il comando seguente con privilegi di amministratore:

    bcdedit /set testsigning on
    

Dopo aver firmato il pacchetto driver, può essere installato usando uno dei meccanismi seguenti:

  • Gestione dispositivi. Per i test manuali, Gestione dispositivi fornisce un'interfaccia descrittiva per individuare un dispositivo risorsa firmware e aggiornarne il driver per avviare un aggiornamento della risorsa firmware.

    1. Individuare il dispositivo della risorsa firmware desiderato nella classe "Firmware" durante la visualizzazione dei dispositivi in base al tipo oppure 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 "Sfoglia il computer per il software driver" per individuare e installare un pacchetto driver di aggiornamento risorse firmware più recente nel dispositivo della risorsa firmware. Questa operazione garantisce che il pacchetto driver di aggiornamento delle risorse firmware specificato sia più recente di qualsiasi pacchetto driver di aggiornamento delle risorse firmware esistente che potrebbe essere già presente nel dispositivo della risorsa firmware prima di aggiungerlo all'Archivio driver di Windows 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 di amministratore per importare un pacchetto driver di aggiornamento delle risorse del firmware di Windows in Windows Driver Store e avviare un'installazione del dispositivo in qualsiasi/tutti i dispositivi di risorse firmware applicabili che attualmente usano una versione precedente della risorsa firmware, come stabilito dal driverVer del file INF attualmente installato o una mancanza di un file INF fornito da un pacchetto driver di terze parti fornito inF Complessivamente. Ad esempio, usare la riga di comando seguente per aggiungere e installare X:\firmware.inf:

    pnputil -i -a X:\firmware.inf
    

Se l'aggiornamento della risorsa firmware è stato installato correttamente in un dispositivo della risorsa firmware e fornisce un aggiornamento della risorsa firmware che è una versione superiore rispetto alla versione del firmware corrente, il dispositivo sarà in attesa di un riavvio del sistema per completare l'operazione di aggiornamento. Un dispositivo in questo stato indicherà la necessità che il sistema venga riavviato mantenendo un problema del dispositivo, che impedisce l'avvio e il ripristino del dispositivo a uno stato costante 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 un valore pari a 0 indica l'esito positivo e qualsiasi valore non zero rappresenta un errore. Il valore per questa chiave del Registro di sistema è codici NTSTATUS popolati da Loader del sistema operativo in base al valore di LastAttemptStatus da ESRT. La tabella seguente esegue il mapping del codice LastAttemptStatus al codice NTSTATUS corrispondente.

LastAttemptStatus Codice NTSTATUS Codice
Operazione completata 0 STATUS_SUCCESS 0x00000000
Errore: errore non riuscito 1 STATUS_UNSUCCESSFUL 0xC0000001
Errore: risorse insufficienti 2 STATUS_INSUFFICIENT_RESOURCES 0xC000009A
Errore: versione errata 3 STATUS_REVISION_MISMATCH 0xC0000059
Errore: Formato immagine non valido 4 STATUS_INVALID_IMAGE_FORMAT 0xC000007B
Errore: Errore di autenticazione 5 STATUS_ACCESS_DENIED 0xC0000022
Errore: Evento power, AC non connesso 6 STATUS_POWER_STATE_INVALID 0xC00002D3
Errore: Evento di alimentazione, batteria insufficiente 7 STATUS_INSUFFICIENT_POWER 0xC00002DE

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

  • UEFI\RES_{RESOURCE_GUID}&REV_XXX

Se l'aggiornamento del firmware non è riuscito, è possibile ripetere 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 Aggiorna software driver.

  • Fare clic su Sfoglia il computer per il software driver e nella pagina successiva fare clic su Consenti di selezionare da un elenco di driver di dispositivo nel mio computer.

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

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

Definizione di tabella ESRT

Dispositivo Plug and play

Elaborazione degli aggiornamenti

I/O dispositivo dall'ambiente UEFI

Prevenzione e ripristino di crisi senza problemi

Stato dell'aggiornamento del firmware