Это UEFI драйвер DXE стадии, логирующий события установки/удаления протоколов в системе, а также некоторые другие. Полезен, когда есть сторонний образ прошивки UEFI и нужно выяснить, какие протоколы он устанавливает и в какой момент.
Что логируется:
- Состояние системы на момент запуска драйвера:
- Загруженные исполняемые образы
- Установленные протоколы
- Загрузку исполняемых образов: какой образ когда и что загрузил
- Установку/удаление протоколов и информацию о хэндлах, на которые они были установлены
- Переход на BDS-стадию
Есть две реализации перехвата событий:
- Через RegisterProtocolNotify() для всех заранее известных протоколов и только для них
- Через модификацию gBS
Второй способ даёт больше информации, позволяет детектить установку ранее неизвестных протоколов, но он менее универсален и может не сработать на некоторых системах. Детект перехода на BDS-стадию работает только для второго способа, причём началом BDS стадии считается вызов EFI_BDS_ARCH_PROTOCOL->Entry().
Утилита использует автогенерируемый файл известных протоколов и для них указывает в логе имя протокола, а не его GUID. Для неизвестных указывается GUID.
Утилита в процессе доработки.
Как и для любого UEFI драйвера, есть несколько способов его загрузить:
- Загрузить вручную из UEFI Shell
- Загрузить через UEFI-переменные
- Встроить в образ, например, при помощи UEFITool
Основным способом работы является последний. Вообще, чем раньше стартует драйвер тем больше полезной информации он собирает. Драйвер копит информацию и как только находит в системе диск с файлом log.txt в его корне, начинает писать в этот файл лог. Лог дописывается после каждого события, что может существенно замедлять загрузку системы; это сделано чтобы не потерять содержимое лога, если системная прошивка внезапно перезагрузит машину. Можно создать такой файл на флешке и вставить её в конце загрузки (что ускорит загрузку), либо положить файл на один из постоянных дисков.
Настройки задаются в файле DxeLoadingLoggerPkg.dsc (либо через командную строку при запуске сборки):
- EVENT_PROVIDER_GST_HOOK
- TRUE: События собираются путём модификации gST.
- FALSE: События собираются посредством вызова RegisterProtocolNotify() для известных протоколов. Лучшая совместимость с прошивками, но даёт меньше информации.
- DETECT_BDS_STAGE_ENTRY
- Перехватывать переход на BDS-стадию или нет. Актуально только для EVENT_PROVIDER_GST_HOOK = TRUE, иначе ни на что не влияет.
- PRINT_EVENT_NUMBERS_TO_CONSOLE
- Выводить номера событий в консоль или нет. Полезно для сопоставления событий с тем, что выводит на экран системная прошивка.
- DEBUG_MACROS_OUTPUT_ON
- Если TRUE, то генерит подробный и длинный лог свой работы, чем очень сильно замедляет работу. Только для отладки.
- DEBUG_OUTPUT_TO_SERIAL
- TRUE: Отладочные события выводятся в COM-порт.
- FALSE: Отладочные события выводятся на экран.
Списки известных GUID протоколов взяты оттуда без изменений: https://github.com/yeggor/UEFI_RETool