+{\r
+ PEI_CORE_FV_HANDLE *CoreFvHandle;\r
+ \r
+ if ((FileHandle == NULL) || (FileInfo == NULL)) {\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+\r
+ //\r
+ // Retrieve the FirmwareVolume which the file resides in.\r
+ //\r
+ CoreFvHandle = FileHandleToVolume (FileHandle);\r
+ if ((CoreFvHandle == NULL) || (CoreFvHandle->FvPpi == NULL)) {\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+\r
+ return CoreFvHandle->FvPpi->GetFileInfo (CoreFvHandle->FvPpi, FileHandle, FileInfo);\r
+}\r
+\r
+/**\r
+ Returns information about a specific file.\r
+\r
+ @param FileHandle Handle of the file.\r
+ @param FileInfo Upon exit, points to the file's information.\r
+\r
+ @retval EFI_INVALID_PARAMETER If FileInfo is NULL.\r
+ @retval EFI_INVALID_PARAMETER If FileHandle does not represent a valid file.\r
+ @retval EFI_SUCCESS File information returned.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI \r
+PeiFfsGetFileInfo2 (\r
+ IN EFI_PEI_FILE_HANDLE FileHandle,\r
+ OUT EFI_FV_FILE_INFO2 *FileInfo\r
+ )\r
+{\r
+ PEI_CORE_FV_HANDLE *CoreFvHandle;\r
+ \r
+ if ((FileHandle == NULL) || (FileInfo == NULL)) {\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+\r
+ //\r
+ // Retrieve the FirmwareVolume which the file resides in.\r
+ //\r
+ CoreFvHandle = FileHandleToVolume (FileHandle);\r
+ if ((CoreFvHandle == NULL) || (CoreFvHandle->FvPpi == NULL)) {\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+\r
+ if ((CoreFvHandle->FvPpi->Signature == EFI_PEI_FIRMWARE_VOLUME_PPI_SIGNATURE) &&\r
+ (CoreFvHandle->FvPpi->Revision == EFI_PEI_FIRMWARE_VOLUME_PPI_REVISION)) {\r
+ return CoreFvHandle->FvPpi->GetFileInfo2 (CoreFvHandle->FvPpi, FileHandle, FileInfo);\r
+ }\r
+ //\r
+ // The old FvPpi doesn't support to return file info with authentication status,\r
+ // so return EFI_UNSUPPORTED.\r
+ //\r
+ return EFI_UNSUPPORTED;\r
+}\r
+\r
+/**\r
+ Returns information about the specified volume.\r
+\r
+ This function returns information about a specific firmware\r
+ volume, including its name, type, attributes, starting address\r
+ and size.\r
+\r
+ @param VolumeHandle Handle of the volume.\r
+ @param VolumeInfo Upon exit, points to the volume's information.\r
+\r
+ @retval EFI_SUCCESS Volume information returned.\r
+ @retval EFI_INVALID_PARAMETER If VolumeHandle does not represent a valid volume.\r
+ @retval EFI_INVALID_PARAMETER If VolumeHandle is NULL.\r
+ @retval EFI_SUCCESS Information successfully returned.\r
+ @retval EFI_INVALID_PARAMETER The volume designated by the VolumeHandle is not available.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI \r
+PeiFfsGetVolumeInfo (\r
+ IN EFI_PEI_FV_HANDLE VolumeHandle,\r
+ OUT EFI_FV_INFO *VolumeInfo\r
+ )\r
+{\r
+ PEI_CORE_FV_HANDLE *CoreHandle;\r
+ \r
+ if ((VolumeInfo == NULL) || (VolumeHandle == NULL)) {\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+ \r
+ CoreHandle = FvHandleToCoreHandle (VolumeHandle);\r
+ \r
+ if ((CoreHandle == NULL) || (CoreHandle->FvPpi == NULL)) {\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+ \r
+ return CoreHandle->FvPpi->GetVolumeInfo (CoreHandle->FvPpi, VolumeHandle, VolumeInfo);\r
+}\r
+\r
+/**\r
+ Find USED_SIZE FV_EXT_TYPE entry in FV extension header and get the FV used size.\r
+\r
+ @param[in] FvHeader Pointer to FV header.\r
+ @param[out] FvUsedSize Pointer to FV used size returned,\r
+ only valid if USED_SIZE FV_EXT_TYPE entry is found.\r
+ @param[out] EraseByte Pointer to erase byte returned,\r
+ only valid if USED_SIZE FV_EXT_TYPE entry is found.\r
+\r
+ @retval TRUE USED_SIZE FV_EXT_TYPE entry is found,\r
+ FV used size and erase byte are returned.\r
+ @retval FALSE No USED_SIZE FV_EXT_TYPE entry found.\r
+\r
+**/\r
+BOOLEAN\r
+GetFvUsedSize (\r
+ IN EFI_FIRMWARE_VOLUME_HEADER *FvHeader,\r
+ OUT UINT32 *FvUsedSize,\r
+ OUT UINT8 *EraseByte\r
+ )\r
+{\r
+ UINT16 ExtHeaderOffset;\r
+ EFI_FIRMWARE_VOLUME_EXT_HEADER *ExtHeader;\r
+ EFI_FIRMWARE_VOLUME_EXT_ENTRY *ExtEntryList;\r
+ EFI_FIRMWARE_VOLUME_EXT_ENTRY_USED_SIZE_TYPE *ExtEntryUsedSize;\r
+\r
+ ExtHeaderOffset = ReadUnaligned16 (&FvHeader->ExtHeaderOffset);\r
+ if (ExtHeaderOffset != 0) {\r
+ ExtHeader = (EFI_FIRMWARE_VOLUME_EXT_HEADER *) ((UINT8 *) FvHeader + ExtHeaderOffset);\r
+ ExtEntryList = (EFI_FIRMWARE_VOLUME_EXT_ENTRY *) (ExtHeader + 1);\r
+ while ((UINTN) ExtEntryList < ((UINTN) ExtHeader + ReadUnaligned32 (&ExtHeader->ExtHeaderSize))) {\r
+ if (ReadUnaligned16 (&ExtEntryList->ExtEntryType) == EFI_FV_EXT_TYPE_USED_SIZE_TYPE) {\r
+ //\r
+ // USED_SIZE FV_EXT_TYPE entry is found.\r
+ //\r
+ ExtEntryUsedSize = (EFI_FIRMWARE_VOLUME_EXT_ENTRY_USED_SIZE_TYPE *) ExtEntryList;\r
+ *FvUsedSize = ReadUnaligned32 (&ExtEntryUsedSize->UsedSize);\r
+ if ((ReadUnaligned32 (&FvHeader->Attributes) & EFI_FVB2_ERASE_POLARITY) != 0) {\r
+ *EraseByte = 0xFF;\r
+ } else {\r
+ *EraseByte = 0;\r
+ }\r
+ DEBUG ((\r
+ DEBUG_INFO,\r
+ "FV at 0x%x has 0x%x used size, and erase byte is 0x%02x\n",\r
+ FvHeader,\r
+ *FvUsedSize,\r
+ *EraseByte\r
+ ));\r
+ return TRUE;\r
+ }\r
+ ExtEntryList = (EFI_FIRMWARE_VOLUME_EXT_ENTRY *)\r
+ ((UINT8 *) ExtEntryList + ReadUnaligned16 (&ExtEntryList->ExtEntrySize));\r
+ }\r
+ }\r
+\r
+ //\r
+ // No USED_SIZE FV_EXT_TYPE entry found.\r
+ //\r
+ return FALSE;\r
+}\r
+\r
+/**\r
+ Get Fv image from the FV type file, then install FV INFO(2) ppi, Build FV hob.\r
+\r
+ @param PrivateData PeiCore's private data structure\r
+ @param ParentFvCoreHandle Pointer of EFI_CORE_FV_HANDLE to parent Fv image that contain this Fv image.\r
+ @param ParentFvFileHandle File handle of a Fv type file that contain this Fv image.\r
+\r
+ @retval EFI_NOT_FOUND FV image can't be found.\r
+ @retval EFI_SUCCESS Successfully to process it.\r
+ @retval EFI_OUT_OF_RESOURCES Can not allocate page when aligning FV image\r
+ @retval EFI_SECURITY_VIOLATION Image is illegal\r
+ @retval Others Can not find EFI_SECTION_FIRMWARE_VOLUME_IMAGE section\r
+ \r
+**/\r
+EFI_STATUS\r
+ProcessFvFile (\r
+ IN PEI_CORE_INSTANCE *PrivateData,\r
+ IN PEI_CORE_FV_HANDLE *ParentFvCoreHandle,\r
+ IN EFI_PEI_FILE_HANDLE ParentFvFileHandle\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ EFI_FV_INFO ParentFvImageInfo;\r
+ UINT32 FvAlignment;\r
+ VOID *NewFvBuffer;\r
+ EFI_PEI_HOB_POINTERS HobPtr;\r
+ EFI_PEI_FIRMWARE_VOLUME_PPI *ParentFvPpi;\r
+ EFI_PEI_FV_HANDLE ParentFvHandle;\r
+ EFI_FIRMWARE_VOLUME_HEADER *FvHeader;\r
+ EFI_FV_FILE_INFO FileInfo;\r
+ UINT64 FvLength;\r
+ UINT32 AuthenticationStatus;\r
+ UINT32 FvUsedSize;\r
+ UINT8 EraseByte;\r
+\r
+ //\r
+ // Check if this EFI_FV_FILETYPE_FIRMWARE_VOLUME_IMAGE file has already\r
+ // been extracted.\r
+ //\r
+ HobPtr.Raw = GetHobList ();\r
+ while ((HobPtr.Raw = GetNextHob (EFI_HOB_TYPE_FV2, HobPtr.Raw)) != NULL) {\r
+ if (CompareGuid (&(((EFI_FFS_FILE_HEADER *)ParentFvFileHandle)->Name), &HobPtr.FirmwareVolume2->FileName)) {\r
+ //\r
+ // this FILE has been dispatched, it will not be dispatched again.\r
+ //\r
+ DEBUG ((EFI_D_INFO, "FV file %p has been dispatched!\r\n", ParentFvFileHandle));\r
+ return EFI_SUCCESS;\r
+ }\r
+ HobPtr.Raw = GET_NEXT_HOB (HobPtr);\r
+ }\r
+\r
+ ParentFvHandle = ParentFvCoreHandle->FvHandle;\r
+ ParentFvPpi = ParentFvCoreHandle->FvPpi;\r
+ \r
+ //\r
+ // Find FvImage in FvFile\r
+ //\r
+ AuthenticationStatus = 0;\r
+ if ((ParentFvPpi->Signature == EFI_PEI_FIRMWARE_VOLUME_PPI_SIGNATURE) &&\r
+ (ParentFvPpi->Revision == EFI_PEI_FIRMWARE_VOLUME_PPI_REVISION)) {\r
+ Status = ParentFvPpi->FindSectionByType2 (\r
+ ParentFvPpi,\r
+ EFI_SECTION_FIRMWARE_VOLUME_IMAGE,\r
+ 0,\r
+ ParentFvFileHandle,\r
+ (VOID **)&FvHeader,\r
+ &AuthenticationStatus\r
+ );\r
+ } else {\r
+ Status = ParentFvPpi->FindSectionByType (\r
+ ParentFvPpi,\r
+ EFI_SECTION_FIRMWARE_VOLUME_IMAGE,\r
+ ParentFvFileHandle,\r
+ (VOID **)&FvHeader\r
+ );\r
+ }\r
+ if (EFI_ERROR (Status)) {\r
+ return Status;\r
+ }\r
+\r
+ Status = VerifyPeim (PrivateData, ParentFvHandle, ParentFvFileHandle, AuthenticationStatus);\r
+ if (Status == EFI_SECURITY_VIOLATION) {\r
+ return Status;\r
+ }\r
+\r
+ //\r
+ // If EFI_FVB2_WEAK_ALIGNMENT is set in the volume header then the first byte of the volume\r
+ // can be aligned on any power-of-two boundary. A weakly aligned volume can not be moved from\r
+ // its initial linked location and maintain its alignment.\r
+ //\r
+ if ((ReadUnaligned32 (&FvHeader->Attributes) & EFI_FVB2_WEAK_ALIGNMENT) != EFI_FVB2_WEAK_ALIGNMENT) {\r
+ //\r
+ // FvAlignment must be greater than or equal to 8 bytes of the minimum FFS alignment value.\r
+ //\r
+ FvAlignment = 1 << ((ReadUnaligned32 (&FvHeader->Attributes) & EFI_FVB2_ALIGNMENT) >> 16);\r
+ if (FvAlignment < 8) {\r
+ FvAlignment = 8;\r
+ }\r
+\r
+ DEBUG ((\r
+ DEBUG_INFO,\r
+ "%a() FV at 0x%x, FvAlignment required is 0x%x\n",\r
+ __FUNCTION__,\r
+ FvHeader,\r
+ FvAlignment\r
+ ));\r
+\r
+ //\r
+ // Check FvImage alignment.\r
+ //\r
+ if ((UINTN) FvHeader % FvAlignment != 0) {\r
+ FvLength = ReadUnaligned64 (&FvHeader->FvLength);\r
+ NewFvBuffer = AllocateAlignedPages (EFI_SIZE_TO_PAGES ((UINT32) FvLength), FvAlignment);\r
+ if (NewFvBuffer == NULL) {\r
+ return EFI_OUT_OF_RESOURCES;\r
+ }\r
+ if (GetFvUsedSize (FvHeader, &FvUsedSize, &EraseByte)) {\r
+ //\r
+ // Copy the used bytes and fill the rest with the erase value.\r
+ //\r
+ CopyMem (NewFvBuffer, FvHeader, (UINTN) FvUsedSize);\r
+ SetMem (\r
+ (UINT8 *) NewFvBuffer + FvUsedSize,\r
+ (UINTN) (FvLength - FvUsedSize),\r
+ EraseByte\r
+ );\r
+ } else {\r
+ CopyMem (NewFvBuffer, FvHeader, (UINTN) FvLength);\r
+ }\r
+ FvHeader = (EFI_FIRMWARE_VOLUME_HEADER*) NewFvBuffer;\r
+ }\r
+ }\r
+\r
+ Status = ParentFvPpi->GetVolumeInfo (ParentFvPpi, ParentFvHandle, &ParentFvImageInfo);\r
+ ASSERT_EFI_ERROR (Status);\r
+ \r
+ Status = ParentFvPpi->GetFileInfo (ParentFvPpi, ParentFvFileHandle, &FileInfo);\r
+ ASSERT_EFI_ERROR (Status);\r
+ \r
+ //\r
+ // Install FvInfo(2) Ppi\r
+ // NOTE: FvInfo2 must be installed before FvInfo so that recursive processing of encapsulated\r
+ // FVs inherit the proper AuthenticationStatus.\r
+ //\r
+ PeiServicesInstallFvInfo2Ppi(\r
+ &FvHeader->FileSystemGuid,\r
+ (VOID**)FvHeader,\r
+ (UINT32)FvHeader->FvLength,\r
+ &ParentFvImageInfo.FvName,\r
+ &FileInfo.FileName,\r
+ AuthenticationStatus\r
+ );\r
+\r
+ PeiServicesInstallFvInfoPpi (\r
+ &FvHeader->FileSystemGuid,\r
+ (VOID**) FvHeader,\r
+ (UINT32) FvHeader->FvLength,\r
+ &ParentFvImageInfo.FvName,\r
+ &FileInfo.FileName\r
+ );\r
+\r
+ //\r
+ // Inform the extracted FvImage to Fv HOB consumer phase, i.e. DXE phase\r
+ //\r
+ BuildFvHob (\r
+ (EFI_PHYSICAL_ADDRESS) (UINTN) FvHeader,\r
+ FvHeader->FvLength\r
+ );\r
+\r
+ //\r
+ // Makes the encapsulated volume show up in DXE phase to skip processing of\r
+ // encapsulated file again.\r
+ //\r
+ BuildFv2Hob (\r
+ (EFI_PHYSICAL_ADDRESS) (UINTN) FvHeader,\r
+ FvHeader->FvLength,\r
+ &ParentFvImageInfo.FvName,\r
+ &FileInfo.FileName\r
+ );\r
+\r
+ //\r
+ // Build FV3 HOB with authentication status to be propagated to DXE.\r
+ //\r
+ BuildFv3Hob (\r
+ (EFI_PHYSICAL_ADDRESS) (UINTN) FvHeader,\r
+ FvHeader->FvLength,\r
+ AuthenticationStatus,\r
+ TRUE,\r
+ &ParentFvImageInfo.FvName,\r
+ &FileInfo.FileName\r
+ );\r
+\r
+ return EFI_SUCCESS;\r
+}\r
+\r
+/**\r
+ Process a firmware volume and create a volume handle.\r
+\r
+ Create a volume handle from the information in the buffer. For\r
+ memory-mapped firmware volumes, Buffer and BufferSize refer to\r
+ the start of the firmware volume and the firmware volume size.\r
+ For non memory-mapped firmware volumes, this points to a\r
+ buffer which contains the necessary information for creating\r
+ the firmware volume handle. Normally, these values are derived\r
+ from the EFI_FIRMWARE_VOLUME_INFO_PPI.\r
+ \r
+ \r
+ @param This Points to this instance of the\r
+ EFI_PEI_FIRMWARE_VOLUME_PPI.\r
+ @param Buffer Points to the start of the buffer.\r
+ @param BufferSize Size of the buffer.\r
+ @param FvHandle Points to the returned firmware volume\r
+ handle. The firmware volume handle must\r
+ be unique within the system. \r
+\r
+ @retval EFI_SUCCESS Firmware volume handle created.\r
+ @retval EFI_VOLUME_CORRUPTED Volume was corrupt.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+PeiFfsFvPpiProcessVolume (\r
+ IN CONST EFI_PEI_FIRMWARE_VOLUME_PPI *This,\r
+ IN VOID *Buffer,\r
+ IN UINTN BufferSize,\r
+ OUT EFI_PEI_FV_HANDLE *FvHandle\r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ \r
+ ASSERT (FvHandle != NULL);\r
+ \r
+ if (Buffer == NULL) {\r
+ return EFI_VOLUME_CORRUPTED;\r
+ }\r
+ \r
+ //\r
+ // The build-in EFI_PEI_FIRMWARE_VOLUME_PPI for FFS2/FFS3 support memory-mapped\r
+ // FV image and the handle is pointed to Fv image's buffer.\r
+ //\r
+ *FvHandle = (EFI_PEI_FV_HANDLE) Buffer;\r
+ \r
+ //\r
+ // Do verify for given FV buffer.\r
+ //\r
+ Status = VerifyFv ((EFI_FIRMWARE_VOLUME_HEADER*) Buffer);\r
+ if (EFI_ERROR(Status)) {\r
+ DEBUG ((EFI_D_ERROR, "Fail to verify FV which address is 0x%11p", Buffer));\r
+ return EFI_VOLUME_CORRUPTED;\r
+ }\r
+\r
+ return EFI_SUCCESS;\r
+} \r
+\r
+/**\r
+ Finds the next file of the specified type.\r
+\r
+ This service enables PEI modules to discover additional firmware files. \r
+ The FileHandle must be unique within the system.\r
+\r
+ @param This Points to this instance of the\r
+ EFI_PEI_FIRMWARE_VOLUME_PPI.\r
+ @param SearchType A filter to find only files of this type. Type\r
+ EFI_FV_FILETYPE_ALL causes no filtering to be\r
+ done.\r
+ @param FvHandle Handle of firmware volume in which to\r
+ search.\r
+ @param FileHandle Points to the current handle from which to\r
+ begin searching or NULL to start at the\r
+ beginning of the firmware volume. Updated\r
+ upon return to reflect the file found.\r
+\r
+ @retval EFI_SUCCESS The file was found.\r
+ @retval EFI_NOT_FOUND The file was not found. FileHandle contains NULL.\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+PeiFfsFvPpiFindFileByType (\r
+ IN CONST EFI_PEI_FIRMWARE_VOLUME_PPI *This,\r
+ IN EFI_FV_FILETYPE SearchType,\r
+ IN EFI_PEI_FV_HANDLE FvHandle,\r
+ IN OUT EFI_PEI_FILE_HANDLE *FileHandle\r
+ )\r
+{ \r
+ return FindFileEx (FvHandle, NULL, SearchType, FileHandle, NULL);\r
+}\r
+\r
+/**\r
+ Find a file within a volume by its name. \r
+ \r
+ This service searches for files with a specific name, within\r
+ either the specified firmware volume or all firmware volumes.\r
+\r
+ @param This Points to this instance of the\r
+ EFI_PEI_FIRMWARE_VOLUME_PPI.\r
+ @param FileName A pointer to the name of the file to find\r
+ within the firmware volume.\r
+ @param FvHandle Upon entry, the pointer to the firmware\r
+ volume to search or NULL if all firmware\r
+ volumes should be searched. Upon exit, the\r
+ actual firmware volume in which the file was\r
+ found.\r
+ @param FileHandle Upon exit, points to the found file's\r
+ handle or NULL if it could not be found.\r
+\r
+ @retval EFI_SUCCESS File was found.\r
+ @retval EFI_NOT_FOUND File was not found.\r
+ @retval EFI_INVALID_PARAMETER FvHandle or FileHandle or\r
+ FileName was NULL.\r
+\r
+\r
+**/\r
+EFI_STATUS\r
+EFIAPI\r
+PeiFfsFvPpiFindFileByName (\r
+ IN CONST EFI_PEI_FIRMWARE_VOLUME_PPI *This,\r
+ IN CONST EFI_GUID *FileName,\r
+ IN EFI_PEI_FV_HANDLE *FvHandle,\r
+ OUT EFI_PEI_FILE_HANDLE *FileHandle \r
+ )\r
+{\r
+ EFI_STATUS Status;\r
+ PEI_CORE_INSTANCE *PrivateData;\r
+ UINTN Index;\r
+ \r
+ if ((FvHandle == NULL) || (FileName == NULL) || (FileHandle == NULL)) {\r
+ return EFI_INVALID_PARAMETER;\r
+ }\r
+ \r
+ if (*FvHandle != NULL) {\r
+ Status = FindFileEx (*FvHandle, FileName, 0, FileHandle, NULL);\r
+ if (Status == EFI_NOT_FOUND) {\r
+ *FileHandle = NULL;\r
+ }\r
+ } else { \r
+ //\r
+ // If *FvHandle = NULL, so search all FV for given filename\r
+ //\r
+ Status = EFI_NOT_FOUND;\r
+ \r
+ PrivateData = PEI_CORE_INSTANCE_FROM_PS_THIS (GetPeiServicesTablePointer());\r
+ for (Index = 0; Index < PrivateData->FvCount; Index ++) {\r
+ //\r
+ // Only search the FV which is associated with a EFI_PEI_FIRMWARE_VOLUME_PPI instance.\r
+ //\r
+ if (PrivateData->Fv[Index].FvPpi != NULL) {\r
+ Status = FindFileEx (PrivateData->Fv[Index].FvHandle, FileName, 0, FileHandle, NULL);\r
+ if (!EFI_ERROR (Status)) {\r
+ *FvHandle = PrivateData->Fv[Index].FvHandle;\r
+ break;\r
+ }\r
+ }\r
+ }\r
+ }\r
+ \r
+ return Status; \r
+} \r
+\r
+/**\r
+ Returns information about a specific file.\r
+\r
+ This function returns information about a specific\r
+ file, including its file name, type, attributes, starting\r
+ address and size. \r
+ \r
+ @param This Points to this instance of the\r
+ EFI_PEI_FIRMWARE_VOLUME_PPI.\r
+ @param FileHandle Handle of the file.\r
+ @param FileInfo Upon exit, points to the file's\r
+ information.\r
+\r
+ @retval EFI_SUCCESS File information returned.\r
+ @retval EFI_INVALID_PARAMETER If FileHandle does not\r
+ represent a valid file.\r
+ @retval EFI_INVALID_PARAMETER If FileInfo is NULL.\r
+ \r
+**/ \r
+EFI_STATUS\r
+EFIAPI\r
+PeiFfsFvPpiGetFileInfo (\r
+ IN CONST EFI_PEI_FIRMWARE_VOLUME_PPI *This, \r
+ IN EFI_PEI_FILE_HANDLE FileHandle, \r
+ OUT EFI_FV_FILE_INFO *FileInfo\r
+ )\r