引用关于EFI_BOOT_SERVICES.HandleProtocol()的UEFI规范部分:


  HandleProtocol()函数仍然可供旧的EFI使用
  应用程序和驱动程序。但是,所有新的应用程序和驱动程序
  应该使用EFI_BOOT_SERVICES.OpenProtocol()代替
  HandleProtocol()。以下代码片段显示了可能的
  使用OpenProtocol()实现HandleProtocol()。变量
  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
           );
    }


报价结束。

我的问题是:当EFI应用程序由启动管理器或从UEFI Shell运行时,如何获取EfiCoreImageHandle的值?

最佳答案

简而言之,EfiCoreImageHandle只是规范中的占位符。看看如何在https://github.com/fpmurphy/UEFI-Utilities-2019OpenProtocol实用程序中调用ShowEDID

还要查看我当前使用ShowUSBHandleProtocol实用程序,即

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测试

10-04 13:50