/** @file
  The Firmware Volume Protocol provides file-level access to the firmware volume.
  Each firmware volume driver must produce an instance of the
  Firmware Volume Protocol if the firmware volume is to be visible to
  the system during the DXE phase. The Firmware Volume Protocol also provides
  mechanisms for determining and modifying some attributes of the firmware volume.

  Copyright (c) 2006 - 2018, Intel Corporation. All rights reserved.<BR>
  SPDX-License-Identifier: BSD-2-Clause-Patent

  @par Revision Reference: PI
  Version 1.00.

**/

#ifndef __FIRMWARE_VOLUME2_H__
#define __FIRMWARE_VOLUME2_H__

#define EFI_FIRMWARE_VOLUME2_PROTOCOL_GUID \
  { 0x220e73b6, 0x6bdb, 0x4413, { 0x84, 0x5, 0xb9, 0x74, 0xb1, 0x8, 0x61, 0x9a } }

typedef struct _EFI_FIRMWARE_VOLUME2_PROTOCOL EFI_FIRMWARE_VOLUME2_PROTOCOL;


///
/// EFI_FV_ATTRIBUTES
///
typedef UINT64  EFI_FV_ATTRIBUTES;

//
// EFI_FV_ATTRIBUTES bit definitions
//
// EFI_FV_ATTRIBUTES bit semantics
#define EFI_FV2_READ_DISABLE_CAP        0x0000000000000001ULL
#define EFI_FV2_READ_ENABLE_CAP         0x0000000000000002ULL
#define EFI_FV2_READ_STATUS             0x0000000000000004ULL
#define EFI_FV2_WRITE_DISABLE_CAP       0x0000000000000008ULL
#define EFI_FV2_WRITE_ENABLE_CAP        0x0000000000000010ULL
#define EFI_FV2_WRITE_STATUS            0x0000000000000020ULL
#define EFI_FV2_LOCK_CAP                0x0000000000000040ULL
#define EFI_FV2_LOCK_STATUS             0x0000000000000080ULL
#define EFI_FV2_WRITE_POLICY_RELIABLE   0x0000000000000100ULL
#define EFI_FV2_READ_LOCK_CAP           0x0000000000001000ULL
#define EFI_FV2_READ_LOCK_STATUS        0x0000000000002000ULL
#define EFI_FV2_WRITE_LOCK_CAP          0x0000000000004000ULL
#define EFI_FV2_WRITE_LOCK_STATUS       0x0000000000008000ULL
#define EFI_FV2_ALIGNMENT               0x00000000001F0000ULL
#define EFI_FV2_ALIGNMENT_1             0x0000000000000000ULL
#define EFI_FV2_ALIGNMENT_2             0x0000000000010000ULL
#define EFI_FV2_ALIGNMENT_4             0x0000000000020000ULL
#define EFI_FV2_ALIGNMENT_8             0x0000000000030000ULL
#define EFI_FV2_ALIGNMENT_16            0x0000000000040000ULL
#define EFI_FV2_ALIGNMENT_32            0x0000000000050000ULL
#define EFI_FV2_ALIGNMENT_64            0x0000000000060000ULL
#define EFI_FV2_ALIGNMENT_128           0x0000000000070000ULL
#define EFI_FV2_ALIGNMENT_256           0x0000000000080000ULL
#define EFI_FV2_ALIGNMENT_512           0x0000000000090000ULL
#define EFI_FV2_ALIGNMENT_1K            0x00000000000A0000ULL
#define EFI_FV2_ALIGNMENT_2K            0x00000000000B0000ULL
#define EFI_FV2_ALIGNMENT_4K            0x00000000000C0000ULL
#define EFI_FV2_ALIGNMENT_8K            0x00000000000D0000ULL
#define EFI_FV2_ALIGNMENT_16K           0x00000000000E0000ULL
#define EFI_FV2_ALIGNMENT_32K           0x00000000000F0000ULL
#define EFI_FV2_ALIGNMENT_64K           0x0000000000100000ULL
#define EFI_FV2_ALIGNMENT_128K          0x0000000000110000ULL
#define EFI_FV2_ALIGNMENT_256K          0x0000000000120000ULL
#define EFI_FV2_ALIGNMENT_512K          0x0000000000130000ULL
#define EFI_FV2_ALIGNMENT_1M            0x0000000000140000ULL
#define EFI_FV2_ALIGNMENT_2M            0x0000000000150000ULL
#define EFI_FV2_ALIGNMENT_4M            0x0000000000160000ULL
#define EFI_FV2_ALIGNMENT_8M            0x0000000000170000ULL
#define EFI_FV2_ALIGNMENT_16M           0x0000000000180000ULL
#define EFI_FV2_ALIGNMENT_32M           0x0000000000190000ULL
#define EFI_FV2_ALIGNMENT_64M           0x00000000001A0000ULL
#define EFI_FV2_ALIGNMENT_128M          0x00000000001B0000ULL
#define EFI_FV2_ALIGNMENT_256M          0x00000000001C0000ULL
#define EFI_FV2_ALIGNMENT_512M          0x00000000001D0000ULL
#define EFI_FV2_ALIGNMENT_1G            0x00000000001E0000ULL
#define EFI_FV2_ALIGNMENT_2G            0x00000000001F0000ULL

