Skip to content

文件打开及读写、定位

Protocol

  • Protocol/SimpleFileSystem.h

它可以让我们访问FAT文件系统,包括 FAT12/FAT16/FAT132

The SimpleFileSystem protocol is the programmatic access to the FAT (12,16,32) file system specified in UEFI 2.0. It can also be used to abstract a file
system other than FAT.

打开及使用详见 docs/boot/protocol/sfs.md

Overview

初始化"文件服务".

EFI_STATUS
InitializeFileServices ();

在默认情况下,第一个 Handle 是当前程序所在的设备Handle,所以打开的根目录应该是当前程序所在的文件系统的根目录.

打开文件

1
2
3
4
5
6
EFI_STATUS
FileOpen (
  IN      CHAR16             *Path,
  IN      UINT64             Mode,
     OUT  EFI_FILE_PROTOCOL  **File
  );

忽略 gFileProtocol->OpenAttributes <- 0.

1
2
3
#define O_READ   EFI_FILE_MODE_READ
#define O_WRITE  EFI_FILE_MODE_WRITE
#define O_CREATE EFI_FILE_MODE_CREATE

使之更好编码,多个Mode可以相或.

TODO: 文件的覆盖操作


文件读取

1
2
3
4
5
6
EFI_STATUS
FileRead (
  IN      EFI_FILE_PROTOCOL  *File,
     OUT  VOID               *Data,
  IN OUT  UINTN              *Size
  );

文件写入

1
2
3
4
5
6
EFI_STATUS
FileWrite (
  IN      EFI_FILE_PROTOCOL  *File,
  IN      VOID               *Buffer,
  IN OUT  UINTN              *Size
  );

在没有设置的情况下,从指针位置为0处开始覆写


EFI_STATUS FileFlush (EFI_FILE_PROTOCOL *File);

FileWrite 执行并不会马上就写入设备,而是先写入所谓的缓存.

Flushes all modified data associated with a file to a device.

此函数基于 EFI_FILE_PROTOCOL.Flush,EFI_FILE_PROTOCOL.Close 也会写入.


设置位置

1
2
3
4
5
EFI_STATUS
FileSetPosition (
  IN EFI_FILE_PROTOCOL    *File,
  IN UINT64               Position
  );

获取位置

1
2
3
4
UINT64
FileGetPosition (
  IN EFI_FILE_PROTOCOL *File
  );

所有封装基于gFileProtocol.

  • src/boot/SigmaBootPkg/File.c
  • src/include/boot/File.h