原本以为用gEfiSimpleFileSystemProtocolGuid的方式就能打开本地的文件,最后发现,该方式有弊端,经常出现打不开的情况,那既然出问题,那我们就规避这个坑,直接用Shell自带的Protocol(gEfiShellProtocolGuid)
打开一个文件的Sample Code如下:
EFI_SHELL_PROTOCOL *Shell;
SHELL_FILE_HANDLE file = NULL;
UINT8 *Buffer = NULL;
EFI_STATUS Status = EFI_SUCCESS;
UINTN FileSize = 0;
CHAR16* fileName = NULL;
Status = gBS->LocateProtocol(&gEfiShellProtocolGuid, NULL, (VOID**)&Shell);
if (EFI_ERROR(Status)) {
Print(L"Cannot locate protocol: %d\n", Status);
return FALSE;
}
Status = Shell->OpenFileByName(fileName, &file, EFI_FILE_MODE_READ);
if (EFI_ERROR(Status)) {
Print(L"Open file %s failed\n", fileName);
return FALSE;
}
Status = Shell->GetFileSize(file, &FileSize);
if (EFI_ERROR(Status)) {
Print(L"Get file size failed: %d\n", Status);
return FALSE;
}
Print(L"Read %d bytes from %s\n", FileSize, fileName);
Buffer = AllocatePool(FileSize);
if (Buffer == NULL) {
Print(L"Allocate buffer failed\n");
Shell->CloseFile(file);
return FALSE;
}
// Initialize buffer to 0xFF
SetMem(Buffer, FileSize, 0xFF);
// Read file data into buffer
Status = Shell->ReadFile(file, &FileSize, Buffer);
if (EFI_ERROR(Status)) {
Print(L"Read file failed: %d\n", Status);
return FALSE;
}
Shell->CloseFile(file);
需要的头文件
#include <Uefi.h>
#include <Library/UefiLib.h>
#include <Library/DebugLib.h>
#include <Library/UefiBootServicesTableLib.h>
#include <Library/BaseLib.h>
#include <Library/BaseMemoryLib.h>
#include <Library/MemoryAllocationLib.h>
#include <Guid/FileInfo.h>
#include <Guid/FileSystemInfo.h>
#include <Guid/FileSystemVolumeLabelInfo.h>
#include <Protocol/SimpleFileSystem.h>
#include <Library/PrintLib.h>
#include <Library/ShellCEntryLib.h>
#include <Library/ShellLib.h>
需要的INF信息
[Packages]
MdePkg/MdePkg.dec
MdeModulePkg/MdeModulePkg.dec
ShellPkg/ShellPkg.dec
[LibraryClasses]
ShellCEntryLib
UefiLib
IoLib
BaseLib
UefiBootServicesTableLib
PrintLib
MemoryAllocationLib
[Protocols]
gEfiSimpleFileSystemProtocolGuid
gEfiShellProtocolGuid
[Guids]
gEfiFileInfoGuid
gEfiFileSystemInfoGuid
gEfiFileSystemVolumeLabelInfoIdGuid