/**
  Returns the attributes and current settings of the firmware volume.

  Because of constraints imposed by the underlying firmware
  storage, an instance of the Firmware Volume Protocol may not
  be to able to support all possible variations of this
  architecture. These constraints and the current state of the
  firmware volume are exposed to the caller using the
  GetVolumeAttributes() function. GetVolumeAttributes() is
  callable only from TPL_NOTIFY and below. Behavior of
  GetVolumeAttributes() at any EFI_TPL above TPL_NOTIFY is
  undefined.

  @param  This          Indicates the EFI_FIRMWARE_VOLUME2_PROTOCOL instance.

  @param  FvAttributes  Pointer to an EFI_FV_ATTRIBUTES in which
                        the attributes and current settings are
                        returned.


  @retval EFI_SUCCESS   The firmware volume attributes were
                        returned.

**/
typedef
EFI_STATUS
(EFIAPI * EFI_FV_GET_ATTRIBUTES)(
  IN CONST  EFI_FIRMWARE_VOLUME2_PROTOCOL *This,
  OUT       EFI_FV_ATTRIBUTES             *FvAttributes
);


/**
  Modifies the current settings of the firmware volume according to the input parameter.

  The SetVolumeAttributes() function is used to set configurable
  firmware volume attributes. Only EFI_FV_READ_STATUS,
  EFI_FV_WRITE_STATUS, and EFI_FV_LOCK_STATUS may be modified, and
   then only in accordance with the declared capabilities. All
  other bits of FvAttributes are ignored on input. On successful
  return, all bits of *FvAttributes are valid and it contains the
  completed EFI_FV_ATTRIBUTES for the volume. To modify an
  attribute, the corresponding status bit in the EFI_FV_ATTRIBUTES
  is set to the desired value on input. The EFI_FV_LOCK_STATUS bit
  does not affect the ability to read or write the firmware
  volume. Rather, once the EFI_FV_LOCK_STATUS bit is set, it
  prevents further modification to all the attribute bits.
  SetVolumeAttributes() is callable only from TPL_NOTIFY and
  below. Behavior of SetVolumeAttributes() at any EFI_TPL above
  TPL_NOTIFY is undefined.

  @param  This          Indicates the EFI_FIRMWARE_VOLUME2_PROTOCOL instance.

  @param  FvAttributes  On input, FvAttributes is a pointer to
                        an EFI_FV_ATTRIBUTES containing the
                        desired firmware volume settings. On
                        successful return, it contains the new
                        settings of the firmware volume. On
                        unsuccessful return, FvAttributes is not
                        modified and the firmware volume
                        settings are not changed.

  @retval EFI_SUCCESS           The requested firmware volume attributes
                                were set and the resulting
                                EFI_FV_ATTRIBUTES is returned in
                                FvAttributes.

  @retval EFI_INVALID_PARAMETER FvAttributes:EFI_FV_READ_STATUS
                                is set to 1 on input, but the
                                device does not support enabling
                                reads
                                (FvAttributes:EFI_FV_READ_ENABLE
                                is clear on return from
                                GetVolumeAttributes()). Actual
                                volume attributes are unchanged.

  @retval EFI_INVALID_PARAMETER FvAttributes:EFI_FV_READ_STATUS
                                is cleared to 0 on input, but
                                the device does not support
                                disabling reads
                                (FvAttributes:EFI_FV_READ_DISABL
                                is clear on return from
                                GetVolumeAttributes()). Actual
                                volume attributes are unchanged.

  @retval EFI_INVALID_PARAMETER FvAttributes:EFI_FV_WRITE_STATUS
                                is set to 1 on input, but the
                                device does not support enabling
                                writes
                                (FvAttributes:EFI_FV_WRITE_ENABL
                                is clear on return from
                                GetVolumeAttributes()). Actual
                                volume attributes are unchanged.

  @retval EFI_INVALID_PARAMETER FvAttributes:EFI_FV_WRITE_STATUS
                                is cleared to 0 on input, but
                                the device does not support
                                disabling writes
                                (FvAttributes:EFI_FV_WRITE_DISAB
                                is clear on return from
                                GetVolumeAttributes()). Actual
                                volume attributes are unchanged.

  @retval EFI_INVALID_PARAMETER FvAttributes:EFI_FV_LOCK_STATUS
                                is set on input, but the device
                                does not support locking
                                (FvAttributes:EFI_FV_LOCK_CAP is
                                clear on return from
                                GetVolumeAttributes()). Actual
                                volume attributes are unchanged.

  @retval EFI_ACCESS_DENIED     Device is locked and does not
                                allow attribute modification
                                (FvAttributes:EFI_FV_LOCK_STATUS
                                is set on return from
                                GetVolumeAttributes()). Actual
                                volume attributes are unchanged.

**/
typedef
EFI_STATUS
(EFIAPI * EFI_FV_SET_ATTRIBUTES)(
  IN CONST  EFI_FIRMWARE_VOLUME2_PROTOCOL *This,
  IN OUT    EFI_FV_ATTRIBUTES             *FvAttributes
);


