這篇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