Compartir a través de


Creación de un paquete de controladores de actualización

Es necesario que la carga de actualización de cada recurso de firmware descrito en esRT se incluya y distribuya en su propio paquete de controladores para que pueda mantener su propio esquema de control de versiones sin estar vinculado a otras actualizaciones de recursos de firmware que pueden no actualizarse con la misma cadencia.

En el ejemplo siguiente se proporciona una definición de archivo INF del paquete de controladores de ejemplo para una actualización de recursos de firmware destinada al recurso {SYSTEM_FIRMWARE} del ejemplo de ESRT de la tabla 2, actualizándolo de la versión 1 a la versión 2. Para fines de referencia, supongamos que el GUID asignado para el recurso SYSTEM_FIRMWARE es 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

Cambie las secciones siguientes para personalizar la configuración.

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

En la tabla siguiente se describen las distintas secciones y campos del paquete de controladores INF con referencia a la definición de archivo INF del paquete de controladores de ejemplo anterior.

Sección o campo Value Comentario
[Versión] Define la información de control de versiones del paquete de controladores.
Proveedor %Provider% = Contoso Inc.

(localizado en la sección [Cadenas] )
Identifica el proveedor o proveedor del paquete completo del controlador de actualización de recursos de firmware.
Class/ClassGuid Firmware/

{f2e7dd72-6468-4e36-b6f1-6488f42c1b52}
Especifica la fecha del paquete de controladores. La fecha y la versión deben reflejar la fecha y la versión de la actualización real del recurso de firmware lo más cerca posible para asegurarse de que el sistema de instalación de dispositivos PnP pueda seleccionar con precisión el mejor paquete de controladores disponible en el sistema.
CatalogFile catalog.cat Especifica el archivo de catálogo asociado que firma el archivo INF del paquete de controladores y todos los archivos binarios de actualización de recursos de firmware asociados.
PnpLockdown 1 Habilita el mecanismo de bloqueo de archivos del controlador PnP para proteger los archivos de controlador instalados de ser modificados externamente por aplicaciones no relacionadas. En el caso de las actualizaciones de recursos de firmware, esta configuración siempre debe estar habilitada para asegurarse de que los archivos de imagen de recursos de firmware no se pueden alterar fuera del control del sistema PnP.
[Fabricante] Enumera todos los fabricantes o proveedores de controladores distintos que definen las actualizaciones de recursos de firmware. Cada línea de fabricante especifica una sección [<Models>] e identifica su plataforma de destino admitida.
%MfgName% Fabrikam Inc.

(localizado en la sección [Cadenas] )
Identifica el fabricante o proveedor de la actualización de recursos de firmware. Puede ser el mismo que el campo Proveedor.
Firmware

NTarm64.10.0... 17134
Identifica la sección [<Modelos>] que define los dispositivos de recursos de firmware admitidos por este paquete de controladores, incluidas sus plataformas de controladores de destino. En este ejemplo, los controladores solo están destinados a la plataforma NT basada en Arm64 para Windows 10 compila 17134 y versiones posteriores y la sección [<Models>] es [Firmware.NTarm64.10.0... 17134].
[Firmware.NTarm64.10.0... 17134] [<Models>] section for the Arm64-based NT platform for Windows 10 builds 17134 and later that lists all firmware resource devices for which updates are defined. Cada línea de modelo de hardware especifica una sección [<DDInstall>] y su coincidencia de identificador de hardware asociada.
%FirmwareDesc% Fabrikam System Firmware 2.0

(localizado en la sección [Cadenas] )
Describe la actualización del recurso de firmware. Esta es la cadena de descripción principal que se usa para presentar la instancia del dispositivo de recursos de firmware asociado en Administrador de dispositivos y en otra interfaz de usuario relacionada con el dispositivo. Por este motivo, la descripción puede incluir el proveedor de firmware y la versión.
Firmware_Install,

UEFI\RES_{RESOURCE_GUID}
Identifica la sección [<DDInstall] que contiene los pasos de instalación de la actualización de recursos de firmware que tiene como destino la instancia del dispositivo identificada por el identificador de hardware ueFI\RES_{RESOURCE_GUID}. Donde RESOURCE_GUID es el GUID del recurso de firmware que se está actualizando.
[Firmware_Install.NT]

CopyFiles = Firmware_CopyFiles

[Firmware_CopyFiles]

