Пример спецификации UEFI упоминает EfiCoreImageHandle. Как получить его? - PullRequest
0 голосов
/ 06 апреля 2019

Цитирование раздела спецификаций UEFI о EFI_BOOT_SERVICES.HandleProtocol ():

Функция HandleProtocol () по-прежнему доступна для использования старой EFI приложения и драйверы. Тем не менее, все новые приложения и драйверы следует использовать EFI_BOOT_SERVICES.OpenProtocol () вместо HandleProtocol (). Следующий фрагмент кода показывает возможные реализация HandleProtocol () с использованием OpenProtocol (). Переменная EfiCoreImageHandle - дескриптор изображения ядра EFI.

EFI_STATUS
HandleProtocol (
     IN EFI_HANDLE   Handle,
     IN EFI_GUID     *Protocol,
     OUT VOID        **Interface
     )
    {
     return OpenProtocol (
           Handle,
           Protocol,
           Interface,
           EfiCoreImageHandle,
           NULL,
           EFI_OPEN_PROTOCOL_BY_HANDLE_PROTOCOL
           );
    }

Конец цитаты.

У меня вопрос: как получить значение для EfiCoreImageHandle, когда приложение EFI запускалось менеджером загрузки или из оболочки UEFI?

1 Ответ

1 голос
/ 14 апреля 2019

Проще говоря, EfiCoreImageHandle - это просто заполнитель в спецификации. Посмотрите, как я вызываю OpenProtocol в утилите ShowEDID в https://github.com/fpmurphy/UEFI-Utilities-2019.

Также посмотрите на утилиту ShowUSB, где я сейчас использую HandleProtocol, т.е.

Status = gBS->HandleProtocol( HandleBuffer[Index],
                              &gEfiUsbIoProtocolGuid,
                              (VOID**)&UsbIo );

Я мог бы заменить вышеуказанный код на:

Status = gBS->OpenProtocol( HandleBuffer[Index],
                            &gEfiUsbIoProtocolGuid,
                            (VOID **)&UsbIo,
                            gImageHandle,
                            NULL,
                            EFI_OPEN_PROTOCOL_BY_HANDLE_PROTOCOL );

Протестировано с UDK2018 и Lenovo T480

...