Создание пакета драйвера обновления

Необходимо, чтобы полезные данные обновления для каждого ресурса встроенного ПО, описанного в ESRT, были упакованы и распределены в собственном пакете драйверов, чтобы позволить ему поддерживать собственную систему версионирования без привязки к другим обновлениям ресурсов встроенного ПО, которые могут не обновляться с той же частотой.

В следующем примере показано примерное определение INF-файла пакета драйвера для обновления ресурса микропрограммы, направленного на ресурс {SYSTEM_FIRMWARE} из примера ESRT в таблице 2, обновляемого с версии 1 до версии 2. В справочных целях предположим, что GUID, назначенный для ресурса SYSTEM_FIRMWARE, равен 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

Измените следующие разделы для настройки вашей системы.

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

В следующей таблице описаны различные разделы и поля INF-файла пакета драйвера со ссылкой на приведенное выше определение INF-файла пакета драйвера.

Раздел или поле Ценность Комментарий
[версия] Определяет сведения о версиях пакетов драйверов.
Поставщик %Provider% = Contoso Inc.

(локализовано в разделе [Строки])
Определяет поставщика или вендора пакета драйвера для обновления всех ресурсов встроенного ПО.
Class/ClassGuid Микропрограммное обеспечение/

{f2e7dd72-6468-4e36-b6f1-6488f42c1b52}
Указывает дату пакета драйвера. Дата и версия должны отражать дату и версию фактического обновления ресурсов встроенного ПО как можно ближе, чтобы убедиться, что система установки устройства PnP может точно выбрать лучший пакет драйвера, доступный в системе.
Файл каталога catalog.cat Указывает связанный файл каталога, который подписывает INF-файл пакета драйвера и все связанные двоичные файлы обновления ресурсов встроенного ПО.
PnpLockdown 1 Позволяет механизм блокировки файлов драйверов PnP для защиты установленных файлов драйверов от изменения внешних приложений, не связанных с ними. Для обновлений ресурсов встроенного ПО этот параметр всегда должен быть включен, чтобы убедиться, что файлы образов ресурсов встроенного ПО не могут быть изменены за пределами управления системой PnP.
[Производитель] Выводит список всех отдельных производителей и поставщиков драйверов, определяющих обновления ресурсов встроенного ПО. Каждая линия производителя указывает раздел [<Модели>] и определяет поддерживаемую целевую платформу.
%MfgName% Fabrikam Inc.

(локализовано в разделе [Строки])
Определяет производителя или поставщика обновления ресурса встроенного ПО. Это может совпадать с полем "Поставщик".
Микропрограммное обеспечение

NTarm64.10.0... 17134
Определяет раздел [<Модели>], определяющий устройства ресурсов встроенного ПО, поддерживаемые этим пакетом драйверов, включая целевые платформы драйверов. В этом примере драйверы предназначены только для платформы NT на основе Arm64 для Windows 10 сборок 17134 и более поздних версий, а раздел [<Модели>] — [Firmware.NTarm64.10.0... 17134].
[Firmware.NTarm64.10.0... 17134] Раздел [<Модели>] для платформы NT на основе Arm64 для Windows 10 сборки 17134 и более поздних версий, в котором перечислены все устройства ресурсов встроенного ПО, для которых определены обновления. Каждая модельная линия оборудования указывает раздел [<DDInstall>] и соответствующий идентификатор оборудования.
%FirmwareDesc% Встроенное ПО системы Fabrikam 2.0

(локализовано в разделе [Строки])
Описывает обновление ресурсов встроенного ПО. Это основная строка описания, используемая для представления связанного экземпляра устройства ресурса встроенного ПО в Диспетчере устройств и другом пользовательском интерфейсе, связанном с устройством. По этой причине описание может включать поставщика встроенного ПО и версию.
Установка_Прошивки

UEFI\RES_{RESOURCE_GUID}
Определяет раздел [<DDInstall], содержащий шаги установки обновления ресурсов встроенного ПО, предназначенный для экземпляра устройства, определяемого идентификатором оборудования UEFI\RES_{RESOURCE_GUID}. Где RESOURCE_GUID — это GUID ресурса прошивки, который обновляется.
[Firmware_Install.NT]

CopyFiles = Firmware_CopyFiles

[Firmware_CopyFiles]

...
Раздел [<DDInstall>], содержащий шаги установки для обновления ресурсов встроенного ПО. Для обновлений ресурсов встроенного ПО это определяет только файл образа встроенного ПО для копирования на место для обновления ресурса встроенного ПО. В этом примере раздел [<DDInstall>] — [Firmware_Install.NT].
firmware.bin Указывает файл образа обновления ресурса встроенного ПО для копирования. Дополнительные сведения о том, где копируется этот файл, см. в разделе [DestinationDirs].
[Firmware_Install.NT.Hw]

