文件操作主要挑一些重点的讲
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实战再讲