+ //\r
+ // First check for encapsulated compressed firmware volumes\r
+ //\r
+ FileHeader = NULL;\r
+ do {\r
+ Status = FfsFindNextFile (EFI_FV_FILETYPE_FIRMWARE_VOLUME_IMAGE,\r
+ FwVolHeader, &FileHeader);\r
+ if (EFI_ERROR (Status)) {\r
+ break;\r
+ }\r
+ Status = FfsFindSectionData (EFI_SECTION_GUID_DEFINED, FileHeader,\r
+ &SectionData, &SectionDataSize);\r
+ if (EFI_ERROR (Status)) {\r
+ break;\r
+ }\r
+ Section = (EFI_COMMON_SECTION_HEADER *)(FileHeader + 1);\r
+ Status = ExtractGuidedSectionGetInfo (Section, &DstBufferSize,\r
+ &ScratchBufferSize, &SectionAttribute);\r
+ if (EFI_ERROR (Status)) {\r
+ break;\r
+ }\r
+\r
+ //\r
+ // Allocate scratch buffer\r
+ //\r
+ ScratchBuffer = (VOID *)(UINTN)AllocatePages (EFI_SIZE_TO_PAGES (ScratchBufferSize));\r
+ if (ScratchBuffer == NULL) {\r
+ return EFI_OUT_OF_RESOURCES;\r
+ }\r
+\r
+ //\r
+ // Allocate destination buffer, extra one page for adjustment\r
+ //\r
+ DstBuffer = (VOID *)(UINTN)AllocatePages (EFI_SIZE_TO_PAGES (DstBufferSize));\r
+ if (DstBuffer == NULL) {\r
+ return EFI_OUT_OF_RESOURCES;\r
+ }\r
+\r
+ //\r
+ // Call decompress function\r
+ //\r
+ Status = ExtractGuidedSectionDecode (Section, &DstBuffer, ScratchBuffer,\r
+ &AuthenticationStatus);\r
+ FreePages (ScratchBuffer, EFI_SIZE_TO_PAGES (ScratchBufferSize));\r
+ if (EFI_ERROR (Status)) {\r
+ goto FreeDstBuffer;\r
+ }\r
+\r
+ DEBUG ((DEBUG_INFO,\r
+ "Processing compressed firmware volume (AuthenticationStatus == %x)\n",\r
+ AuthenticationStatus));\r
+\r
+ Status = FindFfsSectionInSections (DstBuffer, DstBufferSize,\r
+ EFI_SECTION_FIRMWARE_VOLUME_IMAGE, &Section);\r
+ if (EFI_ERROR (Status)) {\r
+ goto FreeDstBuffer;\r
+ }\r
+\r
+ InnerFvHeader = (VOID *)(Section + 1);\r
+ Status = MmCoreFfsFindMmDriver (InnerFvHeader);\r
+ if (EFI_ERROR (Status)) {\r
+ goto FreeDstBuffer;\r
+ }\r
+ } while (TRUE);\r
+\r