Compartilhar via


Criação de um pacote de driver de atualização

É necessário que o conteúdo de atualização para cada recurso de firmware descrito no ESRT seja agrupado e distribuído em seu próprio pacote de driver para permitir que ele mantenha seu próprio esquema de controle de versão sem estar vinculado a outras atualizações de recursos de firmware que podem não ser atualizadas na mesma cadência.

O exemplo a seguir fornece uma definição de arquivo INF de pacote de driver de exemplo para uma atualização de recurso de firmware direcionada ao recurso {SYSTEM_FIRMWARE} do exemplo ESRT na Tabela 2, atualizando-o da versão 1 para a versão 2. Para fins de referência, vamos supor que o GUID atribuído para o recurso SYSTEM_FIRMWARE seja 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

Altere as seções a seguir para personalizar sua configuração.

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

A tabela a seguir descreve as várias seções e campos INF do pacote de driver com referência à definição de arquivo INF do pacote de driver de exemplo acima.

Seção/Campo Valor Comentário
[Versão] Define informações de controle de versão do pacote do driver.
Provedor %Provider% = Contoso Inc.

(localizado na seção [Cadeias de caracteres]
Identifica o provedor/fornecedor de todo o pacote de driver de atualização de recursos de firmware.
Class/ClassGuid Firmware/

{f2e7dd72-6468-4e36-b6f1-6488f42c1b52}
Especifica a data do pacote de driver. A data e a versão devem refletir a data e a versão da atualização real do recurso de firmware o mais próximo possível, a fim de garantir que o sistema de instalação do dispositivo PnP possa selecionar com precisão o melhor pacote de driver disponível no sistema.
CatalogFile catalog.cat Especifica o arquivo de catálogo associado que assina o arquivo INF do pacote de driver e todos os binários de atualização de recursos de firmware associados.
PnpLockdown 1 Habilita o mecanismo de bloqueio de arquivos do driver PnP para proteger os arquivos de driver instalados de serem modificados externamente por aplicativos não relacionados. Para atualizações de recursos de firmware, essa configuração sempre deve ser habilitada para garantir que os arquivos de imagem de recurso de firmware não possam ser adulterados fora do controle do sistema PnP
[Fabricante] Lista todos os fabricantes/fornecedores de driver distintos que definem atualizações de recursos de firmware. Cada linha do fabricante especifica uma seção [<Modelos>] e identifica sua plataforma de destino com suporte.
%MfgName% Fabrikam Inc.

(localizado na seção [Cadeias de caracteres]
Identifica o fabricante/fornecedor da atualização de recursos de firmware. Isso pode ser o mesmo que o campo Provedor.
Firmware

NTarm64.10.0... 17134
Identifica a seção [<Modelos>] que define os dispositivos de recurso de firmware compatíveis com esse pacote de driver, incluindo suas plataformas de driver de destino. Neste exemplo, os drivers são direcionados apenas para a plataforma NT baseada em Arm64 para Windows 10 compilações 17134 e posteriores e a seção [<Modelos>] é [Firmware.NTarm64.10.0... 17134].
[Firmware.NTarm64.10.0... 17134] [<Modelos>] seção para a plataforma NT baseada em Arm64 para Windows 10 compila 17134 e posterior que lista todos os dispositivos de recurso de firmware para os quais as atualizações são definidas. Cada linha de modelo de hardware especifica uma seção [<DDInstall>] e sua correspondência de ID de hardware associada.
%FirmwareDesc% Firmware do Sistema Fabrikam 2.0

(localizado na seção [Cadeias de caracteres]
Descreve a atualização de recursos de firmware. Essa é a cadeia de caracteres de descrição primária usada para apresentar a instância de dispositivo de recurso de firmware associada no Gerenciador de Dispositivos e em outras interfaces do usuário relacionadas ao dispositivo. Por esse motivo, a descrição pode incluir o fornecedor de firmware e a versão.
Firmware_Install,

UEFI\RES_{RESOURCE_GUID}
Identifica a seção [<DDInstall] que contém as etapas de instalação da atualização de recurso de firmware direcionada à instância do dispositivo identificada pela ID de hardware UEFI\RES_{RESOURCE_GUID}. Onde RESOURCE_GUID é o GUID do recurso de firmware que está sendo atualizado.
[Firmware_Install.NT]

CopyFiles = Firmware_CopyFiles

[Firmware_CopyFiles]

...
[<DDInstall>] seção que contém as etapas de instalação para a atualização de recursos de firmware. Para atualizações de recursos de firmware, isso define apenas o arquivo de imagem de recurso de firmware a ser copiado no local para uma atualização de recurso de firmware. Neste exemplo, a seção [<DDInstall>] é [Firmware_Install.NT].
firmware.bin Especifica o arquivo de imagem de atualização de recurso de firmware a ser copiado. Consulte a seção [DestinationDirs] abaixo para obter detalhes sobre onde esse arquivo é copiado.
[Firmware_Install.NT.Hw]

AddReg = Firmware_AddReg

[Firmware_AddReg]

...
[<DDInstall>. Seção Hw] que contém as etapas de instalação específicas do hardware para a atualização do recurso de firmware. Para atualizações de recursos de firmware, isso define as informações de configuração de atualização de recurso de firmware na forma de valores do Registro definidos sob a chave de hardware do dispositivo da instância do dispositivo de destino.
FirmwareId {RESOURCE_GUID} O GUID de firmware da atualização de recursos de firmware. Observe que esse é o mesmo GUID de recurso de firmware inserido na ID de hardware UEFI\RES_{RESOURCE_GUID}, no entanto, ele deve ser especificado aqui como um valor autônomo, pois o sistema PnP trata todas as IDs de hardware como cadeias de caracteres opacas que são estritamente usadas para fins de correspondência de dispositivo/driver.
FirmwareVersion 0x00000002 A versão de firmware da atualização de recurso de firmware, especificada como um valor REG_DWORD.
FirmwareFilename %13%\firmware.bin No Windows 10, versão 1803 e posteriores, esse deve ser um arquivo 'run from Driver Store' e fornecer o caminho completo para o binário, como no exemplo. Antes de Windows 10, versão 1803, esse deve ser o caminho relativo e o nome do arquivo de firmware do nome de imagem da Cápsula de Atualização da atualização do recurso de firmware no diretório %SystemRoot%\Firmware, de modo que {RESOURCE_GUID} represente um subdiretório usado para organizar todos os arquivos de imagem de firmware direcionados para um recurso de firmware específico. Por exemplo, {RESOURCE_GUID}\firmware.bin.
[SourceDisksNames] Lista todos os locais distintos do disco de origem do pacote de driver em que arquivos de driver associados, como arquivos de imagem de recurso de atualização de firmware, estão contidos.
1 %DiskName% = Atualização de firmware

(localizado na seção [Cadeias de caracteres]
Especifica uma ID de disco de origem do pacote de driver numerada arbitrariamente e seu nome de descrição. Nenhum subdiretório relativo do pacote de driver opcional é especificado para que todos os arquivos de driver associados a essa ID de disco, como o arquivo de imagem de atualização de recurso de firmware, residam diretamente ao lado do arquivo INF.
[SourceDisksFiles] Lista todos os arquivos de driver referenciados pelo pacote de driver e os vincula a uma ID de disco da seção [SourceDisksNames].
firmware.bin 1 Estabelece o arquivo de imagem de atualização de recurso firmware.bin como parte do pacote de driver vinculando-o à ID do disco primário. Nenhum subdiretório específico do arquivo opcional é especificado, portanto, espera-se que esse arquivo de driver resida em relação ao subdiretório de sua ID de disco, que, nesse caso, está ao lado do arquivo INF.
[DestinationDirs] Lista os diretórios de destino de todos os arquivos de driver referenciados pelo pacote de driver.
DefaultDestDir 13 Especifica o diretório de destino padrão de todos os arquivos de driver copiados por esse pacote de driver. No Windows 10, versão 1803 e posterior, esse deve ser o DIRID 13 para fazer com que os arquivos "sejam executados no Repositório de Driver". Antes de Windows 10, versão 1803, deve ser 10,Firmware\{RESOURCE_GUID} para especificar que o destino de todos os arquivos está em %SystemRoot%\Firmware, em que 10 (DIRID_WINDOWS) representa o diretório base %SystemRoot% e {RESOURCE_GUID} representa um subdiretório chamado após o GUID do recurso de firmware.
[Cadeias de caracteres] Define mapeamentos de chave/valor para todos os tokens de cadeia de caracteres indiretos (%token%) no arquivo INF do pacote de driver. O uso de tokens de cadeia de caracteres permite que um arquivo INF do pacote de driver seja facilmente localizado introduzindo [Cadeias de caracteres) específicas da localidade.<Seções LanguageID>]. Também pode ser útil usar a substituição de token de cadeia de caracteres para definir valores numéricos constantes, como REG_DWORD.
Provedor "Contoso Ltd." Um exemplo de um mapeamento de chave/valor de token de cadeia de caracteres.

É importante usar um nome exclusivo para cada versão do arquivo de imagem de atualização de recurso de firmware para evitar possíveis colisões com outros arquivos de imagem de firmware, tanto seus quanto os de outros fornecedores de firmware. Por exemplo, firmware.bin do acima deve receber o seguinte nome para atender às restrições de nome de fornecedor e versão: Fabrikam-System-Firmware-2.0.bin.

Para garantir que as variantes de uma determinada imagem de atualização de recurso de firmware, potencialmente usada para fins de personalização de OEM/IHV, não colidam quando implantadas na mesma imagem do sistema Windows, é recomendável que cada imagem de atualização de recurso de firmware distinta seja um arquivo 'run from Driver Store' (Windows 10, versão 1803 e posterior) ou mantida em um subdiretório dentro do diretório %SystemRoot%\Firmware. Esse subdiretório deve ser nomeado em homenagem ao GUID do recurso de firmware de destino. Por exemplo, os seguintes caminhos de imagem de atualização de recurso de firmware atendem às restrições de implantação: %SystemRoot%\\Firmware\\{6bd4efb9-23cc-4b4a-ac37-016517413e9a}\\Fabrikam-System-Firmware-2.0.bin.

Testar a assinatura do pacote de driver de firmware

Depois que o arquivo INF do pacote de driver e o binário de conteúdo de firmware estiverem prontos, todo o pacote de driver deverá ser assinado para produzir um arquivo de catálogo. É crucial que esse arquivo de catálogo atesta a validade e a autenticidade do arquivo INF e do binário de conteúdo de firmware contidos no pacote de driver para permitir que o Windows inicie com segurança uma atualização de recurso de firmware.

As etapas para autoassinar o pacote de driver para fins de teste são enumeradas abaixo. Observe que essas etapas são somente para fins de teste. Em produção, os pacotes de driver de atualização de firmware devem ser enviados ao Partner Center para assinatura. Para obter as etapas para assinar um pacote de driver de firmware para produção, consulte Certificando e assinando o pacote de atualização.

  1. Instale o SDK do Windows mais recente e o Windows Driver Kit. Isso instalará as ferramentas makecert, pvk2pfx inf2cat e signtool em %systemdir%\Program Files (x86)\Windows Kits\<*version*>\bin\x86.

  2. Execute o comando a seguir para criar um certificado de teste.

    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
    

    Para obter mais informações, consulte MakeCert.

  3. Execute o comando a seguir para criar um arquivo de catálogo.

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

    O argumento /driver aponta para o local onde o INF está localizado. Altere o valor do argumento /os dependendo do sistema operacional para o qual o pacote de driver de firmware é destinado. Para obter mais informações, consulte Inf2Cat.

    Para obter mais informações sobre catálogos e drivers de segurança, consulte Arquivos de Catálogo e Assinaturas Digitais e Criando um arquivo de catálogo para um pacote de driver PnP.

  4. Execute o comando a seguir para assinar o arquivo de catálogo.

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

    Para obter mais informações, consulte SignTool.

  5. Instale o certificado de teste no sistema de teste:

    1. Clique duas vezes no arquivo fwu.cer e escolha a opção Instalar Certificado .

    2. Escolha as seguintes opções durante a instalação do certificado:

      • Para Local da Loja, escolha Computador Local.

      • Para Repositório de Certificados, navegue e selecione Autoridades de Certificação Raiz Confiáveis.

  6. Desabilite a inicialização segura nas opções de firmware/BIOS.

  7. Habilite a assinatura de teste nas opções bcd para que o carregador do sistema operacional possa carregar o arquivo de imagem de firmware (firmware.bin) durante a inicialização, mesmo que o catálogo não esteja assinado em produção. Execute o seguinte comando com privilégios de administrador:

    bcdedit /set testsigning on
    

Depois que o pacote de driver for assinado, ele poderá ser instalado usando um dos seguintes mecanismos:

  • Gerenciador de Dispositivos. Para testes manuais, Gerenciador de Dispositivos fornece uma interface amigável para localizar um dispositivo de recurso de firmware e atualizar seu driver para iniciar uma atualização de recurso de firmware.

    1. Localize o dispositivo de recurso de firmware desejado na classe "Firmware" ao exibir dispositivos por tipo ou no dispositivo "Sistema UEFI-Compliant microsoft" ao exibir dispositivos por conexão.

    2. Clique com o botão direito do mouse no dispositivo de recurso de firmware e selecione o "Atualizar Software do Driver..." Opção.

    3. Use a opção "Procurar software de driver no meu computador" para localizar e instalar um pacote de driver de atualização de recurso de firmware mais recente no dispositivo de recurso de firmware. Essa operação garantirá que o pacote de driver de atualização de recursos de firmware especificado seja de fato mais recente do que qualquer pacote de driver de atualização de recurso de firmware existente que já possa estar no dispositivo de recurso de firmware antes de adicioná-lo à Windows Driver Store e iniciar uma instalação.

  • pnputil. Para testes automatizados, o utilitário de linha de comando PnpUtil pode ser usado de um prompt de comando com privilégios elevados do administrador para importar um pacote de driver de atualização de recursos de firmware para a Windows Driver Store e iniciar uma instalação de dispositivo em qualquer/todos os dispositivos de recurso de firmware aplicáveis que atualmente estão usando uma versão mais antiga do recurso de firmware, conforme estabelecido pelo DriverVer do arquivo INF do pacote de driver atualmente instalado ou a falta de um arquivo INF de pacote de driver fornecido por terceiros Completamente. Por exemplo, use a seguinte linha de comando para adicionar e instalar X:\firmware.inf:

    pnputil -i -a X:\firmware.inf
    

Se a atualização de recurso de firmware tiver sido instalada com êxito em um dispositivo de recurso de firmware e fornecer uma atualização de recurso de firmware que seja uma versão mais alta do que a versão atual do firmware, o dispositivo aguardará uma reinicialização do sistema para concluir a operação de atualização. Um dispositivo nesse estado indicará sua necessidade de reinicializar o sistema mantendo um problema de dispositivo, o que impede que o dispositivo seja iniciado e restaurado para um estado estável até que a reinicialização seja executada.

Validando o status da atualização de firmware

Quando um pacote de driver de firmware for instalado com êxito, o PnP solicitará uma reinicialização do sistema para aplicar as atualizações. Após a reinicialização, o status da atualização pode ser validado. O status da atualização é mantido sob a seguinte chave do Registro: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FirmwareResources\{RESOURCE_GUID}.

RESOURCE_GUID é o GUID do recurso (do ESRT) que foi atualizado.

O valor do registro "LastAttemptStatus" indica o status da atualização de firmware, em que um valor de 0 indica êxito e qualquer valor diferente de zero representa uma falha. O valor dessa chave do Registro são códigos NTSTATUS preenchidos pelo Carregador do SISTEMA Operacional com base no valor de LastAttemptStatus do ESRT. A tabela a seguir mapeia o código LastAttemptStatus para seu código NTSTATUS correspondente.

LastAttemptStatus Código NTSTATUS Código
Sucesso 0 STATUS_SUCCESS 0x00000000
Erro: Sem êxito 1 STATUS_UNSUCCESSFUL 0xC0000001
Erro: Recursos insuficientes 2 STATUS_INSUFFICIENT_RESOURCES 0xC000009A
Erro: versão incorreta 3 STATUS_REVISION_MISMATCH 0xC0000059
Erro: Formato de imagem inválido 4 STATUS_INVALID_IMAGE_FORMAT 0xC000007B
Erro: Erro de autenticação 5 STATUS_ACCESS_DENIED 0xC0000022
Erro: Evento de energia, AC não conectado 6 STATUS_POWER_STATE_INVALID 0xC00002D3
Erro: Evento de energia, bateria insuficiente 7 STATUS_INSUFFICIENT_POWER 0xC00002DE

A propriedade ID de hardware do nó do dispositivo de recurso de firmware também deve refletir a alteração na versão do firmware, em que XXX é a nova versão do firmware.

  • UEFI\RES_{RESOURCE_GUID}&REV_XXX

Se a atualização de firmware falhar, você poderá repetir a atualização de firmware com falha:

  • Em Gerenciador de Dispositivos, expanda o nó Firmware, clique com o botão direito do mouse no dispositivo de recurso de firmware e clique em Atualizar Software do Driver.

  • Clique em Procurar software de driver no meu computador e, na próxima página, clique em Deixe-me escolher em uma lista de drivers de dispositivo no meu computador.

  • Selecione o mesmo driver que você instalou anteriormente e clique em OK.

Após a próxima reinicialização, o carregador do sistema operacional chamará UpdateCapsule() com o conteúdo do pacote de driver de firmware.

Definição de tabela ESRT

Dispositivo plug and play

Processando atualizações

E/S do dispositivo do ambiente UEFI

Prevenção e recuperação contínuas de crises

Status de atualização de firmware