AddReg = Firmware_AddReg

[Firmware_AddReg]

...
[<DDInstall>. Раздел Hw], содержащий специфические для оборудования этапы установки для обновления ресурсов микропрограммы. Для обновлений ресурсов встроенного ПО это определяет сведения о конфигурации обновления ресурсов встроенного ПО в виде значений реестра, заданных в разделе аппаратного ключа устройства целевого экземпляра устройства.
Идентификатор прошивки {RESOURCE_GUID} GUID встроенного ПО обновления ресурса встроенного ПО. Обратите внимание, что это тот же идентификатор ресурса встроенного ПО, который внедрен в идентификатор оборудования UEFI\RES_{RESOURCE_GUID}, однако он должен быть указан здесь как автономное значение, так как система PnP обрабатывает все аппаратные идентификаторы как непрозрачные строки, которые строго используются для сопоставления устройств и драйверов.
Версия прошивки 0x00000002 Версия встроенного ПО обновления ресурса встроенного ПО, указанная в качестве значения REG_DWORD.
Название_прошивки %13%\firmware.bin В Windows 10 версии 1803 и более поздних версий это должен быть файл run from Driver Store и предоставить полный путь к двоичному файлу, например в примере. До Windows 10 версии 1803 относительный путь и имя файла должны относиться к образу обновления ресурса встроенного ПО в каталоге %SystemRoot%\Каталог встроенного ПО. Здесь {RESOURCE_GUID} представляет собой подкаталог, используемый для организации всех файлов образов встроенного ПО, предназначенных для конкретного ресурса встроенного ПО. Например, {RESOURCE_GUID}\firmware.bin.
[SourceDisksNames] Список всех разных расположений исходного диска пакета драйверов, в которых содержатся связанные файлы драйверов, например файлы образа обновления встроенного ПО для обновления ресурсов.
1 %DiskName% = обновление встроенного ПО

(локализовано в разделе [Строки])
Задает идентификатор исходного диска пакета драйвера с произвольным номером и его описание. Нет дополнительного подкаталога пакета драйвера, поэтому все файлы драйверов, связанные с этим идентификатором диска, например файл образа обновления ресурсов микропрограммы, должны находиться непосредственно рядом с INF-файлом.
[SourceDisksFiles] Выводит список всех файлов драйверов, на которые ссылается пакет драйвера, и связывает их с идентификатором диска из раздела [SourceDisksNames].
firmware.bin 1 Устанавливает файл образа обновления ресурсов встроенного ПО firmware.bin как часть пакета драйвера, связав его с идентификатором основного диска. Необязательный подкаталог для конкретного файла не указан, поэтому этот файл драйвера, как ожидается, будет жить относительно подкаталога идентификатора диска, который в этом случае находится прямо рядом с INF-файлом.
[DestinationDirs] Перечисляет целевые каталоги назначения всех файлов драйверов, на которые ссылается пакет драйвера.
DefaultDestDir 13 (тринадцать) Указывает каталог назначения по умолчанию всех файлов драйверов, скопированных этим пакетом драйвера. В Windows 10 версии 1803 и более поздних версий это должно быть DIRID 13, чтобы сделать файлы "запускаются из Магазина драйверов". До Windows 10 версии 1803 это должно быть 10,Firmware\{RESOURCE_GUID}, чтобы указать, что назначение всех файлов находится в %SystemRoot%\Firmware, где 10 (DIRID_WINDOWS) представляет базовый каталог %SystemRoot% и {RESOURCE_GUID} представляет подкаталог с названием GUID ресурса Firmware.
[Строки] Определяет сопоставления ключей и значений для всех косвенных строковых маркеров (%token%) в INF-файле пакета драйвера. Использование строковых маркеров позволяет легко локализовать INF-файл пакета драйвера, вводя разделы [Строки.<LanguageID>], специфичные для конкретного языка. Кроме того, можно использовать подстановку строковых маркеров для определения числовых значений констант, таких как REG_DWORD.
Поставщик Contoso Ltd. Пример сопоставления ключей и значений строкового маркера.

Важно использовать уникальное имя для каждой версии файла образа обновления ресурса встроенного ПО, чтобы избежать возможных конфликтов с другими файлами образа встроенного ПО, как собственными, так и другими поставщиками встроенного ПО. Например, firmware.bin из приведенного выше следует присвоить следующее имя, чтобы удовлетворить ограничения по имени поставщика и версии: Fabrikam-System-Firmware-2.0.bin.

