文件相关的协议

UEFI支持FAT文件系统。用于进行文件操作的协议是简单文件系统协议(Simple File System Protocol)EFI_SIMPLE_FILE_SYSTEM_PROTOCOL和文件协议(File Protocol)EFI_FILE_PROTOCOL(标准文档"12.4 Simple File System Protocol(P.494)"和"12.5 EFI File Protocol(P.497)")。

代码6.1展示了EFI_SIMPLE_FILE_SYSTEM_PROTOCOL的定义。

struct EFI_SIMPLE_FILE_SYSTEM_PROTOCOL {
    unsigned long long Revision;
    unsigned long long (*OpenVolume)(
        struct EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *This,
        struct EFI_FILE_PROTOCOL **Root);
};

代码6.1: EFI_SIMPLE_FILE_SYSTEM_PROTOCOL的定义

上面的代码EFI_SIMPLE_FILE_SYSTEM_PROTOCOL的完整定义,它只有一个函数OpenVolume。顾名思义,这个函数是用来打开一个卷的。“卷”这里可以理解成存储设备上的分区,相当于Windows中的X盘。其参数的定义如下:

  • struct EFI_FILE_PROTOCOL **Root: 指向所打开的卷的根目录的指针

UEFI通过结构体EFI_FILE_PROTOCOL来处理文件和目录,通过OpenVolume得到的根目录也是这个类型的。1代码6.2展示了它的定义(这里只展示书中要使用到的部分)。

struct EFI_FILE_PROTOCOL {
    unsigned long long _buf;
    unsigned long long (*Open)(struct EFI_FILE_PROTOCOL *This,
                   struct EFI_FILE_PROTOCOL **NewHandle,
                   unsigned short *FileName,
                   unsigned long long OpenMode,
                   unsigned long long Attributes);
    unsigned long long (*Close)(struct EFI_FILE_PROTOCOL *This);
    unsigned long long _buf2;
    unsigned long long (*Read)(struct EFI_FILE_PROTOCOL *This,
                   unsigned long long *BufferSize,
                   void *Buffer);
    unsigned long long (*Write)(struct EFI_FILE_PROTOCOL *This,
                    unsigned long long *BufferSize,
                    void *Buffer);
    unsigned long long _buf3[4];
    unsigned long long (*Flush)(struct EFI_FILE_PROTOCOL *This);
};

代码6.2: EFI_FILE_PROTOCOL的定义

关于其中各个函数的使用方法,我们将在本章接下来的小节中介绍。

1

译者注:这个结构体的作用类似于Unix的文件描述符和Windows的文件句柄,但是更加面向对象