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

使用GNU-EFI开发UEFI引导加载器时ReadFile返回Buffer异常求助

GNU-EFI UEFI引导加载器文件读取问题

我正在用GNU-EFI开发UEFI引导加载器,编写小型配置系统时,前期测试正常,但拆分文件后出现问题:File.c中的ReadFile函数无法正确返回Buffer,经检查Buffer内确实有内容,求解决。

File.c 代码

UINT8 *ReadFile(EFI_FILE_HANDLE Volume, CHAR16 *FileName) {

    // Declare variables
    EFI_STATUS Status;
    EFI_FILE_HANDLE FileHandle;
    UINT64 ReadSize;
    UINT8 *Buffer;

    // Open the file
    Status = uefi_call_wrapper(
        Volume->Open,
        5,
        Volume,
        &FileHandle,
        FileName,
        EFI_FILE_MODE_READ,
        EFI_FILE_READ_ONLY | EFI_FILE_HIDDEN | EFI_FILE_SYSTEM
    );
    if(EFI_ERROR(Status)) {
        Print(L"Could not open file! Reason: %r\n", Status);
    }

    // Read the contents of the file
    ReadSize = FileSize(FileHandle);
    Buffer = AllocatePool(ReadSize);

    Status = uefi_call_wrapper(
        FileHandle->Read,
        3,
        FileHandle,
        &ReadSize,
        Buffer
    );
    if(EFI_ERROR(Status)) {
        Print(L"Could not read file! Reason: %r\n", Status);
    }

    // Close the file
    Status = uefi_call_wrapper(
        FileHandle->Close,
        1,
        FileHandle
    );
    if(EFI_ERROR(Status)) {
        Print(L"Could not close file! Reason: %r\n", Status);
    }

    return Buffer;
}

Main.c 代码片段

UINT8 *Buffer = ReadFile(Volume, FileName);

Print(L"File content:\n%a\n", Buffer);

问题排查与解决建议

  • 确保函数声明跨文件可见:拆分文件后,Main.c必须能正确识别ReadFile的返回类型。如果没有头文件声明,编译器会默认将函数返回值视为int,导致指针被截断,出现返回错误。解决方法是创建File.h头文件,添加函数声明:

    #ifndef FILE_H
    #define FILE_H
    #include <efi.h>
    #include <efilib.h>
    
    UINT8 *ReadFile(EFI_FILE_HANDLE Volume, CHAR16 *FileName);
    #endif
    

    然后在File.c和Main.c中都包含#include "File.h"。

  • 处理字符串终止符问题:Print的%a格式符要求输入是以'\0'结尾的C风格字符串。如果读取的文件本身没有末尾的空字符,输出会出现乱码或异常。修改ReadFile,分配内存时多留一个字节,手动添加终止符:

    Buffer = AllocatePool(ReadSize + 1);
    // 读取文件后添加
    Buffer[ReadSize] = '\0';
    
  • 完善错误处理逻辑:当前代码在文件打开失败后仍继续执行后续操作,会导致使用无效的FileHandle,引发未定义行为。应在错误发生时直接返回NULL:

    if(EFI_ERROR(Status)) {
        Print(L"Could not open file! Reason: %r\n", Status);
        return NULL;
    }
    

    同理,文件读取失败时也应释放已分配的内存并返回NULL,避免内存泄漏。

内容的提问来源于stack exchange,提问作者Robin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 06:20:40