Чтобы убедиться, что варианты образа обновления ресурсов встроенного ПО, потенциально используемые для настройки OEM/IHV, не конфликтуют при развертывании в том же образе системы Windows, рекомендуется, чтобы каждый отдельный образ обновления ресурсов встроенного ПО был 'запускаться из Хранилища драйверов' файлом (Windows 10, версия 1803 и более поздние версии) или находился в подкаталоге в каталоге %SystemRoot%\Firmware. Этот подкаталог должен быть назван по GUID целевого ресурса прошивки. Например, следующие пути обновления ресурсов встроенного ПО удовлетворяют ограничениям развертывания. %SystemRoot%\\Firmware\\{6bd4efb9-23cc-4b4a-ac37-016517413e9a}\\Fabrikam-System-Firmware-2.0.bin

Тестовая подпись пакета драйвера прошивки

После готовности файла INF пакета драйвера и двоичного файла полезных данных встроенного ПО весь пакет драйвера должен быть подписан для создания файла каталога. Для безопасного запуска обновления ресурсов встроенного ПО в Windows этот файл каталога должен удостоверять правильность и подлинность файла INF и двоичного файла полезных данных встроенного ПО, содержащихся в пакете драйверов.

Ниже перечислены действия по самозаверяющей подписи пакета драйвера для тестовых целей. Обратите внимание, что эти действия предназначены только для тестирования. В рабочей среде пакеты драйверов обновления встроенного ПО должны быть отправлены в Центр партнеров для подписания. Инструкции по подписанию пакета драйвера встроенного ПО для производственного использования см. в разделе Сертификация и подписывание пакета обновления.

  1. Установите последнюю версию пакета SDK для Windows и комплект драйверов Windows (WDK).

    • Пакет SDK для Windows устанавливает такие средства, как makecert, pvk2pfxи signtool.
    • Пакет драйверов Windows (WDK) устанавливает средства для конкретного драйвера, такие как Inf2Cat.

    Обычно эти средства можно найти в каталоге установки комплектов Windows, например:

    %WindowsSdkDir%\bin\<version>\x86 (или x64)

    Замечание

    Точные папка версии пакета SDK и набор доступных средств зависят от установленных компонентов Windows SDK/WDK.

  2. Выполните следующую команду, чтобы создать тестовый сертификат.

    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
    

    Дополнительные сведения см. в разделе MakeCert.

  3. Выполните следующую команду, чтобы создать файл каталога.

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

    Аргумент /driver указывает на расположение, в котором находится INF. Измените значение аргумента /os в зависимости от ОС, для которой предназначен пакет драйвера встроенного ПО. Дополнительные сведения см. в разделе Inf2Cat.

    Дополнительные сведения о каталогах безопасности и драйверах см. Файлы каталога и цифровые подписи и Создание файла каталога для пакета драйверов PnP.

  4. Выполните следующую команду, чтобы подписать файл каталога.

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

    Дополнительные сведения см. в разделе SignTool.

  5. Установите тестовый сертификат в тестовой системе:

    1. Дважды щелкните файл fwu.cer и выберите параметр "Установить сертификат ".

    2. Выберите следующие параметры во время установки сертификата:

      • Для местоположения магазина выберите Локальный компьютер.

      • Для хранилища сертификатов перейдите и выберите доверенные корневые центры сертификации.

  6. Отключите безопасную загрузку в параметрах встроенного ПО или BIOS.

  7. Включите тестовую подпись в параметрах BCD, чтобы загрузчик ОС мог загрузить файл образа встроенного ПО (firmware.bin) во время загрузки, даже если каталог не подписан в соответствии с производственными стандартами. Выполните следующую команду с правами администратора:

    bcdedit /set testsigning on
    

