ProtocolsPerHandle返回协议但OpenProtocol返回NULL的问题求助
问题分析与修复方案
核心问题
你的代码存在两个关键错误,导致调用OpenProtocol后protocol始终为NULL:
1. 传递错误的句柄类型
OpenProtocol的第一个参数要求传入**EFI_HANDLE类型的实际值**,但你传递的是EFI_HANDLE*类型的指针(current_handle是&handle_buffer[current_page],即指向句柄的指针)。这会导致函数无法正确识别目标句柄,自然无法获取协议接口。
2. 未检查函数返回状态
你没有捕获OpenProtocol的返回值,无法判断调用是否成功(比如权限不足、句柄无效等错误都会直接导致协议指针为NULL)。
修复后的代码
if (CompareGuid(protocol_gui_buffer[j], &gEfiLoadedImageProtocolGuid)) { AsciiPrint("EFI_LOADED_IMAGE_PROTOCOL\n"); EFI_LOADED_IMAGE_PROTOCOL* protocol = NULL; EFI_STATUS status; // 修复:传递*current_handle(EFI_HANDLE实际值)而非指针 status = gBS->OpenProtocol( *current_handle, &gEfiLoadedImageProtocolGuid, (VOID**)&protocol, image_handle, NULL, EFI_OPEN_PROTOCOL_BY_HANDLE_PROTOCOL ); // 新增:检查返回状态,排查错误原因 if (EFI_ERROR(status)) { AsciiPrint("OpenProtocol failed: %r\n", status); } else if (protocol == NULL) { AsciiPrint("Protocol pointer is still NULL unexpectedly\n"); } else { // 成功获取协议后的业务逻辑 AsciiPrint("Successfully loaded EFI_LOADED_IMAGE_PROTOCOL\n"); } }
额外注意事项
- 确保
image_handle是当前驱动/应用程序的有效句柄(通常是入口函数传入的参数)。 - 使用
ProtocolsPerHandle获取protocol_gui_buffer后,记得调用gBS->FreePool(protocol_gui_buffer)释放内存,避免内存泄漏。 - 如果返回
EFI_ACCESS_DENIED,可能需要调整Attributes参数或确认AgentHandle的权限。
内容的提问来源于stack exchange,提问作者John Glen
相关产品推荐
相关产品推荐