/**
  Retrieves a file and/or file information from the firmware volume.

  ReadFile() is used to retrieve any file from a firmware volume
  during the DXE phase. The actual binary encoding of the file in
  the firmware volume media may be in any arbitrary format as long
  as it does the following: It is accessed using the Firmware
  Volume Protocol. The image that is returned follows the image
  format defined in Code Definitions: PI Firmware File Format.
  If the input value of Buffer==NULL, it indicates the caller is
  requesting only that the type, attributes, and size of the
  file be returned and that there is no output buffer. In this
  case, the following occurs:
  - BufferSize is returned with the size that is required to
    successfully complete the read.
  - The output parameters FoundType and *FileAttributes are
  returned with valid values.
  - The returned value of *AuthenticationStatus is undefined.

  If the input value of Buffer!=NULL, the output buffer is
  specified by a double indirection of the Buffer parameter. The
  input value of *Buffer is used to determine if the output
  buffer is caller allocated or is dynamically allocated by
  ReadFile(). If the input value of *Buffer!=NULL, it indicates
  the output buffer is caller allocated. In this case, the input
   value of *BufferSize indicates the size of the
  caller-allocated output buffer. If the output buffer is not
  large enough to contain the entire requested output, it is
  filled up to the point that the output buffer is exhausted and
  EFI_WARN_BUFFER_TOO_SMALL is returned, and then BufferSize is
   returned with the size required to successfully complete the
  read. All other output parameters are returned with valid
  values. If the input value of *Buffer==NULL, it indicates the
  output buffer is to be allocated by ReadFile(). In this case,
  ReadFile() will allocate an appropriately sized buffer from
  boot services pool memory, which will be returned in Buffer.
  The size of the new buffer is returned in BufferSize and all
  other output parameters are returned with valid values.
  ReadFile() is callable only from TPL_NOTIFY and below.
  Behavior of ReadFile() at any EFI_TPL above TPL_NOTIFY is
  undefined.

  @param  This                  Indicates the EFI_FIRMWARE_VOLUME2_PROTOCOL instance.

  @param  NameGuid              Pointer to an EFI_GUID, which is the file
                                name. All firmware file names are EFI_GUIDs.
                                A single firmware volume must not have two
                                valid files with the same file name
                                EFI_GUID.

  @param  Buffer                Pointer to a pointer to a buffer in which the
                                file contents are returned, not including the
                                file header.

  @param  BufferSize            Pointer to a caller-allocated UINTN. It
                                indicates the size of the memory
                                represented by Buffer.

  @param  FoundType             Pointer to a caller-allocated EFI_FV_FILETYPE.

  @param  FileAttributes        Pointer to a  caller-allocated
                                EFI_FV_FILE_ATTRIBUTES.

  @param  AuthenticationStatus  Pointer to a caller-allocated
                                UINT32 in which the
                                authentication status is
                                returned.

  @retval EFI_SUCCESS                 The call completed successfully.

  @retval EFI_WARN_BUFFER_TOO_SMALL   The buffer is too small to
                                      contain the requested
                                      output. The buffer is
                                      filled and the output is
                                      truncated.

  @retval EFI_OUT_OF_RESOURCES        An allocation failure occurred.

  @retval EFI_NOT_FOUND               Name was not found in the firmware volume.

  @retval EFI_DEVICE_ERROR            A hardware error occurred when
                                      attempting to access the firmware volume.

  @retval EFI_ACCESS_DENIED           The firmware volume is configured to
                                      disallow reads.

**/
typedef
EFI_STATUS
(EFIAPI * EFI_FV_READ_FILE)(
  IN CONST  EFI_FIRMWARE_VOLUME2_PROTOCOL *This,
  IN CONST  EFI_GUID                      *NameGuid,
  IN OUT    VOID                          **Buffer,
  IN OUT    UINTN                         *BufferSize,
  OUT       EFI_FV_FILETYPE               *FoundType,
  OUT       EFI_FV_FILE_ATTRIBUTES        *FileAttributes,
  OUT       UINT32                        *AuthenticationStatus
);



