UEFI Shell下读取文件内容与大小的操作

原本以为用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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值