Поделиться через


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

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

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

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

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], содержащий шаги по установке для конкретного оборудования для обновления ресурса встроенного ПО. Для обновлений ресурсов встроенного ПО определяет сведения о конфигурации обновления ресурсов встроенного ПО в виде значений реестра, заданных в аппаратном ключе устройства экземпляра целевого устройства.
FirmwareId {RESOURCE_GUID} GUID встроенного ПО обновления ресурса встроенного ПО. Обратите внимание, что это тот же GUID ресурса встроенного ПО, который внедрен в идентификатор оборудования UEFI\RES_{RESOURCE_GUID}, однако его необходимо указать в качестве автономного значения, так как система PnP рассматривает все идентификаторы оборудования как непрозрачные строки, которые строго используются для сопоставления устройств и драйверов.
FirmwareVersion 0x00000002 Версия встроенного ПО обновления ресурса встроенного ПО, указанная в качестве значения REG_DWORD.
FirmwareFilename %13%\firmware.bin На Windows 10 версии 1803 и более поздних это должен быть файл запуска из хранилища драйверов и указать полный путь к двоичному файлу, как в примере. До Windows 10 версии 1803 это должен быть относительный путь и имя файла файла образа Update Capsule обновления ресурса встроенного ПО в каталоге %SystemRoot%\Firmware, так что {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 ресурса встроенного ПО.
[Строки] Определяет сопоставления ключей и значений для всех непрямых токенов строки (%token%) в INF-файле пакета драйвера. Использование токенов строки позволяет легко локализовать INF-файл пакета драйвера, внедрив языковой стандарт [Strings.<Разделы 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-файл пакета драйвера и двоичный файл полезных данных встроенного ПО будут готовы, для создания файла каталога необходимо подписать весь пакет драйверов. Очень важно, чтобы этот файл каталога проверял достоверность и подлинность двоичных файлов INF и полезных данных встроенного ПО, содержащихся в пакете драйверов, чтобы windows могла безопасно инициировать обновление ресурсов встроенного ПО.

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

  1. Установите последнюю версию windows SDK и комплект драйверов Для Windows. Будут установлены средства makecert, pvk2pfx inf2cat и signtool в разделе %systemdir%\Program Files (x86)\Windows Kits\<*version*>\bin\x86.

  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. Найдите требуемое устройство ресурса встроенного ПО в классе Firmware при просмотре устройств по типу или в разделе 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.

LastAttemptStatus Код NTSTATUS Код
Успешно 0 STATUS_SUCCESS 0x00000000
Ошибка: не удалось 1 STATUS_UNSUCCESSFUL 0xC0000001
Ошибка: недостаточно ресурсов 2 STATUS_INSUFFICIENT_RESOURCES 0xC000009A
Ошибка: неправильная версия 3 STATUS_REVISION_MISMATCH 0xC0000059
Ошибка: недопустимый формат изображения 4 STATUS_INVALID_IMAGE_FORMAT 0xC000007B
Ошибка: ошибка проверки подлинности 5 STATUS_ACCESS_DENIED 0xC0000022
Ошибка: Событие питания, переменный тока не подключен 6 STATUS_POWER_STATE_INVALID 0xC00002D3
Ошибка: событие питания, недостаточно заряда батареи 7 STATUS_INSUFFICIENT_POWER 0xC00002DE

Свойство Hardware ID узла устройства ресурса встроенного ПО должно также отражать изменение в версии встроенного ПО, где XXX — это новая версия встроенного ПО.

  • UEFI\RES_{RESOURCE_GUID}&REV_XXX

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

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

  • Щелкните Обзор моего компьютера для программного обеспечения драйверов, а затем на следующей странице щелкните Разрешить мне выбрать из списка драйверов устройств на моем компьютере.

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

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

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

Устройство Plug and Play

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

Ввод-вывод устройства из среды UEFI

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

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