123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332 |
- /** @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
|