Delen via


Een updatestuurprogrammapakket ontwerpen

Het is vereist dat de nettolading van de update voor elke firmwareresource die wordt beschreven in het ESRT worden gebundeld en gedistribueerd in een eigen stuurprogrammapakket , zodat het een eigen versiebeheerschema kan onderhouden zonder dat deze is gekoppeld aan andere firmwareresource-updates die mogelijk niet tegelijkertijd worden bijgewerkt.

In het volgende voorbeeld ziet u een voorbeeld van een INF-bestandsdefinitie voor stuurprogrammapakketten voor een firmwareresource-update die is gericht op de resource {SYSTEM_FIRMWARE} uit het SAMPLET-voorbeeld in tabel 2, waarbij deze wordt bijgewerkt van versie 1 naar versie 2. Voor referentiedoeleinden gaan we ervan uit dat de GUID die is toegewezen voor de SYSTEM_FIRMWARE-resource 6bd4efb9-23cc-4b4a-ac37-016517413e9a is.

[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

Wijzig de volgende secties om aan te passen voor uw installatie.

[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]

In de volgende tabel worden de verschillende INF-secties en -velden van het stuurprogrammapakket beschreven met betrekking tot de bovenstaande definitie van het INF-voorbeeldstuurprogrammapakket.

Sectie/veld Waarde Opmerking
[Versie] Definieert versiebeheerinformatie voor stuurprogrammapakketten.
Aanbieder %Provider% = Contoso Inc.

(gelokaliseerd in de [Strings] sectie)
Identificeert de provider/leverancier van het volledige stuurprogrammapakket voor firmwareresource-updates.
Klasse/KlasseGuid Firmware/

{f2e7dd72-6468-4e36-b6f1-6488f42c1b52}
Specificeert de datum van het stuurprogrammapakket. De datum en versie moeten zowel de datum als de versie van de werkelijke firmwareresource-update zo dicht mogelijk weergeven om ervoor te zorgen dat het installatiesysteem van het PnP-apparaat nauwkeurig het beste stuurprogrammapakket kan selecteren dat beschikbaar is op het systeem.
Catalogusbestand catalog.cat Hiermee wordt het bijbehorende catalogusbestand gespecificeerd dat het stuurprogrammabestand INF-bestand en alle bijbehorende binaire firmwareresource-updatebestanden ondertekent.
PnpLockdown 1 Hiermee schakelt u het vergrendelingsmechanisme van het PnP-stuurprogrammabestand in om geïnstalleerde stuurprogrammabestanden te beveiligen tegen extern wijzigen door niet-gerelateerde toepassingen. Voor firmware-resource-updates moet deze instelling altijd ingeschakeld zijn om ervoor te zorgen dat er niet met firmware-afbeeldingsbestanden kan worden geknoeid buiten het beheer van het PnP-systeem.
[Fabrikant] Een lijst met alle afzonderlijke fabrikanten/leveranciers van stuurprogramma's die firmwareresource-updates definiëren. Elke fabrikantlijn specificeert een sectie [<Modellen>] en bepaalt het ondersteunde doelplatform.
%MfgName% Fabrikam Inc.

(gelokaliseerd in de sectie [Tekenreeksen]
Identificeert de fabrikant/leverancier van de firmwareresource-update. Dit kan hetzelfde zijn als het veld Provider.
Firmware

NTarm64.10.0... 17134
Identificeert de sectie [<Modellen>] die de firmwareresourceapparaten definieert die worden ondersteund door dit stuurprogrammapakket, met inbegrip van hun doelstuurprogrammaplatformen. In dit voorbeeld zijn de stuurprogramma's alleen gericht op het op Arm64 gebaseerde NT-platform voor Windows 10-builds 17134 en hoger en is de sectie [<Modellen>] [Firmware.NTarm64.10.0... 17134].
[Firmware.NTarm64.10.0... 17134] [<Modellen>] sectie voor het op Arm64 gebaseerde NT-platform voor Windows 10-builds 17134 en hoger met alle firmwareresourceapparaten waarvoor updates zijn gedefinieerd. Elke hardwaremodellijn specificeert een sectie [<DDInstall>] en zijn bijbehorende hardware-id.
%FirmwareDesc% Fabrikam-systeemfirmware 2.0

(gelokaliseerd in de sectie [Tekenreeksen]
Beschrijft de firmware-resource-update. Dit is de primaire beschrijvingstekenreeks die wordt gebruikt om het bijbehorende firmwareresourceapparaatexemplaar in Apparaatbeheer en andere apparaatgerelateerde gebruikersinterface weer te geven. Daarom kan de beschrijving de leverancier en versie van de firmware bevatten.
Firmware_Install,

UEFI\RES_{RESOURCE_GUID}
Identificeert de sectie [<DDInstall] met de installatiestappen voor de firmwareresource-update die gericht is op het apparaatexemplaar zoals geïdentificeerd door de hardware-id UEFI\RES_{RESOURCE_GUID}. Waar RESOURCE_GUID de GUID is van de firmwareresource die wordt bijgewerkt.
[Firmware_Install.NT]

CopyFiles = Firmware_CopyFiles

[Firmware_CopyFiles]

...
De sectie [<DDInstall>] met de installatiestappen voor de firmwareresource-update. Voor firmwareresource-updates wordt hiermee alleen het installatiekopiebestand van de firmwareresource gedefinieerd dat moet worden gekopieerd voor een firmwareresource-update. In dit voorbeeld is de sectie [<DDInstall>] [Firmware_Install.NT].
firmware.bin Geeft het kopiebestand van de firmwareresourceupdate aan dat moet worden gekopieerd. Zie de sectie [DestinationDirs] hieronder voor meer informatie over waar dit bestand wordt gekopieerd.
[Firmware_Install.NT.Hw]

AddReg = Firmware_AddReg

[Firmware_AddReg]

...
[<DDInstall>. Hw] sectie die de hardwarespecifieke installatiestappen voor de firmwareresource-update bevat. Voor firmwareresource-updates definieert dit de configuratiegegevens voor firmwareresource-updates in de vorm van registerwaarden die zijn ingesteld onder de hardwaresleutel van het doelapparaatexemplaren.
FirmwareId {RESOURCE_GUID} De firmware-GUID van de firmware-resource-update. Houd er rekening mee dat dit dezelfde firmwareresource-GUID is die is ingesloten in de hardware-id UEFI\RES_{RESOURCE_GUID}, maar deze moet hier worden opgegeven als een zelfstandige waarde, omdat het PnP-systeem alle hardware-id's behandelt als ondoorzichtige tekenreeksen die strikt worden gebruikt voor vergelijkingsdoeleinden voor apparaten/stuurprogramma's.
Firmwareversie 0x00000002 De firmwareversie van de firmwareresource-update, die is opgegeven als een REG_DWORD waarde.
FirmwareBestandsnaam %13%\firmware.bin In Windows 10 versie 1803 en hoger moet dit een 'run from Driver Store' -bestand zijn en het volledige pad naar het binaire bestand opgeven, zoals in het voorbeeld. Voor vóór Windows 10, versie 1803, moet dit het relatieve pad en de bestandsnaam van de firmwarebestandsnaam van de Update Capsule-installatiekopie van de firmwareresource zijn onder de %SystemRoot%\Firmware-map, zodat {RESOURCE_GUID} een submap vertegenwoordigt die wordt gebruikt om alle firmware-installatiekopiebestanden te ordenen die zijn gericht op specifieke firmwareresources. Bijvoorbeeld {RESOURCE_GUID}\firmware.bin.
[SourceDisksNames] Overzicht van alle afzonderlijke bronschijflocaties van stuurprogrammapakketten waar gekoppelde stuurprogrammabestanden, zoals afbeeldingen van firmware-updatebronnen, zijn opgenomen.
1 %DiskName% = Firmware-update

(gelokaliseerd in de sectie [Strings])
Hiermee geeft u een willekeurig genummerde stuurprogrammapakketbron-schijf-ID en de beschrijvingsnaam. Er is geen optionele relatieve submap voor stuurprogrammapakketten opgegeven, zodat alle stuurprogrammabestanden die zijn gekoppeld aan deze schijf-id, zoals het installatiekopiebestand voor de firmwareresource-update, rechtstreeks naast het INF-bestand worden bewaard.
[SourceDisksFiles] Geeft een lijst weer van alle stuurprogrammabestanden waarnaar wordt verwezen door het stuurprogrammapakket en koppelt deze aan een schijf-id uit de sectie [SourceDisksNames].
firmware.bin 1 Hiermee wordt het firmwarebron-updatebestand firmware.bin ingesteld als onderdeel van het stuurprogrammapakket door het te koppelen aan de primaire schijf-ID. Er is geen optionele bestandsspecifieke submap opgegeven, zodat dit stuurprogrammabestand naar verwachting live is ten opzichte van de submap van de schijf-id, die in dit geval direct naast het INF-bestand staat.
[DestinationDirs] Geeft een lijst weer van de doelmaps van alle stuurprogrammabestanden waarnaar wordt verwezen door het stuurprogrammapakket.
DefaultDestDir 13 Hiermee geeft u de standaard doelmap van alle stuurprogrammabestanden die door dit stuurprogrammapakket zijn gekopieerd. In Windows 10 versie 1803 en hoger moet dit DIRID 13 zijn om de bestanden 'uitvoeren vanuit de Driver Store'. Vóór Windows 10, versie 1803, moet dit 10,Firmware\{RESOURCE_GUID} zijn om op te geven dat het doel van alle bestanden onder %SystemRoot%\Firmware valt, waarbij 10 (DIRID_WINDOWS) de basismap %SystemRoot% vertegenwoordigt en {RESOURCE_GUID} een submap met de naam van de firmwareresource-GUID.
[Tekenreeksen] Definieert sleutel-/waardetoewijzingen voor alle indirecte tekenreekstokens (%token%) in het INF-bestand van het stuurprogrammapakket. Door het gebruik van stringtokens kan een INF-stuurprogrammapakket eenvoudig worden gelokaliseerd door taalspecifieke [Strings.<LanguageID>]-secties te introduceren. Het kan ook nuttig zijn om vervanging van tekstreeks-token te gebruiken om constante numerieke waarden te definiëren, zoals REG_DWORD.
Aanbieder "Contoso Ltd." Een voorbeeld van een tekenreekstokensleutel/waardetoewijzing.

Het is belangrijk om een unieke naam te gebruiken voor elke versie van het installatiekopieënbestand voor firmwareresources om mogelijke conflicten met andere firmware-installatiekopieënbestanden te voorkomen, zowel uw eigen als die van andere firmwareleveranciers. Aan firmware.bin uit het bovenstaande moet bijvoorbeeld de volgende naam worden toegewezen om te voldoen aan zowel de naam van de leverancier als de versiebeperkingen: Fabrikam-System-Firmware-2.0.bin.

Om ervoor te zorgen dat varianten van een bepaalde firmwareresource-updateafbeelding, die mogelijk worden gebruikt voor OEM/IHV-aanpassingsdoeleinden, niet botsen wanneer ze binnen dezelfde Windows-systeemafbeelding worden geïmplementeerd, wordt aanbevolen dat elke afzonderlijke firmwareresource-updateafbeelding een 'run from Driver Store'-bestand is (Windows 10, versie 1803 en hoger) of wordt onderhouden in een submap in de map %SystemRoot%\Firmware. Deze submap moet worden benoemd naar de GUID van de doel-firmware-resource. De volgende installatiekopieën voor de firmware-resource-update voldoen bijvoorbeeld aan de implementatiebeperkingen: %SystemRoot%\\Firmware\\{6bd4efb9-23cc-4b4a-ac37-016517413e9a}\\Fabrikam-System-Firmware-2.0.bin.

Test het ondertekenen van het firmwarestuurprogrammapakket

Zodra het STUURPROGRAMMApakket INF-bestand en binaire firmwarelading gereed zijn, moet het volledige stuurprogrammapakket zijn ondertekend om een catalogusbestand te produceren. Het is van cruciaal belang dat dit catalogusbestand instaat voor de geldigheid en echtheid van het INF-bestand en de firmwarepayload-binaire die in het stuurprogrammapakket zijn opgenomen, zodat Windows veilig een update van firmwareresources kan initiëren.

Hieronder worden de stappen voor het zelfondertekenen van het stuurprogrammapakket voor testdoeleinden opgesomd. Houd er rekening mee dat deze stappen alleen voor testdoeleinden zijn bedoeld. In productie moeten stuurprogrammapakketten voor firmware-updates worden ingediend bij het Partnercentrum voor ondertekening. Zie Certificeren en ondertekenen van het updatepakket voor de stappen om een firmwaredriverpakket voor productie te ondertekenen.

  1. Installeer de nieuwste Windows SDK en Windows Driver Kit. Hiermee installeert u het makecert, pvk2pfx inf2cat en signtool-hulpprogramma's onder %systemdir%\Program Files (x86)\Windows Kits\<*version*>\bin\x86.

  2. Voer de volgende opdracht uit om een testcertificaat te maken.

    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
    

    Zie MakeCert voor meer informatie.

  3. Voer de volgende opdracht uit om een catalogusbestand te maken.

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

    Het argument /driver verwijst naar de locatie waar de INF zich bevindt. Wijzig de waarde van het argument /os , afhankelijk van het besturingssysteem waarvoor het firmwarestuurprogrammapakket is bedoeld. Zie Inf2Cat voor meer informatie.

    Zie Catalogusbestanden en digitale handtekeningen eneen catalogusbestand maken voor een PnP-stuurprogrammapakket voor meer informatie over beveiligingscatalogussen en stuurprogramma's.

  4. Voer de volgende opdracht uit om het catalogusbestand te ondertekenen.

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

    Zie SignTool voor meer informatie.

  5. Installeer het testcertificaat op het testsysteem:

    1. Dubbelklik op het bestand fwu.cer en kies de optie Certificaat installeren .

    2. Kies de volgende opties tijdens de installatie van het certificaat:

      • Kies lokale computer voor winkellocatie.

      • Blader en selecteer vertrouwde basiscertificeringsinstanties voor certificaatarchief.

  6. Schakel beveiligd opstarten uit in de firmware-/BIOS-opties.

  7. Schakel testondertekening in de BCD-opties in, zodat het besturingssysteemlaadprogramma het installatiekopiebestand van de firmware (firmware.bin) tijdens het opstarten kan laden, zelfs als de catalogus niet is ondertekend. Voer de volgende opdracht uit met beheerdersbevoegdheden:

    bcdedit /set testsigning on
    

Nadat het stuurprogrammapakket is ondertekend, kan het worden geïnstalleerd met behulp van een van de volgende mechanismen:

  • Apparaatbeheer. Voor handmatige tests biedt Apparaatbeheer een gebruiksvriendelijke interface voor het lokaliseren van een firmwarebronapparaat en het bijwerken van het stuurprogramma om een firmwarebronupdate te starten.

    1. Zoek het gewenste firmwarebronapparaat onder de klasse "Firmware" wanneer u apparaten bekijkt op type of onder het apparaat "Microsoft UEFI-Compliant System" wanneer u apparaten bekijkt op verbinding.

    2. Klik met de rechtermuisknop op het firmwareapparaat en selecteer de optie "Stuurprogramma's bijwerken...".

    3. Gebruik de optie 'Bladeren op mijn computer voor stuurprogrammasoftware' om een nieuwere stuurprogrammapakket voor firmwareresource-updates te zoeken en te installeren op het firmwareresourceapparaat. Deze bewerking zorgt ervoor dat het opgegeven stuurprogrammapakket voor firmwareresource-updates in feite nieuwer is dan een bestaand stuurprogrammapakket voor firmwareresource-updates dat mogelijk al op het firmwareresourceapparaat staat voordat u het toevoegt aan de Windows Driver Store en een installatie start.

  • pnputil. Voor geautomatiseerde tests kan het opdrachtregelprogramma PnpUtil worden gebruikt vanaf een opdrachtprompt met verhoogde beheerdersrechten om een stuurprogrammapakket voor firmwareresource-updates te importeren in de Windows Driver Store en een apparaatinstallatie te starten op alle toepasselijke firmwareresourceapparaten die momenteel een oudere firmwareresourceversie gebruiken, zoals vastgesteld door de DriverVer van hun momenteel geïnstalleerde stuurprogrammapakket INF-bestand of als er helemaal geen stuurprogrammapakket van derden is. Gebruik bijvoorbeeld de volgende opdrachtregel om X:\firmware.inf toe te voegen en te installeren:

    pnputil -i -a X:\firmware.inf
    

Als de firmwareresource-update is geïnstalleerd op een firmwareresourceapparaat en deze een firmwareresource-update levert die een hogere versie is dan de huidige firmwareversie, wacht het apparaat op het opnieuw opstarten van het systeem om de updatebewerking te voltooien. Een apparaat in deze status zal aangeven dat het systeem moet worden herstart door een apparaatprobleem te vertonen, waardoor het apparaat niet kan worden gestart of weer naar een stabiele status kan worden gebracht totdat de herstart is uitgevoerd.

De status van de firmware-update valideren

Wanneer een firmwarestuurprogrammapakket is geïnstalleerd, vraagt PnP om opnieuw opstarten van het systeem om de updates toe te passen. Na het opnieuw opstarten kan de status van de update worden gevalideerd. De status van de update wordt gehandhaafd onder de volgende registersleutel: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FirmwareResources\{RESOURCE_GUID}.

RESOURCE_GUID is de GUID van de resource (van ESRT) die is bijgewerkt.

De registerwaarde 'LastAttemptStatus' geeft de status van de firmware-update aan, waarbij een waarde van 0 aangeeft dat deze is geslaagd en dat elke waarde die niet nul is, een fout aangeeft. De waarde voor deze registersleutel zijn NTSTATUS-codes die worden ingevuld door het besturingssysteemlaadprogramma op basis van de waarde van de LastAttemptStatus van de ESRT. De volgende tabel wijst de Code LastAttemptStatus toe aan de bijbehorende NTSTATUS-code.

LaatstePogingsstatus Code NTSTATUS Code
Geslaagd 0 STATUS_SUKSES 0x00000000
Fout: Mislukt 1 STATUS_UNSUCCESSFUL 0xC0000001
Fout: Onvoldoende resources 2 STATUS_ONVOLDOENDE_HULPMIDDELEN 0xC000009A
Fout: Onjuiste versie 3 STATUS_REVISION_MISMATCH 0xC0000059
Fout: Ongeldige afbeeldingsindeling 4 STATUS_ONGELDIG_AFBEELDINGSFORMAAT 0xC000007B
Fout: Authenticatiefout 5 STATUS_TOEGANG_GEWEIGERD 0xC0000022
Fout: Stroomgebeurtenis, Netstroom Niet Aangesloten 6 STATUS_STROOMTOESTAND_ONGELDIG 0xC00002D3
Fout: Power Event, Onvoldoende batterij 7 STATUS_ONVOLDOENDE_VERMOGEN 0xC00002DE

De eigenschap Hardware-id van het knooppunt van het firmwareresourceapparaat moet ook de wijziging in de firmwareversie weerspiegelen, waarbij XXX de nieuwe firmwareversie is.

  • UEFI\RES_{RESOURCE_GUID}&REV_XXX

Als de firmware-update is mislukt, kunt u de mislukte firmware-update opnieuw proberen:

  • Vouw in Apparaatbeheer het firmwareknooppunt uit, klik met de rechtermuisknop op het firmwareresourceapparaat en klik op Stuurprogrammasoftware bijwerken.

  • Klik op Bladeren op mijn computer voor stuurprogrammasoftware en klik op de volgende pagina op Laat me kiezen uit een lijst met apparaatstuurprogramma's op mijn computer.

  • Selecteer hetzelfde stuurprogramma dat u eerder hebt geïnstalleerd en klik op OK.

Na de volgende herstart zal de OS-loader UpdateCapsule() oproepen met de inhoud van het firmwarestuurprogrammapakket.

Definitie van de ESRT-tabel

Plug and Play-apparaat

Updates verwerken

Apparaat-I/O vanuit de UEFI-omgeving

Naadloze crisispreventie en herstel

Status van de firmware-update