Так или иначе разработка внешних PCI-E устройств заканчивается тестированием их непосредственно в составе материнской платы. В большинстве случаев разработчики PCI-E устройств не являются разработчиками материнской платы, а вынуждены использовать готовые решения, доступные на данный момент на рынке. Программное обеспечение UEFI, ответственное за настройку root complex PCI-E, используемое для старта таких платформ является проприетарной разработкой производителя, и поставляется только в бинарном виде. Таким образом разработчик PCI-E устройства вынужден покупать устройства в формате "чёрный ящик", не обладая какой-либо информацией перед покупкой, установлены ли в программном обеспечении UEFI необходимые настройки root complex PCI-E, и есть ли возможность для их изменения пользователем. В качестве возможного решения данной проблемы текущая статья рассматривает метод для исследования и модификации скрытых настроек UEFI.
«Скрытые» в данном контексте означают настройки, которые не доступны для модификации в меню БИОС, или даже те, которые не показываются в меню БИОС, но присутствуют в коде. Другими словами – это настройки, заключённые в блоки grayoutif/suppressif в VFR коде программного обеспечения UEFI. Как показывает практика, таких настроек достаточно большое количество. Связано это в первую очередь с тем, что производители UEFI прошивок хотят облегчить себе портирование на новые материнские платы. Поэтому они не удаляют специфические блоки настроек для каждой отдельной платы, а содержат общий блок VFR кода видимость блоков которого контролируется набором индивидуальных конфигурационных настроек платы. Данная статья рассматривает один из способов анализа и модификации подобных скрытых настроек.
В качестве примера для целей данной статьи был написан UEFI драйвер, экспортирующий в меню UEFI свою форму, обладающую набором скрытых настроек [1]. Тестирование производилось в эмуляторе QEMU [2] с загруженным образом OVMF [3]. Созданный драйвер загружен в систему через стандартную оболочку EFI shell. При заходе в форму данного драйвера по умолчанию пользователь видит полностью закрытое для модификации меню (рис. 1).

Рис. 1. Меню HiddenSettings драйвера
В предыдущей статье «Исследование и модификация скрытых настроек UEFI BIOS хранилищ формата VarStore» был рассмотрен алгоритм открытия и модификации скрытых настроек для хранилищ формата VarStore.

Рис. 2. Меню HiddenSettings драйвера после открытия скрытых настроек хранилища Varstore
Однако как было отмечено в этой же статье, он не позволяет производить модификацию настроек, хранящихся в другом типе хранилища EfiVarStore.
Причиной этому является то, что на текущий момент код edk2, основной базы для построения всех UEFI совместимых прошивок, не позволяет производить дамп хранилищ EfiVarStore с помощью стандартной функции спецификации UEFI EFI_HII_CONFIG_ROUTING_PROTOCOL.ExportConfig() [4]. Также в силу инертности разработки UEFI прошивок, даже если эта проблема решится сегодня в коде edk2, до внедрения её в каждый БИОС современных ПК пройдут годы, не говоря уже о том, что прошивки для старых машин скорее всего не получат данного обновления никогда. В связи с этим необходимо найти альтернативное решение для модификации данных настроек.
В рамках данной статьи предлагается продолжить работу с формой драйвера HiddenSettings и модифицировать настройку Numeric хранилища efivarstorage изначально недоступную для редактирования.
Так как мы не можем произвести дамп evivarstore настроек с помощью «HIIConfig.efi dump» [5], мы не можем узнать DevicePath целевого хранилища, необходимый для выполнения команд route/extract. Однако в случае, если форма содержит как хранилища varstore, так и efivarstore, то можно попробовать использовать DevicePath от хранилища varstore, в большинстве случаев эти настройки совпадают.
Использовав DevicePath, полученный в статье «Исследование и модификация скрытых настроек UEFI BIOS хранилищ формата VarStore», мы можем получить необходимый дамп.
Обладая данными знаниями, можно модифицировать настройки методом, описанным в предыдущей статье с помощью команды «HIIConfig.efi route» с необходимым набором аргументов.

Рис. 3. Меню HiddenSettings драйвера после открытия скрытых настроек хранилища EfiVarstore
Однако не всегда удаётся получить таким образом дамп настроек efivarstore. Целевая форма может быть построена только с таким хранилищем настроек, без соседнего хранилища varstore. В этом случае без знания целевого DevicePath, модификация настроек EfiVarStore не предоставляется возможной таким методом.
При таком варианте предлагается воспользоваться стандартной командой EFI shell «dmpstore» и модифицировать настройки внутри хранилища efivarstore напрямую. Для примера представим, что настройка Numeric EFI всё ещё недоступна, и попробуем изменить её значение, не прибегая к использованию утилиты HIIConfig.
Для просмотра всех значений настроек целевого хранилища EfiVarStore необходимо выполнить команду dmpstore передав аргументом нужный UUID, а с аргументом «-s» данные настройки можно сохранить в файл на файловой системе:
Для редактирования файла можно воспользоваться стандартной утилитой «hexedit» встроенной в EFI Shell:
На рисунке ниже настройки формы выделены красным блоком.

Рис. 4. Содержимое файла FormEfiData в редакторе hexedit
Как видно они находятся ближе к концу созданного файла. В целом файл обладает заголовком в специализированном формате, а последние 4 байта представляют собой контрольную сумму.
Полный формат файла представлен в листинге ниже:

Рис. 5. Формат файла
Модифицируем 0300 на 0700 для изменения значения numeric option. Используйте «Ctrl-S» для сохранения обновлённого буфера и «Ctrl-Q» для выхода из редактора.
Для корректной загрузки обновлённых значений требуется обновить поле контрольной суммы (CRC32) в файле. Для произведения данных действий было написано специальное приложение UpdateDmpstoreDump.efi [6]. Контрольная сумма вычисляется с помощью стандартного сервиса UEFI «EFI_BOOT_SERVICES.CalculateCrc32()».
Данное приложение UpdateDmpstoreDump.efi можно использовать для актуализации поля контрольной суммы.
Если проверить файл после работы приложения, то можно увидеть, что контрольная сумма была обновлена:
После этого можно загружать файл для обновления переменной хранилища EFI с помощью той же команды dmpstore с аргументом -I и файлом настроек.
После выполнения данных операций можно проверить, что значение на целевой форме действительно изменилось:

Рис. 6. Меню HiddenSettings драйвера после открытия модификации настройки Numeric хранилища EfiVarstore
Таким образом в данной статье обозначен алгоритм для открытия и модификации скрытых настроек UEFI хранилищ типа efivarstore. Данный метод можно использовать для расширенной конфигурации программного обеспечения UEFI в случае, если его исходные коды недоступны. Расширенная конфигурация в свою очередь может помочь разработчикам устройств PCI-E для отладки своих решений в составе проприетарных материнских плат.
.png&w=384&q=75)
.png&w=640&q=75)