/**
  Locates the requested section within a file and returns it in a buffer.

  ReadSection() is used to retrieve a specific section from a file
  within a firmware volume. The section returned is determined
  using a depth-first, left-to-right search algorithm through all
  sections found in the specified file. The output buffer is specified by a double indirection
  of the Buffer parameter. The input value of Buffer is used to
  determine if the output buffer is caller allocated or is
  dynamically allocated by ReadSection(). If the input value of
  Buffer!=NULL, it indicates that the output buffer is caller
  allocated. In this case, the input value of *BufferSize
  indicates the size of the caller-allocated output buffer. If
  the output buffer is not large enough to contain the entire
  requested output, it is filled up to the point that the output
  buffer is exhausted and EFI_WARN_BUFFER_TOO_SMALL is returned,
  and then BufferSize is returned with the size that is required
  to successfully complete the read. All other
  output parameters are returned with valid values. If the input
  value of *Buffer==NULL, it indicates the output buffer is to
  be allocated by ReadSection(). In this case, ReadSection()
  will allocate an appropriately sized buffer from boot services
  pool memory, which will be returned in *Buffer. The size of
  the new buffer is returned in *BufferSize and all other output
  parameters are returned with valid values. ReadSection() is
  callable only from TPL_NOTIFY and below. Behavior of
  ReadSection() at any EFI_TPL above TPL_NOTIFY is
  undefined.

  @param  This                Indicates the EFI_FIRMWARE_VOLUME2_PROTOCOL instance.

  @param NameGuid             Pointer to an EFI_GUID, which indicates the
                              file name from which the requested section
                              will be read.

  @param SectionType          Indicates the section type to return.
                              SectionType in conjunction with
                              SectionInstance indicates which section to
                              return.

  @param SectionInstance      Indicates which instance of sections
                              with a type of SectionType to return.
                              SectionType in conjunction with
                              SectionInstance indicates which
                              section to return. SectionInstance is
                              zero based.

  @param Buffer               Pointer to a pointer to a buffer in which the
                              section contents are returned, not including
                              the section header.

  @param BufferSize           Pointer to a caller-allocated UINTN. It
                              indicates the size of the memory
                              represented by Buffer.

  @param AuthenticationStatus Pointer to a caller-allocated
                              UINT32 in which the authentication
                              status is returned.


  @retval EFI_SUCCESS   The call completed successfully.

  @retval EFI_WARN_BUFFER_TOO_SMALL   The caller-allocated
                                      buffer is too small to
                                      contain the requested
                                      output. The buffer is
                                      filled and the output is
                                      truncated.

  @retval EFI_OUT_OF_RESOURCES  An allocation failure occurred.

  @retval EFI_NOT_FOUND   The requested file was not found in
                          the firmware volume. EFI_NOT_FOUND The
                          requested section was not found in the
                          specified file.

  @retval EFI_DEVICE_ERROR  A hardware error occurred when
                            attempting to access the firmware
                            volume.

  @retval EFI_ACCESS_DENIED The firmware volume is configured to
                            disallow reads. EFI_PROTOCOL_ERROR
                            The requested section was not found,
                            but the file could not be fully
                            parsed because a required
                            GUIDED_SECTION_EXTRACTION_PROTOCOL
                            was not found. It is possible the
                            requested section exists within the
                            file and could be successfully
                            extracted once the required
                            GUIDED_SECTION_EXTRACTION_PROTOCOL
                            is published.

**/
typedef
EFI_STATUS
(EFIAPI * EFI_FV_READ_SECTION)(
  IN CONST  EFI_FIRMWARE_VOLUME2_PROTOCOL *This,
  IN CONST  EFI_GUID                      *NameGuid,
  IN        EFI_SECTION_TYPE              SectionType,
  IN        UINTN                         SectionInstance,
  IN OUT    VOID                          **Buffer,
  IN OUT    UINTN                         *BufferSize,
  OUT       UINT32                        *AuthenticationStatus
);

