| /** @file | |
| Library functions that perform file IO. Memory buffer, file system, and | |
| firmware volume operations are supported. | |
| Copyright (c) 2007, Intel Corporation. All rights reserved.<BR> | |
| Portions copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR> | |
| SPDX-License-Identifier: BSD-2-Clause-Patent | |
| Basic support for opening files on different device types. The device string | |
| is in the form of DevType:Path. Current DevType is required as there is no | |
| current mounted device concept of current working directory concept implement | |
| by this library. | |
| Device names are case insensitive and only check the leading characters for | |
| unique matches. Thus the following are all the same: | |
| LoadFile0: | |
| l0: | |
| L0: | |
| Lo0: | |
| Supported Device Names: | |
| A0x1234:0x12 - A memory buffer starting at address 0x1234 for 0x12 bytes | |
| l1: - EFI LoadFile device one. | |
| B0: - EFI BlockIo zero. | |
| fs3: - EFI Simple File System device 3 | |
| Fv2: - EFI Firmware Volume device 2 | |
| 1.2.3.4:name - TFTP IP and file name | |
| **/ | |
| #ifndef __EFI_FILE_LIB_H__ | |
| #define __EFI_FILE_LIB_H__ | |
| #include <PiDxe.h> | |
| #include <Protocol/FirmwareVolume2.h> | |
| #include <Protocol/FirmwareVolumeBlock.h> | |
| #include <Protocol/BlockIo.h> | |
| #include <Protocol/LoadFile.h> | |
| #include <Protocol/LoadFile.h> | |
| #include <Protocol/SimpleFileSystem.h> | |
| #include <Guid/FileInfo.h> | |
| #include <Guid/FileSystemInfo.h> | |
| #define MAX_PATHNAME 0x200 | |
| /// Type of the file that has been opened | |
| typedef enum { | |
| EfiOpenLoadFile, | |
| EfiOpenMemoryBuffer, | |
| EfiOpenFirmwareVolume, | |
| EfiOpenFileSystem, | |
| EfiOpenBlockIo, | |
| EfiOpenTftp, | |
| EfiOpenMaxValue | |
| } EFI_OPEN_FILE_TYPE; | |
| /// Public information about the open file | |
| typedef struct { | |
| UINTN Version; // Common information | |
| EFI_OPEN_FILE_TYPE Type; | |
| EFI_DEVICE_PATH_PROTOCOL *DevicePath; | |
| EFI_STATUS LastError; | |
| EFI_HANDLE EfiHandle; | |
| CHAR8 *DeviceName; | |
| CHAR8 *FileName; | |
| UINT64 CurrentPosition; // Information for Seek | |
| UINT64 MaxPosition; | |
| UINTN BaseOffset; // Base offset for hexdump command | |
| UINTN Size; // Valid for all types other than l#: | |
| UINT8 *Buffer; // Information valid for A#: | |
| EFI_FIRMWARE_VOLUME2_PROTOCOL *Fv; // Information valid for Fv#: | |
| EFI_GUID FvNameGuid; | |
| EFI_SECTION_TYPE FvSectionType; | |
| EFI_FV_FILETYPE FvType; | |
| EFI_FV_FILE_ATTRIBUTES FvAttributes; | |
| EFI_PHYSICAL_ADDRESS FvStart; | |
| UINTN FvSize; | |
| UINTN FvHeaderSize; | |
| EFI_FILE *FsFileHandle; // Information valid for Fs#: | |
| EFI_FILE_SYSTEM_INFO *FsInfo; | |
| EFI_FILE_INFO *FsFileInfo; | |
| EFI_BLOCK_IO_MEDIA *FsBlockIoMedia; // Information valid for Fs#: or B#: | |
| EFI_BLOCK_IO_PROTOCOL *FsBlockIo; // Information valid for Fs#: or B#: | |
| UINTN DiskOffset; // Information valid for B#: | |
| EFI_LOAD_FILE_PROTOCOL *LoadFile; // Information valid for l#: | |
| EFI_IP_ADDRESS ServerIp; // Information valid for t: | |
| BOOLEAN IsDirty; | |
| BOOLEAN IsBufferValid; | |
| } EFI_OPEN_FILE; | |
| /// Type of Seek to perform | |
| typedef enum { | |
| EfiSeekStart, | |
| EfiSeekCurrent, | |
| EfiSeekEnd, | |
| EfiSeekMax | |
| } EFI_SEEK_TYPE; | |
| /** | |
| Open a device named by PathName. The PathName includes a device name and | |
| path separated by a :. See file header for more details on the PathName | |
| syntax. There is no checking to prevent a file from being opened more than | |
| one type. | |
| SectionType is only used to open an FV. Each file in an FV contains multiple | |
| sections and only the SectionType section is opened. | |
| For any file that is opened with EfiOpen() must be closed with EfiClose(). | |
| @param PathName Path to parse to open | |
| @param OpenMode Same as EFI_FILE.Open() | |
| @param SectionType Section in FV to open. | |
| @return NULL Open failed | |
| @return Valid EFI_OPEN_FILE handle | |
| **/ | |
| EFI_OPEN_FILE * | |
| EfiOpen ( | |
| IN CHAR8 *PathName, | |
| IN CONST UINT64 OpenMode, | |
| IN CONST EFI_SECTION_TYPE SectionType | |
| ); | |
| EFI_STATUS | |
| EfiCopyFile ( | |
| IN CHAR8 *DestinationFile, | |
| IN CHAR8 *SourceFile | |
| ); | |
| /** | |
| Use DeviceType and Index to form a valid PathName and try and open it. | |
| @param DeviceType Device type to open | |
| @param Index Device Index to use. Zero relative. | |
| @return NULL Open failed | |
| @return Valid EFI_OPEN_FILE handle | |
| **/ | |
| EFI_OPEN_FILE * | |
| EfiDeviceOpenByType ( | |
| IN EFI_OPEN_FILE_TYPE DeviceType, | |
| IN UINTN Index | |
| ); | |
| /** | |
| Close a file handle opened by EfiOpen() and free all resources allocated by | |
| EfiOpen(). | |
| @param Stream Open File Handle | |
| @return EFI_INVALID_PARAMETER Stream is not an Open File | |
| @return EFI_SUCCESS Steam closed | |
| **/ | |
| EFI_STATUS | |
| EfiClose ( | |
| IN EFI_OPEN_FILE *Stream | |
| ); | |
| /** | |
| Return the size of the file represented by Stream. Also return the current | |
| Seek position. Opening a file will enable a valid file size to be returned. | |
| LoadFile is an exception as a load file size is set to zero. | |
| @param Stream Open File Handle | |
| @return 0 Stream is not an Open File or a valid LoadFile handle | |
| **/ | |
| UINTN | |
| EfiTell ( | |
| IN EFI_OPEN_FILE *Stream, | |
| OUT UINT64 *CurrentPosition OPTIONAL | |
| ); | |
| /** | |
| Seek to the Offset location in the file. LoadFile and FV device types do | |
| not support EfiSeek(). It is not possible to grow the file size using | |
| EfiSeek(). | |
| SeekType defines how use Offset to calculate the new file position: | |
| EfiSeekStart : Position = Offset | |
| EfiSeekCurrent: Position is Offset bytes from the current position | |
| EfiSeekEnd : Only supported if Offset is zero to seek to end of file. | |
| @param Stream Open File Handle | |
| @param Offset Offset to seek too. | |
| @param SeekType Type of seek to perform | |
| @return EFI_INVALID_PARAMETER Stream is not an Open File | |
| @return EFI_UNSUPPORTED LoadFile and FV does not support Seek | |
| @return EFI_NOT_FOUND Seek past the end of the file. | |
| @return EFI_SUCCESS Steam closed | |
| **/ | |
| EFI_STATUS | |
| EfiSeek ( | |
| IN EFI_OPEN_FILE *Stream, | |
| IN EFI_LBA Offset, | |
| IN EFI_SEEK_TYPE SeekType | |
| ); | |
| /** | |
| Read BufferSize bytes from the current location in the file. For load file | |
| and FV case you must read the entire file. | |
| @param Stream Open File Handle | |
| @param Buffer Caller allocated buffer. | |
| @param BufferSize Size of buffer in bytes. | |
| @return EFI_SUCCESS Stream is not an Open File | |
| @return EFI_END_OF_FILE Tried to read past the end of the file | |
| @return EFI_INVALID_PARAMETER Stream is not an open file handle | |
| @return EFI_BUFFER_TOO_SMALL Buffer is not big enough to do the read | |
| @return "other" Error returned from device read | |
| **/ | |
| EFI_STATUS | |
| EfiRead ( | |
| IN EFI_OPEN_FILE *Stream, | |
| OUT VOID *Buffer, | |
| OUT UINTN *BufferSize | |
| ); | |
| /** | |
| Read the entire file into a buffer. This routine allocates the buffer and | |
| returns it to the user full of the read data. | |
| This is very useful for load file where it's hard to know how big the buffer | |
| must be. | |
| @param Stream Open File Handle | |
| @param Buffer Pointer to buffer to return. | |
| @param BufferSize Pointer to Size of buffer return.. | |
| @return EFI_SUCCESS Stream is not an Open File | |
| @return EFI_END_OF_FILE Tried to read past the end of the file | |
| @return EFI_INVALID_PARAMETER Stream is not an open file handle | |
| @return EFI_BUFFER_TOO_SMALL Buffer is not big enough to do the read | |
| @return "other" Error returned from device read | |
| **/ | |
| EFI_STATUS | |
| EfiReadAllocatePool ( | |
| IN EFI_OPEN_FILE *Stream, | |
| OUT VOID **Buffer, | |
| OUT UINTN *BufferSize | |
| ); | |
| /** | |
| Write data back to the file. | |
| @param Stream Open File Handle | |
| @param Buffer Pointer to buffer to return. | |
| @param BufferSize Pointer to Size of buffer return.. | |
| @return EFI_SUCCESS Stream is not an Open File | |
| @return EFI_END_OF_FILE Tried to read past the end of the file | |
| @return EFI_INVALID_PARAMETER Stream is not an open file handle | |
| @return EFI_BUFFER_TOO_SMALL Buffer is not big enough to do the read | |
| @return "other" Error returned from device write | |
| **/ | |
| EFI_STATUS | |
| EfiWrite ( | |
| IN EFI_OPEN_FILE *Stream, | |
| OUT VOID *Buffer, | |
| OUT UINTN *BufferSize | |
| ); | |
| /** | |
| Return the number of devices of the current type active in the system | |
| @param Type Device type to check | |
| @return 0 Invalid type | |
| **/ | |
| UINTN | |
| EfiGetDeviceCounts ( | |
| IN EFI_OPEN_FILE_TYPE Type | |
| ); | |
| /** | |
| Set the Current Working Directory (CWD). If a call is made to EfiOpen () and | |
| the path does not contain a device name, The CWD is prepended to the path. | |
| @param Cwd Current Working Directory to set | |
| @return EFI_SUCCESS CWD is set | |
| @return EFI_INVALID_PARAMETER Cwd is not a valid device:path | |
| **/ | |
| EFI_STATUS | |
| EfiSetCwd ( | |
| IN CHAR8 *Cwd | |
| ); | |
| /** | |
| Set the Current Working Directory (CWD). If a call is made to EfiOpen () and | |
| the path does not contain a device name, The CWD is prepended to the path. | |
| @param Cwd Current Working Directory | |
| @return NULL No CWD set | |
| @return 'other' malloc'ed buffer contains CWD. | |
| **/ | |
| CHAR8 * | |
| EfiGetCwd ( | |
| VOID | |
| ); | |
| #endif |