使用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
相关产品推荐
相关产品推荐

