summaryrefslogtreecommitdiff
path: root/MdePkg/Include/Protocol/FirmwareVolume2.h
diff options
context:
space:
mode:
authoryshang1 <yshang1@6f19259b-4bc3-4df7-8a09-765794883524>2007-06-19 10:12:02 +0000
committeryshang1 <yshang1@6f19259b-4bc3-4df7-8a09-765794883524>2007-06-19 10:12:02 +0000
commitd1f950002362305fcd4c30f108ef7b76679f5843 (patch)
tree7cf4fd91cedb0adf0cb570c5ae95b774a916630a /MdePkg/Include/Protocol/FirmwareVolume2.h
parent00edb2182b6203a037219c29317ab6362c78b422 (diff)
downloadedk2-d1f950002362305fcd4c30f108ef7b76679f5843.zip
edk2-d1f950002362305fcd4c30f108ef7b76679f5843.tar.gz
edk2-d1f950002362305fcd4c30f108ef7b76679f5843.tar.bz2
Checked in the Protocols introduced in UEFI/PI.
git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@2674 6f19259b-4bc3-4df7-8a09-765794883524
Diffstat (limited to 'MdePkg/Include/Protocol/FirmwareVolume2.h')
-rw-r--r--MdePkg/Include/Protocol/FirmwareVolume2.h787
1 files changed, 787 insertions, 0 deletions
diff --git a/MdePkg/Include/Protocol/FirmwareVolume2.h b/MdePkg/Include/Protocol/FirmwareVolume2.h
new file mode 100644
index 0000000..f154f73
--- /dev/null
+++ b/MdePkg/Include/Protocol/FirmwareVolume2.h
@@ -0,0 +1,787 @@
+/** @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 - 2007, Intel Corporation
+ All rights reserved. This program and the accompanying materials
+ are licensed and made available under the terms and conditions of the BSD License
+ which accompanies this distribution. The full text of the license may be found at
+ http://opensource.org/licenses/bsd-license.php
+
+ THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
+ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+
+ Module Name: FirmwareVolume2.h
+
+ @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
+
+/**
+
+ 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 EFI_TPL_NOTIFY and below. Behavior of
+ GetVolumeAttributes() at any EFI_TPL above EFI_TPL_NOTIFY is
+ undefined. Type EFI_TPL is defined in RaiseTPL() in the UEFI
+ 2.0 specification.
+
+ @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
+);
+
+
+/**
+ 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 EFI_TPL_NOTIFY and
+ below. Behavior of SetVolumeAttributes() at any EFI_TPL above
+ EFI_TPL_NOTIFY is undefined. Type EFI_TPL is defined in
+ RaiseTPL() in the UEFI 2.0 specification.
+
+
+ @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
+);
+
+
+/**
+ 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 EFI_TPL_NOTIFY and below.
+ Behavior of ReadFile() at any EFI_TPL above EFI_TPL_NOTIFY is
+ undefined. Type EFI_TPL is defined in RaiseTPL() in the UEFI
+ 2.0 specification.
+
+ @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.
+
+ @retavl 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
+ isallow 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
+);
+
+
+
+/**
+ 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. See
+ ????Firmware File Sections???? on page 9 for more details about
+ sections. 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 EFI_TPL_NOTIFY and below. Behavior of
+ ReadSection() at any EFI_TPL above EFI_TPL_NOTIFY is
+ undefined. Type EFI_TPL is defined in RaiseTPL() in the UEFI
+ 2.0 specification.
+
+
+ @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 CONST EFI_SECTION_TYPE SectionType,
+ IN CONST UINTN SectionInstance,
+ IN OUT VOID **Buffer,
+ IN OUT UINTN *BufferSize,
+ OUT UINT32 *AuthenticationStatus
+);
+
+//
+// EFI_FV_WRITE_POLICY
+//
+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 {
+ EFI_GUID *NameGuid;
+ EFI_FV_FILETYPE Type;
+ EFI_FV_FILE_ATTRIBUTES FileAttributes;
+ VOID *Buffer;
+ UINT32 BufferSize;
+} EFI_FV_WRITE_FILE_DATA;
+
+/**
+ 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 EFI_TPL_NOTIFY and below.
+ Behavior of WriteFile() at any EFI_TPL above EFI_TPL_NOTIFY is
+ undefined. Type EFI_TPL is defined in RaiseTPL() in the UEFI 2.0
+ specification.
+
+ @param This Indicates the EFI_FIRMWARE_VOLUME2_PROTOCOL
+ instance. 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 CONST UINT32 NumberOfFiles,
+ IN CONST EFI_FV_WRITE_POLICY WritePolicy,
+ IN CONST EFI_FV_WRITE_FILE_DATA *FileData
+);
+
+
+/**
+ 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 EFI_TPL_NOTIFY and below.
+ Behavior of GetNextFile() at any EFI_TPL above EFI_TPL_NOTIFY is
+ undefined. Type EFI_TPL is defined in RaiseTPL() in the UEFI 2.0
+ specification. Status Codes Returned
+
+
+ @param This Indicates the EFI_FIRMWARE_VOLUME2_PROTOCOL
+ instance. 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
+);
+
+/**
+ 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
+);
+
+
+/**
+
+ 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.
+
+ @param GetVolumeAttributes Retrieves volume capabilities
+ and current settings. See the
+ GetVolumeAttributes() function
+ description.
+
+ @param SetVolumeAttributes Modifies the current settings of
+ the firmware volume. See the
+ SetVolumeAttributes() function
+ description.
+
+ @param ReadFile Reads an entire file from the firmware
+ volume. See the ReadFile() function
+ description.
+
+ @param ReadSection Reads a single section from a file into
+ a buffer.
+
+ @param WriteFile Writes an entire file into the firmware
+ volume. See the WriteFile() function
+ description.
+
+ @param GetNextFile Provides service to allow searching the
+ firmware volume. See the GetNextFile()
+ function description.
+
+ @param KeySize Data field that indicates the size in bytes
+ of the Key input buffer for the
+ GetNextFile() API.
+
+ @param ParentHandle Handle of the parent firmware volume.
+ Type EFI_HANDLE is defined in
+ InstallProtocolInterface() in the UEFI
+ 2.0 specification.
+
+ @param GetInfo Gets the requested file or volume
+ information. See the GetInfo() function
+ description.
+ @param SetInfo Sets the requested file information. See the
+ SetInfo() function description.
+
+**/
+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;
+ UINT32 KeySize;
+ EFI_HANDLE ParentHandle;
+ EFI_FV_GET_INFO GetInfo;
+ EFI_FV_SET_INFO SetInfo;
+};
+
+
+extern EFI_GUID gEfiFirmwareVolume2ProtocolGuid;
+
+#endif