引用关于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-2019的OpenProtocol
实用程序中调用ShowEDID
。
还要查看我当前使用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测试