UEFI原理与编程实践--文件操作

本文介绍了如何在UEFI环境中利用EFI_SIMPLE_FILE_SYSTEM_PROTOCOL操作FAT文件系统,包括如何获取根目录句柄、创建和读取文件的基本步骤。重点展示了Write和Read函数的实际应用示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文件操作主要挑一些重点的讲

UEFI内置了EFI_SIMPLE_FILE_SYSTEM_PROTOCOL用于操作FAT文件系统,通过该protocol中的OpenVolume,我们就可以获得FAT文件系统上的根目录句柄,目录句柄(FEI_FILE_PROTOCOL)包含了操作该目录里文件的文件操作接口

使用EFI_SIMPLE_FILE_SYSTEM_PROTOCOL

EFI_STATUS Status;
EFI_SIMPLE_FILE_SYSTEM_PROTOCOL   *SimpleFileSystem;
EFI_FILE_PROTOCOL *Root;


Status = gBS->LocateProtocol (
                  ByProtocol,
                  &gEfiSimpleFileSystemProtocolGuid,
                  NULL,
                  &SimpleFileSystem
                  );
if (EFI_ERROR(Status)){
  return Status;
}

Status = SimpleFileSystem->OpenVolume(SimpleFileSystem,&Root);

在得到该分区文件系统上的根目录EFI_FILE_PROTOCOL实例的指针后,就可以操作该分区上的文件

 用Write函数写文件

EFI_STATUS Status;

UINTN BufSize;

CHAR16 *Textbuf = (CHAR16*)L"this is test file\n";

EFI_FILE_PROTOCOL *FileHandle =0;

//创建新文件,如果文件已经存在,则打开

Status = Root->Open(Root,
                         &FileHandle,
                         (CHAR16)L"testfile.txt",
                         EFI_FILE_MODE_CREATE | EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE,
                          0);

if(FileHandle && !EFI_ERROR(Status)){
            BufSize = StrLen(Textbuf) *2;

Status = FileHandle->Write(
                FileHandle,&BufSize,Textbuf);

Status = FileHandle->Close (FileHandle);
}

用Read函数读文件

EFI_STATUS                      Status;
  EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *ptSFS;
  EFI_FILE_PROTOCOL               *ptRootFile;
  EFI_FILE_PROTOCOL               *ptFile;
  EFI_FILE_INFO                   *FileInfo;
  UINTN                           FileInfoSize;
  UINT8                           *Buffer;

 Status     = EFI_SUCCESS;
  ptRootFile = NULL;
  ptFile     = NULL;
  FileInfo   = NULL;
  HandleBuffer = NULL;	

 Status = ptSFS->OpenVolume(ptSFS, &ptRootFile);
      if (!EFI_ERROR (Status)) {
        Status = ptRootFile->Open(
                   ptRootFile, 
                   &ptFile, 
                   FileName,//你的文件名,带目录 
                   EFI_FILE_MODE_WRITE|EFI_FILE_MODE_READ,
                   0
                   );

 if (!EFI_ERROR (Status)) {
    FileInfo = NULL;
    FileInfoSize = 0;
    Status = ptFile->GetInfo (
                       ptFile,
                       &gEfiFileInfoGuid,
                       &FileInfoSize,
                       FileInfo
                       );
    if(Status == EFI_BUFFER_TOO_SMALL){
      FileInfo = AllocateZeroPool(FileInfoSize);
      if(FileInfo == NULL){
        Status = EFI_OUT_OF_RESOURCES;
      } else {
        Status = ptFile->GetInfo(
                           ptFile,
                           &gEfiFileInfoGuid,
                           &FileInfoSize,
                           FileInfo
                           );
      }
    }
  }

  Status = ptFile->Read(ptFile, &FileInfo->FileSize, Buffer);
  
ptFile->Close(ptFile);
ptRootFile->Close(ptRootFile);

 这个read函数运用和书籍上的不一样,这个BIOS实战再讲

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值