這篇File System 的重點在如何在EFI framwork 下使用File System
首先是Protocol
EFI_SHELL_INTERFACE *ShellInt;
Status = BS->HandleProtocol (
ImageHandle,
&ShellInterfaceProtocol,
&ShellInt);
這一個AP 下會掛載一個Shell protocol (可以用dh 看看)
typedef struct _EFI_SHELL_INTERFACE {
// Handle back to original image handle & image info
EFI_HANDLE ImageHandle;
EFI_LOADED_IMAGE_PROTOCOL *Info;
// Parsed arg list
CHAR16 **Argv;
UINTN Argc;
// Storage for file redirection args after parsing
CHAR16 **RedirArgv;
UINTN RedirArgc;
// A file style handle for console io
EFI_FILE_HANDLE StdIn;
EFI_FILE_HANDLE StdOut;
EFI_FILE_HANDLE StdErr;
} EFI_SHELL_INTERFACE;
主要要利用Argv , Argc 來抓我們從shell 直接input 的值
switch (ShellInt->Argc) {
case OneArgument:
.
.
case TwoArgument:
switch (SelectArgu(ShellInt->Argv[1]))
...
}
Access file 前需要先open volume :
EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *FsInt;
EFI_FILE *Fshandle;
Status = BS->LocateProtocol(
&gEfiSimpleFileSystemProtocolGuid,
NULL,
&FsInt);
Status = FsInt->OpenVolume(
FsInt,
&Fshandle);
Create, Open, Read, Write, Delete, Close a file
Create
Status = Fshandle->Open(
Fshandle,
&NewFshandle,
FileName,
EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE | EFI_FILE_MODE_CREATE,
EFI_FILE_ARCHIVE);
Open
Status = Fshandle->Open(
Fshandle,
&NewFshandle,
FileName,
EFI_FILE_MODE_READ,
EFI_FILE_ARCHIVE);
Read
先call open
後 call read
Status = Fshandle->Read(
NewFshandle,
&BufferSize,
Buffer);
Write
先call open
後 call write
Status = Fshandle->Write(
NewFshandle,
&BufferSize,
Buffer);
Delete
Status = Fshandle->Delete(NewFshandle);
Close
Status = Fshandle->Close(NewFshandle);
有open 一定要close