...
Sección [<DDInstall>] que contiene los pasos de instalación para la actualización del recurso de firmware. En el caso de las actualizaciones de recursos de firmware, esto solo define el archivo de imagen de recurso de firmware que se va a copiar en contexto para una actualización de recursos de firmware. En este ejemplo, la sección [<DDInstall>] es [Firmware_Install.NT].
firmware.bin Especifica el archivo de imagen de actualización de recursos de firmware que se va a copiar. Consulte la sección [DestinationDirs] siguiente para obtener más información sobre dónde se copia este archivo.
[Firmware_Install.NT.Hw]

AddReg = Firmware_AddReg

[Firmware_AddReg]

...
[<DDInstall>. Sección Hw] que contiene los pasos de instalación específicos del hardware para la actualización de recursos de firmware. Para las actualizaciones de recursos de firmware, esto define la información de configuración de actualización de recursos de firmware en forma de valores del Registro que se establecen en la clave de hardware del dispositivo de la instancia de dispositivo de destino.
FirmwareId {RESOURCE_GUID} Guid de firmware de la actualización del recurso de firmware. Tenga en cuenta que se trata del mismo GUID de recurso de firmware que se inserta en el identificador de hardware UEFI\RES_{RESOURCE_GUID}, pero debe especificarse aquí como un valor independiente, ya que el sistema PnP trata todos los identificadores de hardware como cadenas opacas que se usan estrictamente para fines de coincidencia de dispositivos o controladores.
FirmwareVersion 0x00000002 La versión de firmware de la actualización del recurso de firmware, especificada como un valor de REG_DWORD.
FirmwareFilename %13%\firmware.bin En Windows 10, versión 1803 y posteriores, debe ser un archivo "ejecutar desde el almacén de controladores" y proporcionar la ruta de acceso completa al binario, como en el ejemplo. Para antes de Windows 10, versión 1803, debe ser la ruta de acceso relativa y el nombre de archivo de firmware del nombre de archivo de la imagen Update Capsule de la actualización del recurso de firmware en el directorio %SystemRoot%\Firmware de forma que {RESOURCE_GUID} representa un subdirectorio que se usa para organizar todos los archivos de imagen de firmware destinados a un recurso de firmware específico. Por ejemplo, {RESOURCE_GUID}\firmware.bin.
[SourceDisksNames] Enumera todas las distintas ubicaciones de disco de origen del paquete de controladores en las que se incluyen los archivos de controlador asociados, como los archivos de imagen de recursos de actualización de firmware.
1 %DiskName% = Actualización de firmware

(localizado en la sección [Cadenas] )
Especifica un identificador de disco de origen del paquete de controladores numerado arbitrariamente y su nombre de descripción. No se especifica ningún subdirectorio relativo del paquete de controladores opcional, por lo que se espera que los archivos de controlador asociados a este identificador de disco, como el archivo de imagen de actualización de recursos de firmware, se encuentren directamente junto al archivo INF.
[SourceDisksFiles] Enumera todos los archivos de controlador a los que hace referencia el paquete de controladores y los vincula a un identificador de disco de la sección [SourceDisksNames].
firmware.bin 1 Establece el archivo de imagen de actualización del recurso firmware.bin como parte del paquete de controladores vinculándolo con el identificador de disco principal. No se especifica ningún subdirectorio opcional específico del archivo, por lo que se espera que este archivo de controlador esté activo en relación con el subdirectorio del identificador de disco, que en este caso es justo junto al archivo INF.
[DestinationDirs] Enumera los directorios de destino de todos los archivos de controlador a los que hace referencia el paquete de controladores.
DefaultDestDir 13 Especifica el directorio de destino predeterminado de todos los archivos de controlador copiados por este paquete de controladores. En Windows 10, versión 1803 y posteriores, debe ser DIRID 13 para que los archivos "se ejecuten desde el almacén de controladores". Antes de Windows 10, versión 1803, debería ser 10,Firmware\{RESOURCE_GUID} para especificar que el destino de todos los archivos está bajo %SystemRoot%\Firmware, donde 10 (DIRID_WINDOWS) representa el directorio base %SystemRoot% y {RESOURCE_GUID} representa un subdirectorio denominado después del GUID del recurso de firmware.
[Cadenas] Define las asignaciones de clave y valor para todos los tokens de cadena indirectos (%token%) en el archivo INF del paquete de controladores. El uso de tokens de cadena permite localizar fácilmente un archivo INF del paquete de controladores mediante la introducción de cadenas específicas de la configuración regional.<Secciones LanguageID>]. También puede ser útil usar la sustitución de tokens de cadena para definir valores numéricos constantes, como REG_DWORD.
Proveedor "Contoso Ltd." Ejemplo de una asignación de clave-valor de token de cadena.

