Вернуться к исходному меню страницы в Phoenix SCT UEFI

Вернуться к исходному меню страницы в Phoenix SCT UEFI

637

Опосля пары тестов, он подключен через переходник к ПК оказалось, что он как-то не нравится подключение через разъем PCIe Gen2, и желал бы, чтоб переключить порт на Gen1, но в UEFI Setup (настройка на требуемые характеристики не были. На лавры первооткрывателя и не претендуют такие конфигурации 100 лет в обед, но я постараюсь показать, как делать данное изменение без помощи других. С вами опять я и мы продолжаем углубляться в разные реализации UEFI во имя добра. Раз для вас все еще любопытно — Добро пожаловать под кат. У меня есть одна древняя Китайская GSM модем на моем Dell Vostro 3360 определяется через раз, и на старенькых ноутбуков — нормально. На этот раз один IDA Demo недостаточно, поэтому что DXE водители в большинстве современных UEFI будет x86-64, так что заместо этого мы будем применять radare2. Здрасти, дорогие читатели Хабра. Печально, но не смертельно, поэтому что чрезвычайно нередко, производители устройств не удаляйте Оригинальное меню производитель UEFI и просто их скрыть либо показать им их место, так что опосля маленький реверс-инжиниринг Оригинальное меню можно вернуть на место, я пошел.
Мотивация
Модификация меню достаточно старенькый, узнаваемый и популярный Тип модификаций, посреди тех, которые доступны в меню «Запуск» почему-то не достаточно. Но, во-первых, нужные сведения о меню Опции устройства. Почаще всего эти предпосылки, «поэтому что можно», но бывает и так, что сокрытые важны такие характеристики, как способность выключать МЕ, включить USB отладку (Debug EHCI-порт) для опции режимов работы PCIe и др., Производители железа легче скрыть эти пункты меню не для всех, чем для их описания в документации, и растрачивать средства на их поддержку, но эти сокрытые элементы нередко может быть восстановлен, и будут делать.
Тем не наименее, главные разъяснить издержек. Формы соединены со строчками через ID, что упрощает его локализации. Это меню из форм, обрисованных на языке ПВП и Unicode строк (хотя это не совершенно честный Юникод, но лишь UCS-2), хранятся раздельно. В моем случае UEFI-Платформа на базе Phoenix SecureCore Tiano 2.3, в которой FormBrowser организованы практически эталон: formset для каждой вкладке (Main, Advanced, Security, Boot, Exit) хранятся в отдельном DXE-водителей, и FormBrowser разговаривает с ними через протоколы, которые они регистрируют. мотора, которая указывает юзеру все формы пользовательского интерфейса. Коротко о устройстве UEFI Setup
В меню Опции UEFI, организованных в достаточно увлекательный метод и описан в спецификации UEFI Human Interface инфраструктуры (главы 29 — 31), но все в недлинной статье не поведать, так что раз кому увлекательны подробности — пишите в комментах. Тот факт, что снутри меню на 95% — это просто интерфейс для переменных в NVRAM. Go! Переменные могут находиться в различных блоков (так именуемых varstore), но характеристики, к которым есть доступ из программы установки, почаще всего хранятся в большой блок SETUP_DATA, который, в свою очередь, полностью хранится в переменной с именованием Setup. Самый всераспространенный элемент в меню, combobox, VFR описывается так:
одиниз varid = SETUP_DATA.PrimaryPcie,
prompt = STRING_TOKEN(STR_PRIMARY_PCIE),
помогите = STRING_TOKEN(STR_PRIMARY_PCIE_HELP),
функция text = STRING_TOKEN(STR_COMMON_AUTO), значение = 0, flags = DEFAULT | создание | RESET_REQUIRED;
функция text = STRING_TOKEN(STR_COMMON_PCIE1), value = 1, flags = RESET_REQUIRED;
функция text = STRING_TOKEN(STR_COMMON_PCIE2), значение = 2, flags = RESET_REQUIRED;
функция text = STRING_TOKEN(STR_COMMON_PCIE3), значение = 3, flags = RESET_REQUIRED;
функция text = STRING_TOKEN(STR_COMMON_PCIE4), значение = 4, flags = RESET_REQUIRED;
функция text = STRING_TOKEN(STR_COMMON_PCIE5), значение = 5, flags = RESET_REQUIRED;
функция text = STRING_TOKEN(STR_COMMON_PCIE6), значение = 6, flags = RESET_REQUIRED;
функция text = STRING_TOKEN(STR_COMMON_PCIE7), значение = 7, flags = RESET_REQUIRED;
endoneof;

И строчки, к примеру так:
#string STR_PRIMARY_PCIE #eng язык «основной PCIe»

Пояснения просит, пожалуй, лишь varid = SETUP_DATA.PrimaryPcie. Оставшиеся 5% — это интерактивные элементы меню, такие как Текущее время, температуру компонентов, скорости вращения вентиляторов и так дальше, они обрабатываются с помощью функции обратного вызова, которые привязаны к соответственному пт меню, но это уже иная история. Реализация FormBrowser, различаются в неких деталях, и больше всех от эталонной реализации от Intel пошел в АМИ, по обычный причине — во-первых, ссылочная реализация дико тормозили, поэтому что меню хранилась в десяток различных мест, и вы должны были собрать для каждого вызова пользовательского интерфейса, потому АМИ адаптировала ее реализации TSE AMIBIOS8 для UEFI, которая (с переменным фуррором) поддержка сейчас. Нам остается отыскать подходящий драйвер (оригинал меню «Дополнительно») и разъяснить FormBrowser’, что для вас необходимо показать, не то, что он указывает заместо обычного продвинутые на данный момент. Пункты меню собраны в формы, формы потом компилируется во внутреннее представление (ИСО), отправляясь в formset и подается на вход FormBrowser …
Нужные инструменты
Для редактирования изображения мы будем применять UEFITool, получить формы, используя Всепригодный ИСО Экстрактор, разобрать и изучить водителей formset сам FormBrowser — с radare2, и прошить модифицированный файл будет передан китайской программеру 5 баксов.
Поиск
Снять дамп прошивки, открыл в UEFITool и ищем то, что нам необходимо в начале — настройка скорости PCIe порт с именованием «Gen1»:
Запустите Universal ИСО Экстрактор, укажите путь к извлеченному файлу, нажмите клавишу извлечь и результирующий текстовый файл, который обрисовывает структуру меню «дополнительно» в том виде, в котором она нам нужна: 4 вхождения, три из которых — шофер по имени PlatfromHiiAdvancedDxe готовый кандидат для закупки сформировывает и разборка извлекаются через его тело экстракт…
Ищу этот файл «Gen1» и отыскать этот параметр:
0x0B018 форме: Advanced
… 0x44020 Установка: PCIe скорость, переменная: 0x25
0x44046 по умолчанию: 8 бит, значение: 0x0
0x44053 по умолчанию: 8 бит, значение: 0x0
0x44060 функции: Auto, значение: 0x0
0x4406E вариант: Gen1, значение: 0x1
0x4407C вариант: Gen2, значение: 0x2

Сейчас колебаний не остается-это верный файл, но опции в UEFI Setup не видно. Но есть еще один Продвинутый, который находится в файле DellSetupAdvancedDxe (отыскал через поиск Расширенный UEFITool), извлеките ее исполняемый раздел для предстоящего исследования:
Ну, остается изучить разницу меж файлами и осознать, что и где вы желаете поменять, заместо второго монитора в первую очередь.
Исследования
Скопировать оба файла в виртуальную машинку с Linux, собранные radare2 и открыть два терминала, один из которых работает r2 PlatfromHiiAdvancedDxe.bin, а иной — r2 DellSetupAdvancedDxe.bin, и опосля того, как вы начинаете двигаться в зрительном режиме с дизассемблер команда Vp:
Это говорит о том, что код, сгенерированный на базе 1-го шаблона, так сильно он не будет различаться. Познание архитектуры FormBrowser…, мы можем представить, что файлы различаются, что публикация протокола доступа к ним под различными GUID-АМИ. См. замечательное единодушие, нарушаемая лишь различными адресами переходов. Протокол может быть размещена через call gBS->InstallProtocolInterface, что листинг будет смотреться приблизительно так:
mov reg, offset gBS ; указатель BootServices
lea rcx, смещение ручки ; 1-ый параметр-это идентификатор протокола, либо NULL
lea rdx, смещение ProtocolGuid ; 2-ой параметр-это идентификатор GUID, зарегистрированный протокол
xor r8d, r8d ; 3-ий параметр-это тип интерфейса, сейчас он постоянно 0
lea r9, смещение Интерфейс ; 4-ый параметр-это интерфейс зарегистрированный протокол либо NULL
call [reg + 80h] ; вызов ГЗ->InstallProtocolInterface

Опосля неких поисков чрезвычайно схожая картина наблюдается в обоих файлов:

Уже на комментарий radare2 напротив lea rdx ясно, что GUID зарегистрированных протоколов являются:
Сейчас вы сможете испытать заменить GUID в файле PlatfromHiiAdvancedDxe GUID DellSetupAdvancedDxe и удалить крайний, но лучше отыскать, кто употребляет протокол с GUID из DellSetupAdvancedDxe и заменить уже в нем. Постучал в поиск:
Отыскать 2-ух экземпляров, один из которых мы уже знаем, а остальные — в драйвере SystemFormBrowserCoreDxe смещение 2C0h с самого начала. Осталось заменить и проверить.
На самом деле, могут быть ограничены в исследование текстового файла ИСО и подменой 1-го б в памяти NVRAM на права, но так я мог бы вернуть оригинальное меню — так тому и быть. Остальные поставщики могут быть различными, так что не воспринимайте этот пост как всепригодное управление. Некие, естественно, лучше не трогать, некие остальные не работают, но основное — в конце концов-то вы сможете установить ограничение скорости PCIe порт 1, для которого я начал эти танцы с бубном. habrahabr.ru Тестирование и вывод
Сменные GUID отыскать, сохранить конфигурации, peremabiri пути и поставить на программера, потом зайти в UEFI Setup, открыть Расширенный и вуаля, начальные характеристики как на ладошки. Спасибо за внимание и фортуны в ваших модификаций.