You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 21:22:04