Es importante usar un nombre único para cada versión del archivo de imagen de actualización de recursos de firmware para evitar posibles colisiones con otros archivos de imagen de firmware, tanto los suyos como los de otros proveedores de firmware. Por ejemplo, firmware.bin del anterior debe asignarse el siguiente nombre para satisfacer las restricciones de nombre del proveedor y versión: Fabrikam-System-Firmware-2.0.bin.

Para asegurarse de que las variantes de una imagen de actualización de recursos de firmware determinada, que se usan potencialmente con fines de personalización oem/IHV, no entran en conflicto cuando se implementan en la misma imagen del sistema de Windows, se recomienda que cada imagen de actualización de recursos de firmware distinta sea un archivo "run from Driver Store" (Windows 10, versión 1803 y posterior) o se mantenga en un subdirectorio dentro del directorio %SystemRoot%\Firmware. Este subdirectorio debe tener el nombre después del GUID del recurso de firmware de destino. Por ejemplo, las siguientes rutas de acceso de imagen de actualización de recursos de firmware satisfacen las restricciones de implementación: %SystemRoot%\\Firmware\\{6bd4efb9-23cc-4b4a-ac37-016517413e9a}\\Fabrikam-System-Firmware-2.0.bin.

Prueba de la firma del paquete de controladores de firmware

Una vez que el archivo INF del paquete de controladores y el archivo binario de carga de firmware están listos, todo el paquete de controladores debe estar firmado para generar un archivo de catálogo. Es fundamental que este archivo de catálogo tenga en cuenta la validez y autenticidad del archivo INF y el archivo binario de carga de firmware contenidos en el paquete de controladores para permitir que Windows inicie de forma segura una actualización de recursos de firmware.

A continuación se enumeran los pasos para firmar automáticamente el paquete de controladores con fines de prueba. Tenga en cuenta que estos pasos son solo con fines de prueba. En producción, los paquetes de controladores de actualización de firmware deben enviarse al Centro de partners para la firma. Para conocer los pasos para firmar un paquete de controladores de firmware para producción, consulte Certificación y firma del paquete de actualización.

  1. Instale la versión más reciente de Windows SDK y el Kit de controladores de Windows. Esto instalará las herramientas makecert, pvk2pfx inf2cat y signtool en %systemdir%\Program Files (x86)\Windows Kits\<*version*>\bin\x86.

  2. Ejecute el siguiente comando para crear un certificado de prueba.

    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 obtener más información, vea MakeCert.

  3. Ejecute el siguiente comando para crear un archivo de catálogo.

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

    El argumento /driver apunta a la ubicación donde se encuentra el INF. Cambie el valor del argumento /os según el sistema operativo para el que está destinado el paquete de controladores de firmware. Para obtener más información, vea Inf2Cat.

    Para obtener más información sobre los catálogos y controladores de seguridad, vea Archivos de catálogo y firmas digitales y Creación de un archivo de catálogo para un paquete de controladores PnP.

  4. Ejecute el siguiente comando para firmar el archivo de catálogo.

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

    Para obtener más información, vea SignTool.

  5. Instale el certificado de prueba en el sistema de prueba:

    1. Haga doble clic en el archivo fwu.cer y elija la opción Instalar certificado .

    2. Elija las siguientes opciones durante la instalación del certificado:

      • En Ubicación de la Tienda, elija Equipo local.

      • En Almacén de certificados, busque y seleccione Entidades de certificación raíz de confianza.

  6. Deshabilite el arranque seguro en las opciones de firmware/BIOS.

  7. Habilite el inicio de sesión de prueba en las opciones de BCD para que el cargador del sistema operativo pueda cargar el archivo de imagen de firmware (firmware.bin) durante el arranque incluso si el catálogo no está firmado en producción. Ejecute el siguiente comando con privilegios de administrador:

    bcdedit /set testsigning on
    

