整体代码
EFI_STATUS EFIAPI UefiMain(IN EFI_HANDLE ImageHandle,IN EFI_SYSTEM_TABLE *SystemTable)
{
EFI_STATUS Status;
//EFI_SIMPLE_FILE_SYSTEM_PROTOCOL(简称 FileSystemIo)可以用来操作FAT文件系统
EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *SimpleFileSystem;
//LocateProtocol()函数找到第一个支持Protocol的设备句柄,并在参数interface中返回一个指向protocol interface的指针
Status = gBS->LocateProtocol(&gEfiSimpleFileSystemProtocolGuid,NULL,(void **)&SimpleFileSystem);
if (EFI_ERROR(Status))
{
return Status;
}
//创建EFI_FILE_PROTOCOL实例指针 Root用来获取根目录句柄
EFI_FILE_PROTOCOL *Root;
Status = SimpleFileSystem->OpenVolume(SimpleFileSystem,&Root);
//在得到该分区文件系统上的根目录EFI_FILE_PROTOCOL实例的指针后,就可以操作该分区上的文件
UINTN BufSize;
CHAR16 * Textbuf = (CHAR16 *)L"This is Test file";
EFI_FILE_PROTOCOL *FileHandle = 0;
//打开文件进行读写模式若有则打开进行写操作,无则创建
Status = Root->Open(Root,&FileHandle,(CHAR16* )L"test.txt",EFI_FILE_MODE_CREATE | EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE,0);
if(FileHandle && !EFI_ERROR(Status))
{
BufSize = StrLen(Textbuf) *2;
Print(L"BufSize = %d \n",BufSize);
Status = FileHandle->Write(FileHandle,&BufSize,Textbuf);
Status = FileHandle->Close(FileHandle);
}
//开始读操作
EFI_FILE_PROTOCOL *SystemFile = 0;
CHAR16 Buf[64];
BufSize = 64;
//打开根目录下的test.txt
Status = Root->Open(Root,&SystemFile,(CHAR16* )L"test.txt",EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE,0);
//读文件最多64字节
if(SystemFile && !EFI_ERROR(Status))
{
Status = SystemFile->Read(SystemFile,&BufSize,Buf);
Status = SystemFile->Close(SystemFile);
if(!EFI_ERROR(Status))
{
Buf[BufSize] = 0;
Print(L"%s\n",Buf);
}
}
return Status;
}
函数原型
EFI_STATUS
(EFIAPI *EFI_FILE_OPEN)(
IN EFI_FILE_PROTOCOL *This, //目录句柄
OUT EFI_FILE_PROTOCOL **NewHandle,//返回打开文件的句柄
IN CHAR16 *FileName, //文件名
IN UINT64 OpenMode, //读写创建模块
IN UINT64 Attributes //文件属性仅在产生文件时有效
);
文件打开模式
文件属性