После подписания пакета драйвера его можно установить с помощью одного из следующих механизмов:

  • Диспетчер устройств. Для ручного тестирования Диспетчер устройств предоставляет удобный интерфейс для поиска устройства ресурса встроенного ПО и обновления драйвера для запуска обновления ресурсов встроенного ПО.

    1. Найдите требуемое устройство ресурса встроенного ПО в классе "Встроенное ПО" при просмотре устройств по типу или на устройстве Microsoft UEFI-Compliant System при просмотре устройств по подключению.

    2. Щелкните правой кнопкой мыши устройство с прошивкой и выберите пункт "Обновить драйвер...".

    3. Используйте вариант "Просмотр моего компьютера для поиска драйверов", чтобы найти и установить более новый пакет обновления драйверов для устройства встроенного ПО. Эта операция гарантирует, что указанный пакет драйвера обновления ресурсов встроенного ПО на самом деле является более новым, чем любой существующий пакет драйвера обновления ресурсов встроенного ПО, который уже может находиться на устройстве ресурса встроенного ПО, прежде чем добавлять его в Магазин драйверов Windows и инициировать установку.

  • pnputil. Для автоматического тестирования командная служебная программа PnpUtil может использоваться с правами администратора для импорта пакета драйвера обновления ресурсов встроенного ПО в Магазин драйверов Windows и инициировать установку на всех соответствующих устройствах ресурсов встроенного ПО, которые в настоящее время используют более старую версию ресурса встроенного ПО, как указано в DriverVer INF-файла их установленного пакета драйвера, или при отсутствии пакета INF-файла драйвера от стороннего поставщика. Например, используйте следующую командную строку для добавления и установки X:\firmware.inf:

    pnputil -i -a X:\firmware.inf
    

Если обновление ресурса встроенного ПО было успешно установлено на устройстве ресурсов встроенного ПО и предоставляет обновление ресурсов встроенного ПО, которое является более высокой версией текущей версии встроенного ПО, устройство ожидает перезагрузки системы, чтобы завершить операцию обновления. Устройство в этом состоянии указывает на необходимость перезагрузки системы путем поддержания проблемы с устройством, что предотвращает запуск и восстановление устройства в устойчивом состоянии до завершения перезагрузки.

Проверка состояния обновления встроенного ПО

При успешном установке пакета драйвера встроенного ПО PnP запрашивает перезагрузку системы для применения обновлений. После перезагрузки можно проверить состояние обновления. Состояние обновления сохраняется в следующем разделе реестра: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\FirmwareResources\{RESOURCE_GUID}

RESOURCE_GUID — это GUID ресурса (из ESRT), который был обновлен.

Значение реестра LastAttemptStatus указывает состояние обновления встроенного ПО, где значение 0 указывает на успешность и любое ненулевое значение представляет сбой. Значение этого ключа реестра — коды NTSTATUS, которые заполняет загрузчик ОС, исходя из значения LastAttemptStatus из ESRT. В следующей таблице код LastAttemptStatus сопоставляется с соответствующим кодом NTSTATUS.

СтатусПоследнейПопытки Код NTSTATUS Код
Успех 0 Статус: Успешно 0x00000000
Ошибка: неудачная 1 СТАТУС_НЕУСПЕШНО 0xC0000001
Ошибка: недостаточно ресурсов 2 СТАТУС_НЕДОСТАТОЧНО_РЕСУРСОВ 0xC000009A
Ошибка: неправильная версия 3 Статус_Несоответствие_Ревизии 0xC0000059
Ошибка: недопустимый формат изображения 4 СТАТУС_НЕДОПУСТИМЫЙ_ФОРМАТ_ИЗОБРАЖЕНИЯ 0xC000007B
Ошибка: ошибка проверки подлинности 5 СТАТУС_ДОСТУП_ЗАПРЕЩЕН 0xC0000022
Ошибка: Событие питания, переменный ток не подключен 6 НЕВЕРНОЕ СОСТОЯНИЕ ЭНЕРГОПОТРЕБЛЕНИЯ 0xC00002D3
Ошибка: Проблема с питанием, недостаточно заряда батареи 7 СОСТОЯНИЕ: НЕДОСТАТОЧНАЯ МОЩНОСТЬ 0xC00002DE

Свойство "Идентификатор оборудования" узла устройства ресурса, связанного со встроенным ПО, также должно отражать изменение в версии, где XXX обозначает новую версию встроенного ПО.

  • UEFI\RES_{RESOURCE_GUID}&REV_XXX

Если обновление встроенного ПО завершилось сбоем, можно повторить обновление встроенного ПО:

  • В диспетчере устройств разверните узел встроенного ПО, щелкните правой кнопкой мыши устройство ресурса встроенного ПО и щелкните "Обновить программное обеспечение драйвера".

  • Нажмите Просмотр моего компьютера для поиска программного обеспечения драйвера, и на следующей странице нажмите Выбрать из списка драйверов устройств на моем компьютере.

  • Выберите тот же драйвер, который вы установили ранее, и нажмите кнопку "ОК".

После следующей перезагрузки загрузчик ОС вызовет функцию UpdateCapsule() с содержимым пакета драйвера прошивки.

определение таблицы ESRT

устройство типа "Подключи и используй"

Обработка обновлений

I/O устройства из среды UEFI

Бесшовное предотвращение и восстановление кризисов

состояние обновления прошивки