Home | History | Annotate | Download | only in Protocol
      1 /** @file
      2   The Firmware Volume Protocol provides file-level access to the firmware volume.
      3   Each firmware volume driver must produce an instance of the
      4   Firmware Volume Protocol if the firmware volume is to be visible to
      5   the system during the DXE phase. The Firmware Volume Protocol also provides
      6   mechanisms for determining and modifying some attributes of the firmware volume.
      7 
      8   Copyright (c) 2006 - 2008, Intel Corporation. All rights reserved.<BR>
      9   This program and the accompanying materials
     10   are licensed and made available under the terms and conditions of the BSD License
     11   which accompanies this distribution.  The full text of the license may be found at
     12   http://opensource.org/licenses/bsd-license.php
     13 
     14   THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
     15   WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
     16 
     17   @par Revision Reference: PI
     18   Version 1.00.
     19 
     20 **/
     21 
     22 #ifndef __FIRMWARE_VOLUME2_H__
     23 #define __FIRMWARE_VOLUME2_H__
     24 
     25 #define EFI_FIRMWARE_VOLUME2_PROTOCOL_GUID \
     26   { 0x220e73b6, 0x6bdb, 0x4413, { 0x84, 0x5, 0xb9, 0x74, 0xb1, 0x8, 0x61, 0x9a } }
     27 
     28 typedef struct _EFI_FIRMWARE_VOLUME2_PROTOCOL EFI_FIRMWARE_VOLUME2_PROTOCOL;
     29 
     30 
     31 ///
     32 /// EFI_FV_ATTRIBUTES
     33 ///
     34 typedef UINT64  EFI_FV_ATTRIBUTES;
     35 
     36 //
     37 // EFI_FV_ATTRIBUTES bit definitions
     38 //
     39 // EFI_FV_ATTRIBUTES bit semantics
     40 #define EFI_FV2_READ_DISABLE_CAP        0x0000000000000001ULL
     41 #define EFI_FV2_READ_ENABLE_CAP         0x0000000000000002ULL
     42 #define EFI_FV2_READ_STATUS             0x0000000000000004ULL
     43 #define EFI_FV2_WRITE_DISABLE_CAP       0x0000000000000008ULL
     44 #define EFI_FV2_WRITE_ENABLE_CAP        0x0000000000000010ULL
     45 #define EFI_FV2_WRITE_STATUS            0x0000000000000020ULL
     46 #define EFI_FV2_LOCK_CAP                0x0000000000000040ULL
     47 #define EFI_FV2_LOCK_STATUS             0x0000000000000080ULL
     48 #define EFI_FV2_WRITE_POLICY_RELIABLE   0x0000000000000100ULL
     49 #define EFI_FV2_READ_LOCK_CAP           0x0000000000001000ULL
     50 #define EFI_FV2_READ_LOCK_STATUS        0x0000000000002000ULL
     51 #define EFI_FV2_WRITE_LOCK_CAP          0x0000000000004000ULL
     52 #define EFI_FV2_WRITE_LOCK_STATUS       0x0000000000008000ULL
     53 #define EFI_FV2_ALIGNMENT               0x00000000001F0000ULL
     54 #define EFI_FV2_ALIGNMENT_1             0x0000000000000000ULL
     55 #define EFI_FV2_ALIGNMENT_2             0x0000000000010000ULL
     56 #define EFI_FV2_ALIGNMENT_4             0x0000000000020000ULL
     57 #define EFI_FV2_ALIGNMENT_8             0x0000000000030000ULL
     58 #define EFI_FV2_ALIGNMENT_16            0x0000000000040000ULL
     59 #define EFI_FV2_ALIGNMENT_32            0x0000000000050000ULL
     60 #define EFI_FV2_ALIGNMENT_64            0x0000000000060000ULL
     61 #define EFI_FV2_ALIGNMENT_128           0x0000000000070000ULL
     62 #define EFI_FV2_ALIGNMENT_256           0x0000000000080000ULL
     63 #define EFI_FV2_ALIGNMENT_512           0x0000000000090000ULL
     64 #define EFI_FV2_ALIGNMENT_1K            0x00000000000A0000ULL
     65 #define EFI_FV2_ALIGNMENT_2K            0x00000000000B0000ULL
     66 #define EFI_FV2_ALIGNMENT_4K            0x00000000000C0000ULL
     67 #define EFI_FV2_ALIGNMENT_8K            0x00000000000D0000ULL
     68 #define EFI_FV2_ALIGNMENT_16K           0x00000000000E0000ULL
     69 #define EFI_FV2_ALIGNMENT_32K           0x00000000000F0000ULL
     70 #define EFI_FV2_ALIGNMENT_64K           0x0000000000100000ULL
     71 #define EFI_FV2_ALIGNMENT_128K          0x0000000000110000ULL
     72 #define EFI_FV2_ALIGNMENT_256K          0x0000000000120000ULL
     73 #define EFI_FV2_ALIGNMENT_512K          0x0000000000130000ULL
     74 #define EFI_FV2_ALIGNMENT_1M            0x0000000000140000ULL
     75 #define EFI_FV2_ALIGNMENT_2M            0x0000000000150000ULL
     76 #define EFI_FV2_ALIGNMENT_4M            0x0000000000160000ULL
     77 #define EFI_FV2_ALIGNMENT_8M            0x0000000000170000ULL
     78 #define EFI_FV2_ALIGNMENT_16M           0x0000000000180000ULL
     79 #define EFI_FV2_ALIGNMENT_32M           0x0000000000190000ULL
     80 #define EFI_FV2_ALIGNMENT_64M           0x00000000001A0000ULL
     81 #define EFI_FV2_ALIGNMENT_128M          0x00000000001B0000ULL
     82 #define EFI_FV2_ALIGNMENT_256M          0x00000000001C0000ULL
     83 #define EFI_FV2_ALIGNMENT_512M          0x00000000001D0000ULL
     84 #define EFI_FV2_ALIGNMENT_1G            0x00000000001E0000ULL
     85 #define EFI_FV2_ALIGNMENT_2G            0x00000000001F0000ULL
     86 
     87 /**
     88   Returns the attributes and current settings of the firmware volume.
     89 
     90   Because of constraints imposed by the underlying firmware
     91   storage, an instance of the Firmware Volume Protocol may not
     92   be to able to support all possible variations of this
     93   architecture. These constraints and the current state of the
     94   firmware volume are exposed to the caller using the
     95   GetVolumeAttributes() function. GetVolumeAttributes() is
     96   callable only from TPL_NOTIFY and below. Behavior of
     97   GetVolumeAttributes() at any EFI_TPL above TPL_NOTIFY is
     98   undefined.
     99 
    100   @param  This          Indicates the EFI_FIRMWARE_VOLUME2_PROTOCOL instance.
    101 
    102   @param  FvAttributes  Pointer to an EFI_FV_ATTRIBUTES in which
    103                         the attributes and current settings are
    104                         returned.
    105 
    106 
    107   @retval EFI_SUCCESS   The firmware volume attributes were
    108                         returned.
    109 
    110 **/
    111 typedef
    112 EFI_STATUS
    113 (EFIAPI * EFI_FV_GET_ATTRIBUTES)(
    114   IN CONST  EFI_FIRMWARE_VOLUME2_PROTOCOL *This,
    115   OUT       EFI_FV_ATTRIBUTES             *FvAttributes
    116 );
    117 
    118 
    119 /**
    120   Modifies the current settings of the firmware volume according to the input parameter.
    121 
    122   The SetVolumeAttributes() function is used to set configurable
    123   firmware volume attributes. Only EFI_FV_READ_STATUS,
    124   EFI_FV_WRITE_STATUS, and EFI_FV_LOCK_STATUS may be modified, and
    125    then only in accordance with the declared capabilities. All
    126   other bits of FvAttributes are ignored on input. On successful
    127   return, all bits of *FvAttributes are valid and it contains the
    128   completed EFI_FV_ATTRIBUTES for the volume. To modify an
    129   attribute, the corresponding status bit in the EFI_FV_ATTRIBUTES
    130   is set to the desired value on input. The EFI_FV_LOCK_STATUS bit
    131   does not affect the ability to read or write the firmware
    132   volume. Rather, once the EFI_FV_LOCK_STATUS bit is set, it
    133   prevents further modification to all the attribute bits.
    134   SetVolumeAttributes() is callable only from TPL_NOTIFY and
    135   below. Behavior of SetVolumeAttributes() at any EFI_TPL above
    136   TPL_NOTIFY is undefined.
    137 
    138   @param  This          Indicates the EFI_FIRMWARE_VOLUME2_PROTOCOL instance.
    139 
    140   @param  FvAttributes  On input, FvAttributes is a pointer to
    141                         an EFI_FV_ATTRIBUTES containing the
    142                         desired firmware volume settings. On
    143                         successful return, it contains the new
    144                         settings of the firmware volume. On
    145                         unsuccessful return, FvAttributes is not
    146                         modified and the firmware volume
    147                         settings are not changed.
    148 
    149   @retval EFI_SUCCESS           The requested firmware volume attributes
    150                                 were set and the resulting
    151                                 EFI_FV_ATTRIBUTES is returned in
    152                                 FvAttributes.
    153 
    154   @retval EFI_INVALID_PARAMETER FvAttributes:EFI_FV_READ_STATUS
    155                                 is set to 1 on input, but the
    156                                 device does not support enabling
    157                                 reads
    158                                 (FvAttributes:EFI_FV_READ_ENABLE
    159                                 is clear on return from
    160                                 GetVolumeAttributes()). Actual
    161                                 volume attributes are unchanged.
    162 
    163   @retval EFI_INVALID_PARAMETER FvAttributes:EFI_FV_READ_STATUS
    164                                 is cleared to 0 on input, but
    165                                 the device does not support
    166                                 disabling reads
    167                                 (FvAttributes:EFI_FV_READ_DISABL
    168                                 is clear on return from
    169                                 GetVolumeAttributes()). Actual
    170                                 volume attributes are unchanged.
    171 
    172   @retval EFI_INVALID_PARAMETER FvAttributes:EFI_FV_WRITE_STATUS
    173                                 is set to 1 on input, but the
    174                                 device does not support enabling
    175                                 writes
    176                                 (FvAttributes:EFI_FV_WRITE_ENABL
    177                                 is clear on return from
    178                                 GetVolumeAttributes()). Actual
    179                                 volume attributes are unchanged.
    180 
    181   @retval EFI_INVALID_PARAMETER FvAttributes:EFI_FV_WRITE_STATUS
    182                                 is cleared to 0 on input, but
    183                                 the device does not support
    184                                 disabling writes
    185                                 (FvAttributes:EFI_FV_WRITE_DISAB
    186                                 is clear on return from
    187                                 GetVolumeAttributes()). Actual
    188                                 volume attributes are unchanged.
    189 
    190   @retval EFI_INVALID_PARAMETER FvAttributes:EFI_FV_LOCK_STATUS
    191                                 is set on input, but the device
    192                                 does not support locking
    193                                 (FvAttributes:EFI_FV_LOCK_CAP is
    194                                 clear on return from
    195                                 GetVolumeAttributes()). Actual
    196                                 volume attributes are unchanged.
    197 
    198   @retval EFI_ACCESS_DENIED     Device is locked and does not
    199                                 allow attribute modification
    200                                 (FvAttributes:EFI_FV_LOCK_STATUS
    201                                 is set on return from
    202                                 GetVolumeAttributes()). Actual
    203                                 volume attributes are unchanged.
    204 
    205 **/
    206 typedef
    207 EFI_STATUS
    208 (EFIAPI * EFI_FV_SET_ATTRIBUTES)(
    209   IN CONST  EFI_FIRMWARE_VOLUME2_PROTOCOL *This,
    210   IN OUT    EFI_FV_ATTRIBUTES             *FvAttributes
    211 );
    212 
    213 
    214 /**
    215   Retrieves a file and/or file information from the firmware volume.
    216 
    217   ReadFile() is used to retrieve any file from a firmware volume
    218   during the DXE phase. The actual binary encoding of the file in
    219   the firmware volume media may be in any arbitrary format as long
    220   as it does the following: It is accessed using the Firmware
    221   Volume Protocol. The image that is returned follows the image
    222   format defined in Code Definitions: PI Firmware File Format.
    223   If the input value of Buffer==NULL, it indicates the caller is
    224   requesting only that the type, attributes, and size of the
    225   file be returned and that there is no output buffer. In this
    226   case, the following occurs:
    227   - BufferSize is returned with the size that is required to
    228     successfully complete the read.
    229   - The output parameters FoundType and *FileAttributes are
    230   returned with valid values.
    231   - The returned value of *AuthenticationStatus is undefined.
    232 
    233   If the input value of Buffer!=NULL, the output buffer is
    234   specified by a double indirection of the Buffer parameter. The
    235   input value of *Buffer is used to determine if the output
    236   buffer is caller allocated or is dynamically allocated by
    237   ReadFile(). If the input value of *Buffer!=NULL, it indicates
    238   the output buffer is caller allocated. In this case, the input
    239    value of *BufferSize indicates the size of the
    240   caller-allocated output buffer. If the output buffer is not
    241   large enough to contain the entire requested output, it is
    242   filled up to the point that the output buffer is exhausted and
    243   EFI_WARN_BUFFER_TOO_SMALL is returned, and then BufferSize is
    244    returned with the size required to successfully complete the
    245   read. All other output parameters are returned with valid
    246   values. If the input value of *Buffer==NULL, it indicates the
    247   output buffer is to be allocated by ReadFile(). In this case,
    248   ReadFile() will allocate an appropriately sized buffer from
    249   boot services pool memory, which will be returned in Buffer.
    250   The size of the new buffer is returned in BufferSize and all
    251   other output parameters are returned with valid values.
    252   ReadFile() is callable only from TPL_NOTIFY and below.
    253   Behavior of ReadFile() at any EFI_TPL above TPL_NOTIFY is
    254   undefined.
    255 
    256   @param  This                  Indicates the EFI_FIRMWARE_VOLUME2_PROTOCOL instance.
    257 
    258   @param  NameGuid              Pointer to an EFI_GUID, which is the file
    259                                 name. All firmware file names are EFI_GUIDs.
    260                                 A single firmware volume must not have two
    261                                 valid files with the same file name
    262                                 EFI_GUID.
    263 
    264   @param  Buffer                Pointer to a pointer to a buffer in which the
    265                                 file contents are returned, not including the
    266                                 file header.
    267 
    268   @param  BufferSize            Pointer to a caller-allocated UINTN. It
    269                                 indicates the size of the memory
    270                                 represented by Buffer.
    271 
    272   @param  FoundType             Pointer to a caller-allocated EFI_FV_FILETYPE.
    273 
    274   @param  FileAttributes        Pointer to a  caller-allocated
    275                                 EFI_FV_FILE_ATTRIBUTES.
    276 
    277   @param  AuthenticationStatus  Pointer to a caller-allocated
    278                                 UINT32 in which the
    279                                 authentication status is
    280                                 returned.
    281 
    282   @retval EFI_SUCCESS                 The call completed successfully.
    283 
    284   @retval EFI_WARN_BUFFER_TOO_SMALL   The buffer is too small to
    285                                       contain the requested
    286                                       output. The buffer is
    287                                       filled and the output is
    288                                       truncated.
    289 
    290   @retval EFI_OUT_OF_RESOURCES        An allocation failure occurred.
    291 
    292   @retval EFI_NOT_FOUND               Name was not found in the firmware volume.
    293 
    294   @retval EFI_DEVICE_ERROR            A hardware error occurred when
    295                                       attempting to access the firmware volume.
    296 
    297   @retval EFI_ACCESS_DENIED           The firmware volume is configured to
    298                                       disallow reads.
    299 
    300 **/
    301 typedef
    302 EFI_STATUS
    303 (EFIAPI * EFI_FV_READ_FILE)(
    304   IN CONST  EFI_FIRMWARE_VOLUME2_PROTOCOL *This,
    305   IN CONST  EFI_GUID                      *NameGuid,
    306   IN OUT    VOID                          **Buffer,
    307   IN OUT    UINTN                         *BufferSize,
    308   OUT       EFI_FV_FILETYPE               *FoundType,
    309   OUT       EFI_FV_FILE_ATTRIBUTES        *FileAttributes,
    310   OUT       UINT32                        *AuthenticationStatus
    311 );
    312 
    313 
    314 
    315 /**
    316   Locates the requested section within a file and returns it in a buffer.
    317 
    318   ReadSection() is used to retrieve a specific section from a file
    319   within a firmware volume. The section returned is determined
    320   using a depth-first, left-to-right search algorithm through all
    321   sections found in the specified file. The output buffer is specified by a double indirection
    322   of the Buffer parameter. The input value of Buffer is used to
    323   determine if the output buffer is caller allocated or is
    324   dynamically allocated by ReadSection(). If the input value of
    325   Buffer!=NULL, it indicates that the output buffer is caller
    326   allocated. In this case, the input value of *BufferSize
    327   indicates the size of the caller-allocated output buffer. If
    328   the output buffer is not large enough to contain the entire
    329   requested output, it is filled up to the point that the output
    330   buffer is exhausted and EFI_WARN_BUFFER_TOO_SMALL is returned,
    331   and then BufferSize is returned with the size that is required
    332   to successfully complete the read. All other
    333   output parameters are returned with valid values. If the input
    334   value of *Buffer==NULL, it indicates the output buffer is to
    335   be allocated by ReadSection(). In this case, ReadSection()
    336   will allocate an appropriately sized buffer from boot services
    337   pool memory, which will be returned in *Buffer. The size of
    338   the new buffer is returned in *BufferSize and all other output
    339   parameters are returned with valid values. ReadSection() is
    340   callable only from TPL_NOTIFY and below. Behavior of
    341   ReadSection() at any EFI_TPL above TPL_NOTIFY is
    342   undefined.
    343 
    344   @param  This                Indicates the EFI_FIRMWARE_VOLUME2_PROTOCOL instance.
    345 
    346   @param NameGuid             Pointer to an EFI_GUID, which indicates the
    347                               file name from which the requested section
    348                               will be read.
    349 
    350   @param SectionType          Indicates the section type to return.
    351                               SectionType in conjunction with
    352                               SectionInstance indicates which section to
    353                               return.
    354 
    355   @param SectionInstance      Indicates which instance of sections
    356                               with a type of SectionType to return.
    357                               SectionType in conjunction with
    358                               SectionInstance indicates which
    359                               section to return. SectionInstance is
    360                               zero based.
    361 
    362   @param Buffer               Pointer to a pointer to a buffer in which the
    363                               section contents are returned, not including
    364                               the section header.
    365 
    366   @param BufferSize           Pointer to a caller-allocated UINTN. It
    367                               indicates the size of the memory
    368                               represented by Buffer.
    369 
    370   @param AuthenticationStatus Pointer to a caller-allocated
    371                               UINT32 in which the authentication
    372                               status is returned.
    373 
    374 
    375   @retval EFI_SUCCESS   The call completed successfully.
    376 
    377   @retval EFI_WARN_BUFFER_TOO_SMALL   The caller-allocated
    378                                       buffer is too small to
    379                                       contain the requested
    380                                       output. The buffer is
    381                                       filled and the output is
    382                                       truncated.
    383 
    384   @retval EFI_OUT_OF_RESOURCES  An allocation failure occurred.
    385 
    386   @retval EFI_NOT_FOUND   The requested file was not found in
    387                           the firmware volume. EFI_NOT_FOUND The
    388                           requested section was not found in the
    389                           specified file.
    390 
    391   @retval EFI_DEVICE_ERROR  A hardware error occurred when
    392                             attempting to access the firmware
    393                             volume.
    394 
    395   @retval EFI_ACCESS_DENIED The firmware volume is configured to
    396                             disallow reads. EFI_PROTOCOL_ERROR
    397                             The requested section was not found,
    398                             but the file could not be fully
    399                             parsed because a required
    400                             GUIDED_SECTION_EXTRACTION_PROTOCOL
    401                             was not found. It is possible the
    402                             requested section exists within the
    403                             file and could be successfully
    404                             extracted once the required
    405                             GUIDED_SECTION_EXTRACTION_PROTOCOL
    406                             is published.
    407 
    408 **/
    409 typedef
    410 EFI_STATUS
    411 (EFIAPI * EFI_FV_READ_SECTION)(
    412   IN CONST  EFI_FIRMWARE_VOLUME2_PROTOCOL *This,
    413   IN CONST  EFI_GUID                      *NameGuid,
    414   IN        EFI_SECTION_TYPE              SectionType,
    415   IN        UINTN                         SectionInstance,
    416   IN OUT    VOID                          **Buffer,
    417   IN OUT    UINTN                         *BufferSize,
    418   OUT       UINT32                        *AuthenticationStatus
    419 );
    420 
    421 ///
    422 /// EFI_FV_WRITE_POLICY, two policies (unreliable write and reliable write) are defined.
    423 ///
    424 typedef UINT32 EFI_FV_WRITE_POLICY;
    425 #define EFI_FV_UNRELIABLE_WRITE   0x00000000
    426 #define EFI_FV_RELIABLE_WRITE     0x00000001
    427 
    428 //
    429 // EFI_FV_WRITE_FILE_DATA
    430 //
    431 typedef struct {
    432   ///
    433   /// Pointer to a GUID, which is the file name to be written.
    434   ///
    435   EFI_GUID                *NameGuid;
    436   ///
    437   /// Indicates the type of file to be written.
    438   ///
    439   EFI_FV_FILETYPE         Type;
    440   ///
    441   /// Indicates the attributes for the file to be written.
    442   ///
    443   EFI_FV_FILE_ATTRIBUTES  FileAttributes;
    444   ///
    445   /// Pointer to a buffer containing the file to be written.
    446   ///
    447   VOID                    *Buffer;
    448   ///
    449   /// Indicates the size of the file image contained in Buffer.
    450   ///
    451   UINT32                  BufferSize;
    452 } EFI_FV_WRITE_FILE_DATA;
    453 
    454 /**
    455   Locates the requested section within a file and returns it in a buffer.
    456 
    457   WriteFile() is used to write one or more files to a firmware
    458   volume. Each file to be written is described by an
    459   EFI_FV_WRITE_FILE_DATA structure. The caller must ensure that
    460   any required alignment for all files listed in the FileData
    461   array is compatible with the firmware volume. Firmware volume
    462   capabilities can be determined using the GetVolumeAttributes()
    463   call. Similarly, if the WritePolicy is set to
    464   EFI_FV_RELIABLE_WRITE, the caller must check the firmware volume
    465   capabilities to ensure EFI_FV_RELIABLE_WRITE is supported by the
    466   firmware volume. EFI_FV_UNRELIABLE_WRITE must always be
    467   supported. Writing a file with a size of zero
    468   (FileData[n].BufferSize == 0) deletes the file from the firmware
    469   volume if it exists. Deleting a file must be done one at a time.
    470   Deleting a file as part of a multiple file write is not allowed.
    471   Platform Initialization Specification VOLUME 3 Shared
    472   Architectural Elements 84 August 21, 2006 Version 1.0
    473   WriteFile() is callable only from TPL_NOTIFY and below.
    474   Behavior of WriteFile() at any EFI_TPL above TPL_NOTIFY is
    475   undefined.
    476 
    477   @param This           Indicates the EFI_FIRMWARE_VOLUME2_PROTOCOL instance.
    478 
    479   @param NumberOfFiles  Indicates the number of elements in the array pointed to by FileData
    480 
    481   @param WritePolicy    Indicates the level of reliability for the
    482                         write in the event of a power failure or
    483                         other system failure during the write
    484                         operation.
    485 
    486   @param FileData       Pointer to an array of
    487                         EFI_FV_WRITE_FILE_DATA. Each element of
    488                         FileData[] represents a file to be written.
    489 
    490 
    491   @retval EFI_SUCCESS             The write completed successfully.
    492 
    493   @retval EFI_OUT_OF_RESOURCES    The firmware volume does not
    494                                   have enough free space to
    495                                   storefile(s).
    496 
    497   @retval EFI_DEVICE_ERROR        A hardware error occurred when
    498                                   attempting to access the firmware volume.
    499 
    500   @retval EFI_WRITE_PROTECTED     The firmware volume is
    501                                   configured to disallow writes.
    502 
    503   @retval EFI_NOT_FOUND           A delete was requested, but the
    504                                   requested file was not found in the
    505                                   firmware volume.
    506 
    507   @retval EFI_INVALID_PARAMETER   A delete was requested with a
    508                                   multiple file write.
    509 
    510   @retval EFI_INVALID_PARAMETER   An unsupported WritePolicy was
    511                                   requested.
    512 
    513   @retval EFI_INVALID_PARAMETER   An unknown file type was
    514                                   specified.
    515 
    516   @retval EFI_INVALID_PARAMETER   A file system specific error
    517                                   has occurred.
    518 
    519 **/
    520 typedef
    521 EFI_STATUS
    522 (EFIAPI * EFI_FV_WRITE_FILE)(
    523   IN CONST  EFI_FIRMWARE_VOLUME2_PROTOCOL *This,
    524   IN        UINT32                        NumberOfFiles,
    525   IN        EFI_FV_WRITE_POLICY           WritePolicy,
    526   IN        EFI_FV_WRITE_FILE_DATA        *FileData
    527 );
    528 
    529 
    530 /**
    531   Retrieves information about the next file in the firmware volume store
    532   that matches the search criteria.
    533 
    534   GetNextFile() is the interface that is used to search a firmware
    535   volume for a particular file. It is called successively until
    536   the desired file is located or the function returns
    537    EFI_NOT_FOUND. To filter uninteresting files from the output,
    538   the type of file to search for may be specified in FileType. For
    539   example, if *FileType is EFI_FV_FILETYPE_DRIVER, only files of
    540   this type will be returned in the output. If *FileType is
    541   EFI_FV_FILETYPE_ALL, no filtering of file types is done. The Key
    542   parameter is used to indicate a starting point of the search. If
    543   the buffer *Key is completely initialized to zero, the search
    544   re-initialized and starts at the beginning. Subsequent calls to
    545   GetNextFile() must maintain the value of *Key returned by the
    546   immediately previous call. The actual contents of *Key are
    547   implementation specific and no semantic content is implied.
    548   GetNextFile() is callable only from TPL_NOTIFY and below.
    549   Behavior of GetNextFile() at any EFI_TPL above TPL_NOTIFY is
    550   undefined.
    551 
    552   @param This       Indicates the EFI_FIRMWARE_VOLUME2_PROTOCOL instance.
    553 
    554   @param Key        Pointer to a caller-allocated buffer that contains implementation-specific data that is
    555                     used to track where to begin the search for the next file. The size of the buffer must be
    556                     at least This->KeySize bytes long. To re-initialize the search and begin from the
    557                     beginning of the firmware volume, the entire buffer must be cleared to zero. Other
    558                     than clearing the buffer to initiate a new search, the caller must not modify the data in
    559                     the buffer between calls to GetNextFile().
    560 
    561   @param FileType   Pointer to a caller-allocated
    562                     EFI_FV_FILETYPE. The GetNextFile() API can
    563                     filter its search for files based on the
    564                     value of the FileType input. A *FileType
    565                     input of EFI_FV_FILETYPE_ALL causes
    566                     GetNextFile() to search for files of all
    567                     types. If a file is found, the file's type
    568                     is returned in FileType. *FileType is not
    569                     modified if no file is found.
    570 
    571   @param NameGuid   Pointer to a caller-allocated EFI_GUID. If a
    572                     matching file is found, the file's name is
    573                     returned in NameGuid. If no matching file is
    574                     found, *NameGuid is not modified.
    575 
    576   @param Attributes Pointer to a caller-allocated
    577                     EFI_FV_FILE_ATTRIBUTES. If a matching file
    578                     is found, the file's attributes are returned
    579                     in Attributes. If no matching file is found,
    580                     Attributes is not modified. Type
    581                     EFI_FV_FILE_ATTRIBUTES is defined in
    582                     ReadFile().
    583 
    584   @param Size       Pointer to a caller-allocated UINTN. If a
    585                     matching file is found, the file's size is
    586                     returned in *Size. If no matching file is found,
    587                     Size is not modified.
    588 
    589   @retval EFI_SUCCESS       The output parameters are filled with data
    590                             obtained from the first matching file that
    591                             was found.
    592 
    593   @retval FI_NOT_FOUND      No files of type FileType were found.
    594 
    595 
    596   @retval EFI_DEVICE_ERROR  A hardware error occurred when
    597                             attempting to access the firmware
    598                             volume.
    599 
    600   @retval EFI_ACCESS_DENIED The firmware volume is configured to
    601                             disallow reads.
    602 
    603 
    604 **/
    605 typedef
    606 EFI_STATUS
    607 (EFIAPI * EFI_FV_GET_NEXT_FILE)(
    608   IN CONST  EFI_FIRMWARE_VOLUME2_PROTOCOL *This,
    609   IN OUT    VOID                          *Key,
    610   IN OUT    EFI_FV_FILETYPE               *FileType,
    611   OUT       EFI_GUID                      *NameGuid,
    612   OUT       EFI_FV_FILE_ATTRIBUTES        *Attributes,
    613   OUT       UINTN                         *Size
    614 );
    615 
    616 /**
    617   Return information about a firmware volume.
    618 
    619   The GetInfo() function returns information of type
    620   InformationType for the requested firmware volume. If the volume
    621   does not support the requested information type, then
    622   EFI_UNSUPPORTED is returned. If the buffer is not large enough
    623   to hold the requested structure, EFI_BUFFER_TOO_SMALL is
    624   returned and the BufferSize is set to the size of buffer that is
    625   required to make the request. The information types defined by
    626   this specification are required information types that all file
    627   systems must support.
    628 
    629   @param This             A pointer to the EFI_FIRMWARE_VOLUME2_PROTOCOL
    630                           instance that is the file handle the requested
    631                           information is for.
    632 
    633   @param InformationType  The type identifier for the
    634                           information being requested.
    635 
    636   @param BufferSize       On input, the size of Buffer. On output,
    637                           the amount of data returned in Buffer. In
    638                           both cases, the size is measured in bytes.
    639 
    640   @param Buffer           A pointer to the data buffer to return. The
    641                           buffer's type is indicated by InformationType.
    642 
    643 
    644   @retval EFI_SUCCESS           The information was retrieved.
    645 
    646   @retval EFI_UNSUPPORTED       The InformationType is not known.
    647 
    648   @retval EFI_NO_MEDIA          The device has no medium.
    649 
    650   @retval EFI_DEVICE_ERROR      The device reported an error.
    651 
    652   @retval EFI_VOLUME_CORRUPTED  The file system structures are
    653                                 corrupted.
    654 
    655   @retval EFI_BUFFER_TOO_SMALL  The BufferSize is too small to
    656                                 read the current directory
    657                                 entry. BufferSize has been
    658                                 updated with the size needed to
    659                                 complete the request.
    660 
    661 
    662 **/
    663 typedef
    664 EFI_STATUS
    665 (EFIAPI *EFI_FV_GET_INFO)(
    666   IN CONST  EFI_FIRMWARE_VOLUME2_PROTOCOL *This,
    667   IN CONST  EFI_GUID                      *InformationType,
    668   IN OUT    UINTN                         *BufferSize,
    669   OUT       VOID                          *Buffer
    670 );
    671 
    672 
    673 /**
    674   Sets information about a firmware volume.
    675 
    676   The SetInfo() function sets information of type InformationType
    677   on the requested firmware volume.
    678 
    679 
    680   @param This             A pointer to the EFI_FIRMWARE_VOLUME2_PROTOCOL
    681                           instance that is the file handle the information
    682                           is for.
    683 
    684   @param InformationType  The type identifier for the
    685                           information being set.
    686 
    687   @param BufferSize       The size, in bytes, of Buffer.
    688 
    689   @param Buffer           A pointer to the data buffer to write. The
    690                           buffer's type is indicated by InformationType.
    691 
    692   @retval EFI_SUCCESS           The information was set.
    693 
    694   @retval EFI_UNSUPPORTED       The InformationType is not known.
    695 
    696   @retval EFI_NO_MEDIA          The device has no medium.
    697 
    698   @retval EFI_DEVICE_ERROR      The device reported an error.
    699 
    700   @retval EFI_VOLUME_CORRUPTED  The file system structures are
    701                                 corrupted.
    702 
    703 
    704   @retval EFI_WRITE_PROTECTED   The media is read only.
    705 
    706   @retval EFI_VOLUME_FULL       The volume is full.
    707 
    708   @retval EFI_BAD_BUFFER_SIZE   BufferSize is smaller than the
    709                                 size of the type indicated by
    710                                 InformationType.
    711 
    712 **/
    713 typedef
    714 EFI_STATUS
    715 (EFIAPI *EFI_FV_SET_INFO)(
    716   IN CONST  EFI_FIRMWARE_VOLUME2_PROTOCOL *This,
    717   IN CONST  EFI_GUID                      *InformationType,
    718   IN        UINTN                         BufferSize,
    719   IN CONST  VOID                          *Buffer
    720 );
    721 
    722 
    723 ///
    724 /// The Firmware Volume Protocol contains the file-level
    725 /// abstraction to the firmware volume as well as some firmware
    726 /// volume attribute reporting and configuration services. The
    727 /// Firmware Volume Protocol is the interface used by all parts of
    728 /// DXE that are not directly involved with managing the firmware
    729 /// volume itself. This abstraction allows many varied types of
    730 /// firmware volume implementations. A firmware volume may be a
    731 /// flash device or it may be a file in the UEFI system partition,
    732 /// for example. This level of firmware volume implementation
    733 /// detail is not visible to the consumers of the Firmware Volume
    734 /// Protocol.
    735 ///
    736 struct _EFI_FIRMWARE_VOLUME2_PROTOCOL {
    737   EFI_FV_GET_ATTRIBUTES   GetVolumeAttributes;
    738   EFI_FV_SET_ATTRIBUTES   SetVolumeAttributes;
    739   EFI_FV_READ_FILE        ReadFile;
    740   EFI_FV_READ_SECTION     ReadSection;
    741   EFI_FV_WRITE_FILE       WriteFile;
    742   EFI_FV_GET_NEXT_FILE    GetNextFile;
    743 
    744   ///
    745   /// Data field that indicates the size in bytes
    746   /// of the Key input buffer for the
    747   /// GetNextFile() API.
    748   ///
    749   UINT32                  KeySize;
    750 
    751   ///
    752   /// Handle of the parent firmware volume.
    753   ///
    754   EFI_HANDLE              ParentHandle;
    755   EFI_FV_GET_INFO         GetInfo;
    756   EFI_FV_SET_INFO         SetInfo;
    757 };
    758 
    759 
    760 extern EFI_GUID gEfiFirmwareVolume2ProtocolGuid;
    761 
    762 #endif
    763