///
/// EFI_FV_WRITE_POLICY, two policies (unreliable write and reliable write) are defined.
///
typedef UINT32 EFI_FV_WRITE_POLICY;
#define EFI_FV_UNRELIABLE_WRITE   0x00000000
#define EFI_FV_RELIABLE_WRITE     0x00000001

//
// EFI_FV_WRITE_FILE_DATA
//
typedef struct {
  ///
  /// Pointer to a GUID, which is the file name to be written.
  ///
  EFI_GUID                *NameGuid;
  ///
  /// Indicates the type of file to be written.
  ///
  EFI_FV_FILETYPE         Type;
  ///
  /// Indicates the attributes for the file to be written.
  ///
  EFI_FV_FILE_ATTRIBUTES  FileAttributes;
  ///
  /// Pointer to a buffer containing the file to be written.
  ///
  VOID                    *Buffer;
  ///
  /// Indicates the size of the file image contained in Buffer.
  ///
  UINT32                  BufferSize;
} EFI_FV_WRITE_FILE_DATA;

/**
  Locates the requested section within a file and returns it in a buffer.

  WriteFile() is used to write one or more files to a firmware
  volume. Each file to be written is described by an
  EFI_FV_WRITE_FILE_DATA structure. The caller must ensure that
  any required alignment for all files listed in the FileData
  array is compatible with the firmware volume. Firmware volume
  capabilities can be determined using the GetVolumeAttributes()
  call. Similarly, if the WritePolicy is set to
  EFI_FV_RELIABLE_WRITE, the caller must check the firmware volume
  capabilities to ensure EFI_FV_RELIABLE_WRITE is supported by the
  firmware volume. EFI_FV_UNRELIABLE_WRITE must always be
  supported. Writing a file with a size of zero
  (FileData[n].BufferSize == 0) deletes the file from the firmware
  volume if it exists. Deleting a file must be done one at a time.
  Deleting a file as part of a multiple file write is not allowed.
  Platform Initialization Specification VOLUME 3 Shared
  Architectural Elements 84 August 21, 2006 Version 1.0
  WriteFile() is callable only from TPL_NOTIFY and below.
  Behavior of WriteFile() at any EFI_TPL above TPL_NOTIFY is
  undefined.

  @param This           Indicates the EFI_FIRMWARE_VOLUME2_PROTOCOL instance.

  @param NumberOfFiles  Indicates the number of elements in the array pointed to by FileData

  @param WritePolicy    Indicates the level of reliability for the
                        write in the event of a power failure or
                        other system failure during the write
                        operation.

  @param FileData       Pointer to an array of
                        EFI_FV_WRITE_FILE_DATA. Each element of
                        FileData[] represents a file to be written.


  @retval EFI_SUCCESS             The write completed successfully.

  @retval EFI_OUT_OF_RESOURCES    The firmware volume does not
                                  have enough free space to
                                  storefile(s).

  @retval EFI_DEVICE_ERROR        A hardware error occurred when
                                  attempting to access the firmware volume.

  @retval EFI_WRITE_PROTECTED     The firmware volume is
                                  configured to disallow writes.

  @retval EFI_NOT_FOUND           A delete was requested, but the
                                  requested file was not found in the
                                  firmware volume.

  @retval EFI_INVALID_PARAMETER   A delete was requested with a
                                  multiple file write.

  @retval EFI_INVALID_PARAMETER   An unsupported WritePolicy was
                                  requested.

  @retval EFI_INVALID_PARAMETER   An unknown file type was
                                  specified.

  @retval EFI_INVALID_PARAMETER   A file system specific error
                                  has occurred.

**/
typedef
EFI_STATUS
(EFIAPI * EFI_FV_WRITE_FILE)(
  IN CONST  EFI_FIRMWARE_VOLUME2_PROTOCOL *This,
  IN        UINT32                        NumberOfFiles,
  IN        EFI_FV_WRITE_POLICY           WritePolicy,
  IN        EFI_FV_WRITE_FILE_DATA        *FileData
);