Una vez firmado el paquete de controladores, se puede instalar mediante uno de los siguientes mecanismos:

  • Administrador de dispositivos. Para las pruebas manuales, Administrador de dispositivos proporciona una interfaz fácil de encontrar un dispositivo de recursos de firmware y actualizar su controlador para iniciar una actualización de recursos de firmware.

    1. Busque el dispositivo de recursos de firmware deseado en la clase "Firmware" mientras ve los dispositivos por tipo, o en el dispositivo "Microsoft UEFI-Compliant System" mientras ve los dispositivos por conexión.

    2. Haga clic con el botón derecho en el dispositivo de recursos de firmware y seleccione "Actualizar software de controlador..." Opción.

    3. Use la opción "Examinar mi equipo para el software del controlador" para buscar e instalar un paquete de controladores de actualización de recursos de firmware más reciente en el dispositivo de recursos de firmware. Esta operación garantizará que el paquete de controladores de actualización de recursos de firmware especificado sea más reciente que cualquier paquete de controladores de actualización de recursos de firmware existente que ya esté en el dispositivo de recursos de firmware antes de agregarlo al Almacén de controladores de Windows e iniciar una instalación.

  • pnputil. Para las pruebas automatizadas, la utilidad de línea de comandos PnpUtil se puede usar desde un símbolo del sistema con privilegios elevados del administrador para importar un paquete de controladores de actualización de recursos de firmware en el Almacén de controladores de Windows e iniciar una instalación de dispositivo en todos o todos los dispositivos de recursos de firmware aplicables que actualmente usan una versión de recurso de firmware anterior, tal como lo establece DriverVer de su archivo INF del paquete de controladores instalado actualmente o la falta de un archivo INF del paquete de controladores proporcionado por terceros. Totalmente. Por ejemplo, use la siguiente línea de comandos para agregar e instalar X:\firmware.inf:

    pnputil -i -a X:\firmware.inf
    

Si la actualización del recurso de firmware se instaló correctamente en un dispositivo de recursos de firmware y proporciona una actualización de recursos de firmware que es una versión superior a la actual, el dispositivo esperará un reinicio del sistema para completar la operación de actualización. Un dispositivo en este estado indicará su necesidad de reiniciar el sistema manteniendo un problema del dispositivo, lo que impide que el dispositivo se inicie y restaure a un estado estable hasta que se realice el reinicio.

Validación del estado de la actualización de firmware

Cuando se instala correctamente un paquete de controladores de firmware, PnP solicitará un reinicio del sistema para aplicar las actualizaciones. Después del reinicio, se puede validar el estado de la actualización. El estado de la actualización se mantiene bajo la siguiente clave del Registro: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FirmwareResources\{RESOURCE_GUID}.

RESOURCE_GUID es el GUID del recurso (de ESRT) que se actualizó.

El valor del Registro "LastAttemptStatus" indica el estado de la actualización de firmware, donde un valor de 0 indica que se ha realizado correctamente y cualquier valor distinto de cero representa un error. El valor de esta clave del Registro son códigos NTSTATUS rellenados por el cargador del sistema operativo en función del valor de LastAttemptStatus de ESRT. En la tabla siguiente se asigna el código LastAttemptStatus a su código NTSTATUS correspondiente.

LastAttemptStatus Código NTSTATUS Código
Correcto 0 STATUS_SUCCESS 0x00000000
Error: Incorrecto 1 STATUS_UNSUCCESSFUL 0xC0000001
Error: Recursos insuficientes 2 STATUS_INSUFFICIENT_RESOURCES 0xC000009A
Error: Versión incorrecta 3 STATUS_REVISION_MISMATCH 0xC0000059
Error: Formato de imagen no válido 4 STATUS_INVALID_IMAGE_FORMAT 0xC000007B
Error: Error de autenticación 5 STATUS_ACCESS_DENIED 0xC0000022
Error: Evento de alimentación, CA no conectada 6 STATUS_POWER_STATE_INVALID 0xC00002D3
Error: Evento de energía, batería insuficiente 7 STATUS_INSUFFICIENT_POWER 0xC00002DE

La propiedad Id. de hardware del nodo del dispositivo de recurso de firmware también debe reflejar el cambio en la versión de firmware, donde XXX es la nueva versión de firmware.

  • UEFI\RES_{RESOURCE_GUID}&REV_XXX

Si se produjo un error en la actualización del firmware, puede volver a intentar la actualización del firmware con errores:

  • En Administrador de dispositivos, expanda el nodo Firmware, haga clic con el botón derecho en el dispositivo de recursos de firmware y haga clic en Actualizar software de controlador.

  • Haga clic en Examinar mi equipo para el software del controlador y, en la página siguiente, haga clic en Permitirme elegir de una lista de controladores de dispositivos en mi equipo.

  • Seleccione el mismo controlador que instaló anteriormente y haga clic en Aceptar.

Después del siguiente reinicio, el cargador del sistema operativo llamará a UpdateCapsule() con la carga del paquete de controladores de firmware.

Definición de tabla ESRT

Dispositivo Plug and Play

Procesamiento de actualizaciones

E/S del dispositivo desde el entorno UEFI

Prevención y recuperación de crisis sin problemas

Estado de actualización del firmware