/**
  Retrieves information about the next file in the firmware volume store
  that matches the search criteria.

  GetNextFile() is the interface that is used to search a firmware
  volume for a particular file. It is called successively until
  the desired file is located or the function returns
   EFI_NOT_FOUND. To filter uninteresting files from the output,
  the type of file to search for may be specified in FileType. For
  example, if *FileType is EFI_FV_FILETYPE_DRIVER, only files of
  this type will be returned in the output. If *FileType is
  EFI_FV_FILETYPE_ALL, no filtering of file types is done. The Key
  parameter is used to indicate a starting point of the search. If
  the buffer *Key is completely initialized to zero, the search
  re-initialized and starts at the beginning. Subsequent calls to
  GetNextFile() must maintain the value of *Key returned by the
  immediately previous call. The actual contents of *Key are
  implementation specific and no semantic content is implied.
  GetNextFile() is callable only from TPL_NOTIFY and below.
  Behavior of GetNextFile() at any EFI_TPL above TPL_NOTIFY is
  undefined.

  @param This       Indicates the EFI_FIRMWARE_VOLUME2_PROTOCOL instance.

  @param Key        Pointer to a caller-allocated buffer that contains implementation-specific data that is
                    used to track where to begin the search for the next file. The size of the buffer must be
                    at least This->KeySize bytes long. To re-initialize the search and begin from the
                    beginning of the firmware volume, the entire buffer must be cleared to zero. Other
                    than clearing the buffer to initiate a new search, the caller must not modify the data in
                    the buffer between calls to GetNextFile().

  @param FileType   Pointer to a caller-allocated
                    EFI_FV_FILETYPE. The GetNextFile() API can
                    filter its search for files based on the
                    value of the FileType input. A *FileType
                    input of EFI_FV_FILETYPE_ALL causes
                    GetNextFile() to search for files of all
                    types. If a file is found, the file's type
                    is returned in FileType. *FileType is not
                    modified if no file is found.

  @param NameGuid   Pointer to a caller-allocated EFI_GUID. If a
                    matching file is found, the file's name is
                    returned in NameGuid. If no matching file is
                    found, *NameGuid is not modified.

  @param Attributes Pointer to a caller-allocated
                    EFI_FV_FILE_ATTRIBUTES. If a matching file
                    is found, the file's attributes are returned
                    in Attributes. If no matching file is found,
                    Attributes is not modified. Type
                    EFI_FV_FILE_ATTRIBUTES is defined in
                    ReadFile().

  @param Size       Pointer to a caller-allocated UINTN. If a
                    matching file is found, the file's size is
                    returned in *Size. If no matching file is found,
                    Size is not modified.

  @retval EFI_SUCCESS       The output parameters are filled with data
                            obtained from the first matching file that
                            was found.

  @retval FI_NOT_FOUND      No files of type FileType were found.


  @retval EFI_DEVICE_ERROR  A hardware error occurred when
                            attempting to access the firmware
                            volume.

  @retval EFI_ACCESS_DENIED The firmware volume is configured to
                            disallow reads.


**/
typedef
EFI_STATUS
(EFIAPI * EFI_FV_GET_NEXT_FILE)(
  IN CONST  EFI_FIRMWARE_VOLUME2_PROTOCOL *This,
  IN OUT    VOID                          *Key,
  IN OUT    EFI_FV_FILETYPE               *FileType,
  OUT       EFI_GUID                      *NameGuid,
  OUT       EFI_FV_FILE_ATTRIBUTES        *Attributes,
  OUT       UINTN                         *Size
);

/**
  Return information about a firmware volume.

  The GetInfo() function returns information of type
  InformationType for the requested firmware volume. If the volume
  does not support the requested information type, then
  EFI_UNSUPPORTED is returned. If the buffer is not large enough
  to hold the requested structure, EFI_BUFFER_TOO_SMALL is
  returned and the BufferSize is set to the size of buffer that is
  required to make the request. The information types defined by
  this specification are required information types that all file
  systems must support.

  @param This             A pointer to the EFI_FIRMWARE_VOLUME2_PROTOCOL
                          instance that is the file handle the requested
                          information is for.

  @param InformationType  The type identifier for the
                          information being requested.

  @param BufferSize       On input, the size of Buffer. On output,
                          the amount of data returned in Buffer. In
                          both cases, the size is measured in bytes.

  @param Buffer           A pointer to the data buffer to return. The
                          buffer's type is indicated by InformationType.


  @retval EFI_SUCCESS           The information was retrieved.

  @retval EFI_UNSUPPORTED       The InformationType is not known.

  @retval EFI_NO_MEDIA          The device has no medium.

  @retval EFI_DEVICE_ERROR      The device reported an error.

  @retval EFI_VOLUME_CORRUPTED  The file system structures are
                                corrupted.

  @retval EFI_BUFFER_TOO_SMALL  The BufferSize is too small to
                                read the current directory
                                entry. BufferSize has been
                                updated with the size needed to
                                complete the request.


**/
typedef
EFI_STATUS
(EFIAPI *EFI_FV_GET_INFO)(
  IN CONST  EFI_FIRMWARE_VOLUME2_PROTOCOL *This,
  IN CONST  EFI_GUID                      *InformationType,
  IN OUT    UINTN                         *BufferSize,
  OUT       VOID                          *Buffer
);


/**
  Sets information about a firmware volume.

  The SetInfo() function sets information of type InformationType
  on the requested firmware volume.


  @param This             A pointer to the EFI_FIRMWARE_VOLUME2_PROTOCOL
                          instance that is the file handle the information
                          is for.

  @param InformationType  The type identifier for the
                          information being set.

  @param BufferSize       The size, in bytes, of Buffer.

  @param Buffer           A pointer to the data buffer to write. The
                          buffer's type is indicated by InformationType.

  @retval EFI_SUCCESS           The information was set.

  @retval EFI_UNSUPPORTED       The InformationType is not known.

  @retval EFI_NO_MEDIA          The device has no medium.

  @retval EFI_DEVICE_ERROR      The device reported an error.

  @retval EFI_VOLUME_CORRUPTED  The file system structures are
                                corrupted.


  @retval EFI_WRITE_PROTECTED   The media is read only.

  @retval EFI_VOLUME_FULL       The volume is full.

  @retval EFI_BAD_BUFFER_SIZE   BufferSize is smaller than the
                                size of the type indicated by
                                InformationType.

**/
typedef
EFI_STATUS
(EFIAPI *EFI_FV_SET_INFO)(
  IN CONST  EFI_FIRMWARE_VOLUME2_PROTOCOL *This,
  IN CONST  EFI_GUID                      *InformationType,
  IN        UINTN                         BufferSize,
  IN CONST  VOID                          *Buffer
);


///
/// The Firmware Volume Protocol contains the file-level
/// abstraction to the firmware volume as well as some firmware
/// volume attribute reporting and configuration services. The
/// Firmware Volume Protocol is the interface used by all parts of
/// DXE that are not directly involved with managing the firmware
/// volume itself. This abstraction allows many varied types of
/// firmware volume implementations. A firmware volume may be a
/// flash device or it may be a file in the UEFI system partition,
/// for example. This level of firmware volume implementation
/// detail is not visible to the consumers of the Firmware Volume
/// Protocol.
///
struct _EFI_FIRMWARE_VOLUME2_PROTOCOL {
  EFI_FV_GET_ATTRIBUTES   GetVolumeAttributes;
  EFI_FV_SET_ATTRIBUTES   SetVolumeAttributes;
  EFI_FV_READ_FILE        ReadFile;
  EFI_FV_READ_SECTION     ReadSection;
  EFI_FV_WRITE_FILE       WriteFile;
  EFI_FV_GET_NEXT_FILE    GetNextFile;

  ///
  /// Data field that indicates the size in bytes
  /// of the Key input buffer for the
  /// GetNextFile() API.
  ///
  UINT32                  KeySize;

  ///
  /// Handle of the parent firmware volume.
  ///
  EFI_HANDLE              ParentHandle;
  EFI_FV_GET_INFO         GetInfo;
  EFI_FV_SET_INFO         SetInfo;
};


extern EFI_GUID gEfiFirmwareVolume2ProtocolGuid;

#endif
