]> git.proxmox.com Git - mirror_edk2.git/blobdiff - BaseTools/Source/C/VolInfo/VolInfo.c
UefiCpuPkg: Move AsmRelocateApLoopStart from Mpfuncs.nasm to AmdSev.nasm
[mirror_edk2.git] / BaseTools / Source / C / VolInfo / VolInfo.c
index 46c72123c87538f8457b4d8fd835c4a9a70edef1..428011ca046c5e1f7303fe5facb052e449be23ed 100644 (file)
@@ -1,14 +1,9 @@
 /** @file\r
 The tool dumps the contents of a firmware volume\r
 \r
-Copyright (c) 1999 - 2016, Intel Corporation. All rights reserved.<BR>\r
-This program and the accompanying materials\r
-are licensed and made available under the terms and conditions of the BSD License\r
-which accompanies this distribution.  The full text of the license may be found at\r
-http://opensource.org/licenses/bsd-license.php\r
-\r
-THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
-WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
+Copyright (c) 1999 - 2018, Intel Corporation. All rights reserved.<BR>\r
+Copyright (c) 2022, Konstantin Aladyshev <aladyshev22@gmail.com><BR>\r
+SPDX-License-Identifier: BSD-2-Clause-Patent\r
 \r
 **/\r
 \r
@@ -49,6 +44,8 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
 //\r
 \r
 EFI_GUID  gEfiCrc32GuidedSectionExtractionProtocolGuid = EFI_CRC32_GUIDED_SECTION_EXTRACTION_PROTOCOL_GUID;\r
+EFI_GUID  gPeiAprioriFileNameGuid = { 0x1b45cc0a, 0x156a, 0x428a, { 0XAF, 0x62,  0x49, 0x86, 0x4d, 0xa0, 0xe6, 0xe6 }};\r
+EFI_GUID  gAprioriGuid = { 0xFC510EE7, 0xFFDC, 0x11D4, { 0xBD, 0x41, 0x00, 0x80, 0xC7, 0x3C, 0x88, 0x81 }};\r
 \r
 #define UTILITY_MAJOR_VERSION      1\r
 #define UTILITY_MINOR_VERSION      0\r
@@ -57,15 +54,13 @@ EFI_GUID  gEfiCrc32GuidedSectionExtractionProtocolGuid = EFI_CRC32_GUIDED_SECTIO
 \r
 #define EFI_SECTION_ERROR EFIERR (100)\r
 \r
-#define MAX_BASENAME_LEN  60  // not good to hardcode, but let's be reasonable\r
-\r
 //\r
 // Structure to keep a list of guid-to-basenames\r
 //\r
 typedef struct _GUID_TO_BASENAME {\r
   struct _GUID_TO_BASENAME  *Next;\r
   INT8                      Guid[PRINTED_GUID_BUFFER_SIZE];\r
-  INT8                      BaseName[MAX_BASENAME_LEN];\r
+  INT8                      BaseName[MAX_LINE_LEN];\r
 } GUID_TO_BASENAME;\r
 \r
 static GUID_TO_BASENAME *mGuidBaseNameList = NULL;\r
@@ -115,6 +110,12 @@ ReadHeader (
   OUT BOOLEAN   *ErasePolarity\r
   );\r
 \r
+STATIC\r
+EFI_STATUS\r
+PrintAprioriFile (\r
+  EFI_FFS_FILE_HEADER         *FileHeader\r
+  );\r
+\r
 STATIC\r
 EFI_STATUS\r
 PrintFileInfo (\r
@@ -148,6 +149,65 @@ Usage (
   VOID\r
   );\r
 \r
+UINT32\r
+UnicodeStrLen (\r
+  IN CHAR16 *String\r
+  )\r
+  /*++\r
+\r
+  Routine Description:\r
+\r
+  Returns the length of a null-terminated unicode string.\r
+\r
+  Arguments:\r
+\r
+    String - The pointer to a null-terminated unicode string.\r
+\r
+  Returns:\r
+\r
+    N/A\r
+\r
+  --*/\r
+{\r
+  UINT32  Length;\r
+\r
+  for (Length = 0; *String != L'\0'; String++, Length++) {\r
+    ;\r
+  }\r
+  return Length;\r
+}\r
+\r
+VOID\r
+Unicode2AsciiString (\r
+  IN  CHAR16 *Source,\r
+  OUT CHAR8  *Destination\r
+  )\r
+  /*++\r
+\r
+  Routine Description:\r
+\r
+  Convert a null-terminated unicode string to a null-terminated ascii string.\r
+\r
+  Arguments:\r
+\r
+    Source      - The pointer to the null-terminated input unicode string.\r
+    Destination - The pointer to the null-terminated output ascii string.\r
+\r
+  Returns:\r
+\r
+    N/A\r
+\r
+  --*/\r
+{\r
+  while (*Source != '\0') {\r
+    *(Destination++) = (CHAR8) *(Source++);\r
+  }\r
+  //\r
+  // End the ascii with a NULL.\r
+  //\r
+  *Destination = '\0';\r
+}\r
+\r
 int\r
 main (\r
   int       argc,\r
@@ -272,7 +332,10 @@ Returns:
       if (OpenSslEnv == NULL) {\r
         OpenSslPath = OpenSslCommand;\r
       } else {\r
-        OpenSslPath = malloc(strlen(OpenSslEnv)+strlen(OpenSslCommand)+1);\r
+        //\r
+        // We add quotes to the Openssl Path in case it has space characters\r
+        //\r
+        OpenSslPath = malloc(2+strlen(OpenSslEnv)+strlen(OpenSslCommand)+1);\r
         if (OpenSslPath == NULL) {\r
           Error (NULL, 0, 4001, "Resource", "memory cannot be allocated!");\r
           return GetUtilityStatus ();\r
@@ -479,16 +542,16 @@ GetOccupiedSize (
 \r
 Routine Description:\r
 \r
-  This function returns the next larger size that meets the alignment \r
+  This function returns the next larger size that meets the alignment\r
   requirement specified.\r
 \r
 Arguments:\r
 \r
   ActualSize      The size.\r
   Alignment       The desired alignment.\r
-    \r
+\r
 Returns:\r
\r
+\r
   EFI_SUCCESS             Function completed successfully.\r
   EFI_ABORTED             The function encountered an error.\r
 \r
@@ -538,7 +601,7 @@ Returns:
     //\r
     // 0x02\r
     //\r
-    "EFI_SECTION_GUID_DEFINED",    \r
+    "EFI_SECTION_GUID_DEFINED",\r
     //\r
     // 0x03\r
     //\r
@@ -602,11 +665,11 @@ Returns:
     //\r
     // 0x12\r
     //\r
-    "EFI_SECTION_TE",    \r
+    "EFI_SECTION_TE",\r
     //\r
     // 0x13\r
     //\r
-    "EFI_SECTION_DXE_DEPEX", \r
+    "EFI_SECTION_DXE_DEPEX",\r
     //\r
     // 0x14\r
     //\r
@@ -622,11 +685,11 @@ Returns:
     //\r
     // 0x17\r
     //\r
-    "EFI_SECTION_FIRMWARE_VOLUME_IMAGE ",\r
+    "EFI_SECTION_FIRMWARE_VOLUME_IMAGE",\r
     //\r
     // 0x18\r
     //\r
-    "EFI_SECTION_FREEFORM_SUBTYPE_GUID ",\r
+    "EFI_SECTION_FREEFORM_SUBTYPE_GUID",\r
     //\r
     // 0x19\r
     //\r
@@ -642,7 +705,7 @@ Returns:
     //\r
     // 0x1C\r
     //\r
-    "EFI_SECTION_SMM_DEPEX",\r
+    "EFI_SECTION_MM_DEPEX",\r
     //\r
     // 0x1C+\r
     //\r
@@ -673,7 +736,7 @@ ReadHeader (
 \r
 Routine Description:\r
 \r
-  This function determines the size of the FV and the erase polarity.  The \r
+  This function determines the size of the FV and the erase polarity.  The\r
   erase polarity is the FALSE value for file state.\r
 \r
 Arguments:\r
@@ -681,9 +744,9 @@ Arguments:
   InputFile       The file that contains the FV image.\r
   FvSize          The size of the FV.\r
   ErasePolarity   The FV erase polarity.\r
-    \r
+\r
 Returns:\r
\r
+\r
   EFI_SUCCESS             Function completed successfully.\r
   EFI_INVALID_PARAMETER   A required parameter was NULL or is out of range.\r
   EFI_ABORTED             The function encountered an error.\r
@@ -695,6 +758,7 @@ Returns:
   UINTN                       Signature[2];\r
   UINTN                       BytesRead;\r
   UINT32                      Size;\r
+  size_t                      ReadSize;\r
 \r
   BytesRead = 0;\r
   Size      = 0;\r
@@ -708,7 +772,10 @@ Returns:
   //\r
   // Read the header\r
   //\r
-  fread (&VolumeHeader, sizeof (EFI_FIRMWARE_VOLUME_HEADER) - sizeof (EFI_FV_BLOCK_MAP_ENTRY), 1, InputFile);\r
+  ReadSize = fread (&VolumeHeader, sizeof (EFI_FIRMWARE_VOLUME_HEADER) - sizeof (EFI_FV_BLOCK_MAP_ENTRY), 1, InputFile);\r
+  if (ReadSize != 1) {\r
+    return EFI_ABORTED;\r
+  }\r
   BytesRead     = sizeof (EFI_FIRMWARE_VOLUME_HEADER) - sizeof (EFI_FV_BLOCK_MAP_ENTRY);\r
   Signature[0]  = VolumeHeader.Signature;\r
   Signature[1]  = 0;\r
@@ -832,7 +899,7 @@ Returns:
   if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_64K) {\r
     printf ("        EFI_FVB2_ALIGNMENT_64K\n");\r
   }\r
-  \r
+\r
 #else\r
 \r
   if (VolumeHeader.Attributes & EFI_FVB2_READ_LOCK_CAP) {\r
@@ -851,140 +918,134 @@ Returns:
     printf ("       EFI_FVB2_WRITE_LOCK_STATUS\n");\r
   }\r
 \r
-  if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_1) {\r
+  switch (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT) {\r
+    case EFI_FVB2_ALIGNMENT_1:\r
     printf ("       EFI_FVB2_ALIGNMENT_1\n");\r
-  }\r
-\r
-  if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_2) {\r
-    printf ("        EFI_FVB2_ALIGNMENT_2\n");\r
-  }\r
-\r
-  if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_4) {\r
-    printf ("        EFI_FVB2_ALIGNMENT_4\n");\r
-  }\r
+    break;\r
 \r
-  if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_8) {\r
-    printf ("        EFI_FVB2_ALIGNMENT_8\n");\r
-  }\r
+    case EFI_FVB2_ALIGNMENT_2:\r
+    printf ("       EFI_FVB2_ALIGNMENT_2\n");\r
+    break;\r
 \r
-  if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_16) {\r
-    printf ("        EFI_FVB2_ALIGNMENT_16\n");\r
-  }\r
+    case EFI_FVB2_ALIGNMENT_4:\r
+    printf ("       EFI_FVB2_ALIGNMENT_4\n");\r
+    break;\r
 \r
-  if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_32) {\r
-    printf ("        EFI_FVB2_ALIGNMENT_32\n");\r
-  }\r
+    case EFI_FVB2_ALIGNMENT_8:\r
+    printf ("       EFI_FVB2_ALIGNMENT_8\n");\r
+    break;\r
 \r
-  if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_64) {\r
-    printf ("        EFI_FVB2_ALIGNMENT_64\n");\r
-  }\r
+    case EFI_FVB2_ALIGNMENT_16:\r
+    printf ("       EFI_FVB2_ALIGNMENT_16\n");\r
+    break;\r
 \r
-  if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_128) {\r
-    printf ("        EFI_FVB2_ALIGNMENT_128\n");\r
-  }\r
+    case EFI_FVB2_ALIGNMENT_32:\r
+    printf ("       EFI_FVB2_ALIGNMENT_32\n");\r
+    break;\r
 \r
-  if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_256) {\r
-    printf ("        EFI_FVB2_ALIGNMENT_256\n");\r
-  }\r
+    case EFI_FVB2_ALIGNMENT_64:\r
+    printf ("       EFI_FVB2_ALIGNMENT_64\n");\r
+    break;\r
 \r
-  if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_512) {\r
-    printf ("        EFI_FVB2_ALIGNMENT_512\n");\r
-  }\r
+    case EFI_FVB2_ALIGNMENT_128:\r
+    printf ("       EFI_FVB2_ALIGNMENT_128\n");\r
+    break;\r
 \r
-  if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_1K) {\r
-    printf ("        EFI_FVB2_ALIGNMENT_1K\n");\r
-  }\r
+    case EFI_FVB2_ALIGNMENT_256:\r
+    printf ("       EFI_FVB2_ALIGNMENT_256\n");\r
+    break;\r
 \r
-  if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_2K) {\r
-    printf ("        EFI_FVB2_ALIGNMENT_2K\n");\r
-  }\r
+    case EFI_FVB2_ALIGNMENT_512:\r
+    printf ("       EFI_FVB2_ALIGNMENT_512\n");\r
+    break;\r
 \r
-  if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_4K) {\r
-    printf ("        EFI_FVB2_ALIGNMENT_4K\n");\r
-  }\r
+    case EFI_FVB2_ALIGNMENT_1K:\r
+    printf ("       EFI_FVB2_ALIGNMENT_1K\n");\r
+    break;\r
 \r
-  if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_8K) {\r
-    printf ("        EFI_FVB2_ALIGNMENT_8K\n");\r
-  }\r
+    case EFI_FVB2_ALIGNMENT_2K:\r
+    printf ("       EFI_FVB2_ALIGNMENT_2K\n");\r
+    break;\r
 \r
-  if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_16K) {\r
-    printf ("        EFI_FVB2_ALIGNMENT_16K\n");\r
-  }\r
+    case EFI_FVB2_ALIGNMENT_4K:\r
+    printf ("       EFI_FVB2_ALIGNMENT_4K\n");\r
+    break;\r
 \r
-  if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_32K) {\r
-    printf ("        EFI_FVB2_ALIGNMENT_32K\n");\r
-  }\r
+    case EFI_FVB2_ALIGNMENT_8K:\r
+    printf ("       EFI_FVB2_ALIGNMENT_8K\n");\r
+    break;\r
 \r
-  if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_64K) {\r
-    printf ("        EFI_FVB2_ALIGNMENT_64K\n");\r
-  }\r
+    case EFI_FVB2_ALIGNMENT_16K:\r
+    printf ("       EFI_FVB2_ALIGNMENT_16K\n");\r
+    break;\r
 \r
-  if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_128K) {\r
-    printf ("        EFI_FVB2_ALIGNMENT_128K\n");\r
-  }\r
+    case EFI_FVB2_ALIGNMENT_32K:\r
+    printf ("       EFI_FVB2_ALIGNMENT_32K\n");\r
+    break;\r
 \r
-  if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_256K) {\r
-    printf ("        EFI_FVB2_ALIGNMENT_256K\n");\r
-  }\r
+    case EFI_FVB2_ALIGNMENT_64K:\r
+    printf ("       EFI_FVB2_ALIGNMENT_64K\n");\r
+    break;\r
 \r
-  if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_512K) {\r
-    printf ("        EFI_FVB2_ALIGNMENT_512K\n");\r
-  }\r
+    case EFI_FVB2_ALIGNMENT_128K:\r
+    printf ("       EFI_FVB2_ALIGNMENT_128K\n");\r
+    break;\r
 \r
-  if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_1M) {\r
-    printf ("        EFI_FVB2_ALIGNMENT_1M\n");\r
-  }\r
+    case EFI_FVB2_ALIGNMENT_256K:\r
+    printf ("       EFI_FVB2_ALIGNMENT_256K\n");\r
+    break;\r
 \r
-  if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_2M) {\r
-    printf ("        EFI_FVB2_ALIGNMENT_2M\n");\r
-  }\r
+    case EFI_FVB2_ALIGNMENT_512K:\r
+    printf ("       EFI_FVB2_ALIGNMENT_512K\n");\r
+    break;\r
 \r
-  if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_4M) {\r
-    printf ("        EFI_FVB2_ALIGNMENT_4M\n");\r
-  }\r
+    case EFI_FVB2_ALIGNMENT_1M:\r
+    printf ("       EFI_FVB2_ALIGNMENT_1M\n");\r
+    break;\r
 \r
-  if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_8M) {\r
-    printf ("        EFI_FVB2_ALIGNMENT_8M\n");\r
-  }\r
+    case EFI_FVB2_ALIGNMENT_2M:\r
+    printf ("       EFI_FVB2_ALIGNMENT_2M\n");\r
+    break;\r
 \r
-  if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_16M) {\r
-    printf ("        EFI_FVB2_ALIGNMENT_16M\n");\r
-  }\r
+    case EFI_FVB2_ALIGNMENT_4M:\r
+    printf ("       EFI_FVB2_ALIGNMENT_4M\n");\r
+    break;\r
 \r
-  if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_32M) {\r
-    printf ("        EFI_FVB2_ALIGNMENT_32M\n");\r
-  }\r
+    case EFI_FVB2_ALIGNMENT_8M:\r
+    printf ("       EFI_FVB2_ALIGNMENT_8M\n");\r
+    break;\r
 \r
-  if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_64M) {\r
-    printf ("        EFI_FVB2_ALIGNMENT_64M\n");\r
-  }\r
+    case EFI_FVB2_ALIGNMENT_16M:\r
+    printf ("       EFI_FVB2_ALIGNMENT_16M\n");\r
+    break;\r
 \r
-  if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_128M) {\r
-    printf ("        EFI_FVB2_ALIGNMENT_128M\n");\r
-  }\r
+    case EFI_FVB2_ALIGNMENT_32M:\r
+    printf ("       EFI_FVB2_ALIGNMENT_32M\n");\r
+    break;\r
 \r
-  if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_64M) {\r
-    printf ("        EFI_FVB2_ALIGNMENT_64M\n");\r
-  }\r
+    case EFI_FVB2_ALIGNMENT_64M:\r
+    printf ("       EFI_FVB2_ALIGNMENT_64M\n");\r
+    break;\r
 \r
-  if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_128M) {\r
-    printf ("        EFI_FVB2_ALIGNMENT_128M\n");\r
-  }\r
+    case EFI_FVB2_ALIGNMENT_128M:\r
+    printf ("       EFI_FVB2_ALIGNMENT_128M\n");\r
+    break;\r
 \r
-  if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_256M) {\r
-    printf ("        EFI_FVB2_ALIGNMENT_256M\n");\r
-  }\r
+    case EFI_FVB2_ALIGNMENT_256M:\r
+    printf ("       EFI_FVB2_ALIGNMENT_256M\n");\r
+    break;\r
 \r
-  if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_512M) {\r
-    printf ("        EFI_FVB2_ALIGNMENT_512M\n");\r
-  }\r
+    case EFI_FVB2_ALIGNMENT_512M:\r
+    printf ("       EFI_FVB2_ALIGNMENT_512M\n");\r
+    break;\r
 \r
-  if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_1G) {\r
-    printf ("        EFI_FVB2_ALIGNMENT_1G\n");\r
-  }\r
+    case EFI_FVB2_ALIGNMENT_1G:\r
+    printf ("       EFI_FVB2_ALIGNMENT_1G\n");\r
+    break;\r
 \r
-  if (VolumeHeader.Attributes & EFI_FVB2_ALIGNMENT_2G) {\r
-    printf ("        EFI_FVB2_ALIGNMENT_2G\n");\r
+    case EFI_FVB2_ALIGNMENT_2G:\r
+    printf ("       EFI_FVB2_ALIGNMENT_2G\n");\r
+    break;\r
   }\r
 \r
 #endif\r
@@ -997,7 +1058,10 @@ Returns:
   printf ("Revision:              0x%04X\n", VolumeHeader.Revision);\r
 \r
   do {\r
-    fread (&BlockMap, sizeof (EFI_FV_BLOCK_MAP_ENTRY), 1, InputFile);\r
+    ReadSize = fread (&BlockMap, sizeof (EFI_FV_BLOCK_MAP_ENTRY), 1, InputFile);\r
+    if (ReadSize != 1) {\r
+      return EFI_ABORTED;\r
+    }\r
     BytesRead += sizeof (EFI_FV_BLOCK_MAP_ENTRY);\r
 \r
     if (BlockMap.NumBlocks != 0) {\r
@@ -1014,7 +1078,7 @@ Returns:
   }\r
 \r
   if (VolumeHeader.FvLength != Size) {\r
-    printf ("ERROR: Volume Size not consistant with Block Maps!\n");\r
+    printf ("ERROR: Volume Size not consistent with Block Maps!\n");\r
     return EFI_ABORTED;\r
   }\r
 \r
@@ -1028,6 +1092,53 @@ Returns:
   return EFI_SUCCESS;\r
 }\r
 \r
+STATIC\r
+EFI_STATUS\r
+PrintAprioriFile (\r
+  EFI_FFS_FILE_HEADER         *FileHeader\r
+  )\r
+/*++\r
+\r
+Routine Description:\r
+\r
+  Print GUIDs from the APRIORI file\r
+\r
+Arguments:\r
+\r
+  FileHeader - The file header\r
+\r
+Returns:\r
+\r
+  EFI_SUCCESS       - The APRIORI file was parsed correctly\r
+  EFI_SECTION_ERROR - Problem with file parsing\r
+\r
+--*/\r
+{\r
+  UINT8               GuidBuffer[PRINTED_GUID_BUFFER_SIZE];\r
+  UINT32              HeaderSize;\r
+\r
+  HeaderSize = FvBufGetFfsHeaderSize (FileHeader);\r
+\r
+  if (FileHeader->Type != EFI_FV_FILETYPE_FREEFORM)\r
+    return EFI_SECTION_ERROR;\r
+\r
+  EFI_COMMON_SECTION_HEADER* SectionHeader = (EFI_COMMON_SECTION_HEADER *) ((UINTN) FileHeader + HeaderSize);\r
+  if (SectionHeader->Type != EFI_SECTION_RAW)\r
+    return EFI_SECTION_ERROR;\r
+\r
+  UINT32 SectionLength = GetSectionFileLength (SectionHeader);\r
+  EFI_GUID* FileName = (EFI_GUID *) ((UINT8 *) SectionHeader + sizeof (EFI_COMMON_SECTION_HEADER));\r
+  while (((UINT8 *) FileName) < ((UINT8 *) SectionHeader + SectionLength)) {\r
+    PrintGuidToBuffer (FileName, GuidBuffer, sizeof (GuidBuffer), TRUE);\r
+    printf ("%s  ", GuidBuffer);\r
+    PrintGuidName (GuidBuffer);\r
+    printf ("\n");\r
+    FileName++;\r
+  }\r
+\r
+  return EFI_SUCCESS;\r
+}\r
+\r
 STATIC\r
 EFI_STATUS\r
 PrintFileInfo (\r
@@ -1061,7 +1172,7 @@ Returns:
   EFI_STATUS          Status;\r
   UINT8               GuidBuffer[PRINTED_GUID_BUFFER_SIZE];\r
   UINT32              HeaderSize;\r
-#if (PI_SPECIFICATION_VERSION < 0x00010000) \r
+#if (PI_SPECIFICATION_VERSION < 0x00010000)\r
   UINT16              *Tail;\r
 #endif\r
   //\r
@@ -1163,7 +1274,7 @@ Returns:
         return EFI_ABORTED;\r
       }\r
     }\r
-#if (PI_SPECIFICATION_VERSION < 0x00010000)    \r
+#if (PI_SPECIFICATION_VERSION < 0x00010000)\r
     //\r
     // Verify tail if present\r
     //\r
@@ -1178,7 +1289,7 @@ Returns:
         return EFI_ABORTED;\r
       }\r
     }\r
- #endif   \r
+ #endif\r
     break;\r
 \r
   default:\r
@@ -1227,7 +1338,7 @@ Returns:
     break;\r
 \r
   case EFI_FV_FILETYPE_SMM:\r
-    printf ("EFI_FV_FILETYPE_SMM\n");\r
+    printf ("EFI_FV_FILETYPE_MM\n");\r
     break;\r
 \r
   case EFI_FV_FILETYPE_FIRMWARE_VOLUME_IMAGE:\r
@@ -1235,11 +1346,19 @@ Returns:
     break;\r
 \r
   case EFI_FV_FILETYPE_COMBINED_SMM_DXE:\r
-    printf ("EFI_FV_FILETYPE_COMBINED_SMM_DXE\n");\r
+    printf ("EFI_FV_FILETYPE_COMBINED_MM_DXE\n");\r
     break;\r
 \r
   case EFI_FV_FILETYPE_SMM_CORE:\r
-    printf ("EFI_FV_FILETYPE_SMM_CORE\n");\r
+    printf ("EFI_FV_FILETYPE_MM_CORE\n");\r
+    break;\r
+\r
+  case EFI_FV_FILETYPE_MM_STANDALONE:\r
+    printf ("EFI_FV_FILETYPE_MM_STANDALONE\n");\r
+    break;\r
+\r
+  case EFI_FV_FILETYPE_MM_CORE_STANDALONE:\r
+    printf ("EFI_FV_FILETYPE_MM_CORE_STANDALONE\n");\r
     break;\r
 \r
   case EFI_FV_FILETYPE_FFS_PAD:\r
@@ -1276,6 +1395,25 @@ Returns:
     break;\r
   }\r
 \r
+  if (!CompareGuid (\r
+       &FileHeader->Name,\r
+       &gPeiAprioriFileNameGuid\r
+       ))\r
+  {\r
+    printf("\n");\r
+    printf("PEI APRIORI FILE:\n");\r
+    return PrintAprioriFile (FileHeader);\r
+  }\r
+  if (!CompareGuid (\r
+       &FileHeader->Name,\r
+       &gAprioriGuid\r
+       ))\r
+  {\r
+    printf("\n");\r
+    printf("DXE APRIORI FILE:\n");\r
+    return PrintAprioriFile (FileHeader);\r
+  }\r
+\r
   return EFI_SUCCESS;\r
 }\r
 \r
@@ -1503,7 +1641,7 @@ Returns:
   //\r
   // Update Image Base Address\r
   //\r
-  if ((ImgHdr->Pe32.OptionalHeader.Magic == EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC) && (ImgHdr->Pe32.FileHeader.Machine != IMAGE_FILE_MACHINE_IA64)) {\r
+  if (ImgHdr->Pe32.OptionalHeader.Magic == EFI_IMAGE_NT_OPTIONAL_HDR32_MAGIC) {\r
     ImgHdr->Pe32.OptionalHeader.ImageBase = (UINT32) NewPe32BaseAddress;\r
   } else if (ImgHdr->Pe32Plus.OptionalHeader.Magic == EFI_IMAGE_NT_OPTIONAL_HDR64_MAGIC) {\r
     ImgHdr->Pe32Plus.OptionalHeader.ImageBase = NewPe32BaseAddress;\r
@@ -1531,10 +1669,13 @@ CombinePath (
 )\r
 {\r
   UINT32 DefaultPathLen;\r
+  UINT64 Index;\r
+  CHAR8  QuotesStr[] = "\"";\r
+  strcpy(NewPath, QuotesStr);\r
   DefaultPathLen = strlen(DefaultPath);\r
-  strcpy(NewPath, DefaultPath);\r
-  UINT64 Index = 0;\r
-  for (; Index < DefaultPathLen; Index ++) {\r
+  strcat(NewPath, DefaultPath);\r
+  Index = 0;\r
+  for (; Index < DefaultPathLen + 1; Index ++) {\r
     if (NewPath[Index] == '\\' || NewPath[Index] == '/') {\r
       if (NewPath[Index + 1] != '\0') {\r
         NewPath[Index] = '/';\r
@@ -1546,6 +1687,7 @@ CombinePath (
     NewPath[Index + 1] = '\0';\r
   }\r
   strcat(NewPath, AppendPath);\r
+  strcat(NewPath, QuotesStr);\r
   return EFI_SUCCESS;\r
 }\r
 \r
@@ -1569,7 +1711,7 @@ Returns:
 \r
   EFI_SECTION_ERROR - Problem with section parsing.\r
                       (a) compression errors\r
-                      (b) unrecognized section \r
+                      (b) unrecognized section\r
   EFI_UNSUPPORTED - Do not know how to parse the section.\r
   EFI_SUCCESS - Section successfully parsed.\r
   EFI_OUT_OF_RESOURCES - Memory allocation failed.\r
@@ -1606,6 +1748,8 @@ Returns:
   UINT32              RealHdrLen;\r
   CHAR8               *ToolInputFileName;\r
   CHAR8               *ToolOutputFileName;\r
+  CHAR8               *UIFileName;\r
+  CHAR8               *VersionString;\r
 \r
   ParsedLength = 0;\r
   ToolInputFileName = NULL;\r
@@ -1714,24 +1858,41 @@ Returns:
       break;\r
 \r
     case EFI_SECTION_USER_INTERFACE:\r
-      printf ("  String: %ls\n", (wchar_t *) &((EFI_USER_INTERFACE_SECTION *) Ptr)->FileNameString);\r
+      UIFileName = (CHAR8 *) malloc (UnicodeStrLen (((EFI_USER_INTERFACE_SECTION *) Ptr)->FileNameString) + 1);\r
+      if (UIFileName == NULL) {\r
+        Error (NULL, 0, 4001, "Resource", "memory cannot be allocated!");\r
+        return EFI_OUT_OF_RESOURCES;\r
+      }\r
+      Unicode2AsciiString (((EFI_USER_INTERFACE_SECTION *) Ptr)->FileNameString, UIFileName);\r
+      printf ("  String: %s\n", UIFileName);\r
+      free (UIFileName);\r
       break;\r
 \r
     case EFI_SECTION_FIRMWARE_VOLUME_IMAGE:\r
+      printf ("/------------ Firmware Volume section start ---------------\\\n");\r
       Status = PrintFvInfo (Ptr + SectionHeaderLen, TRUE);\r
       if (EFI_ERROR (Status)) {\r
         Error (NULL, 0, 0003, "printing of FV section contents failed", NULL);\r
         return EFI_SECTION_ERROR;\r
       }\r
+      printf ("\\------------ Firmware Volume section end -----------------/\n");\r
       break;\r
 \r
     case EFI_SECTION_COMPATIBILITY16:\r
-    case EFI_SECTION_FREEFORM_SUBTYPE_GUID:\r
       //\r
       // Section does not contain any further header information.\r
       //\r
       break;\r
 \r
+    case EFI_SECTION_FREEFORM_SUBTYPE_GUID:\r
+      printf ("  Guid:  ");\r
+      if (SectionHeaderLen == sizeof (EFI_COMMON_SECTION_HEADER))\r
+        PrintGuid (&((EFI_FREEFORM_SUBTYPE_GUID_SECTION *)Ptr)->SubTypeGuid);\r
+      else\r
+        PrintGuid (&((EFI_FREEFORM_SUBTYPE_GUID_SECTION2 *)Ptr)->SubTypeGuid);\r
+      printf ("\n");\r
+      break;\r
+\r
     case EFI_SECTION_PEI_DEPEX:\r
     case EFI_SECTION_DXE_DEPEX:\r
     case EFI_SECTION_SMM_DEPEX:\r
@@ -1739,8 +1900,14 @@ Returns:
       break;\r
 \r
     case EFI_SECTION_VERSION:\r
-      printf ("  Build Number:  0x%02X\n", *(UINT16 *)(Ptr + SectionHeaderLen));\r
-      printf ("  Version Strg:  %s\n", (char*) (Ptr + SectionHeaderLen + sizeof (UINT16)));\r
+      printf ("  Build Number:  0x%04X\n", *(UINT16 *)(Ptr + SectionHeaderLen));\r
+      VersionString = (CHAR8 *) malloc (UnicodeStrLen (((EFI_VERSION_SECTION *) Ptr)->VersionString) + 1);\r
+      if (VersionString == NULL) {\r
+        Error (NULL, 0, 4001, "Resource", "memory cannot be allocated!");\r
+        return EFI_OUT_OF_RESOURCES;\r
+      }\r
+      Unicode2AsciiString (((EFI_VERSION_SECTION *) Ptr)->VersionString, VersionString);\r
+      printf ("  Version String:  %s\n", VersionString);\r
       break;\r
 \r
     case EFI_SECTION_COMPRESSION:\r
@@ -1819,7 +1986,9 @@ Returns:
         return EFI_SECTION_ERROR;\r
       }\r
 \r
+      printf ("/------------ Encapsulation section start -----------------\\\n");\r
       Status = ParseSection (UncompressedBuffer, UncompressedLength);\r
+      printf ("\\------------ Encapsulation section end -------------------/\n");\r
 \r
       if (CompressionType == EFI_STANDARD_COMPRESSION) {\r
         //\r
@@ -1913,11 +2082,18 @@ Returns:
           );\r
         free (ExtractionTool);\r
 \r
+        if (!CompareGuid (\r
+               EfiGuid,\r
+               &gEfiCrc32GuidedSectionExtractionProtocolGuid\r
+               )\r
+           ) {\r
+          DataOffset -= 4;\r
+        }\r
         Status =\r
           PutFileImage (\r
             ToolInputFile,\r
-            (CHAR8*) SectionBuffer + DataOffset,\r
-            BufferLength - DataOffset\r
+            (CHAR8*)Ptr + DataOffset,\r
+            SectionLength - DataOffset\r
             );\r
 \r
         system (SystemCommand);\r
@@ -1938,6 +2114,7 @@ Returns:
           return EFI_SECTION_ERROR;\r
         }\r
 \r
+        printf ("/------------ Encapsulation section start -----------------\\\n");\r
         Status = ParseSection (\r
                   ToolOutputBuffer,\r
                   ToolOutputLength\r
@@ -1946,6 +2123,7 @@ Returns:
           Error (NULL, 0, 0003, "parse of decoded GUIDED section failed", NULL);\r
           return EFI_SECTION_ERROR;\r
         }\r
+        printf ("\\------------ Encapsulation section end -------------------/\n");\r
 \r
       //\r
       // Check for CRC32 sections which we can handle internally if needed.\r
@@ -1958,14 +2136,16 @@ Returns:
         //\r
         // CRC32 guided section\r
         //\r
+        printf ("/------------ Encapsulation section start -----------------\\\n");\r
         Status = ParseSection (\r
-                  SectionBuffer + DataOffset,\r
-                  BufferLength - DataOffset\r
+                  Ptr + DataOffset,\r
+                  SectionLength - DataOffset\r
                   );\r
         if (EFI_ERROR (Status)) {\r
           Error (NULL, 0, 0003, "parse of CRC32 GUIDED section failed", NULL);\r
           return EFI_SECTION_ERROR;\r
         }\r
+        printf ("\\------------ Encapsulation section end -------------------/\n");\r
       } else {\r
         //\r
         // We don't know how to parse it now.\r
@@ -2175,8 +2355,7 @@ Returns:
 {\r
   FILE              *Fptr;\r
   CHAR8             Line[MAX_LINE_LEN];\r
-  CHAR8             *FormatString;\r
-  INTN              FormatLength;\r
+  CHAR8             FormatString[MAX_LINE_LEN];\r
   GUID_TO_BASENAME  *GPtr;\r
 \r
   if ((Fptr = fopen (LongFilePath (FileName), "r")) == NULL) {\r
@@ -2187,23 +2366,8 @@ Returns:
   //\r
   // Generate the format string for fscanf\r
   //\r
-  FormatLength = snprintf (\r
-                   NULL,\r
-                   0,\r
-                   "%%%us %%%us",\r
-                   (unsigned) sizeof (GPtr->Guid) - 1,\r
-                   (unsigned) sizeof (GPtr->BaseName) - 1\r
-                   ) + 1;\r
-\r
-  FormatString = (CHAR8 *) malloc (FormatLength);\r
-  if (FormatString == NULL) {\r
-    fclose (Fptr);\r
-    return EFI_OUT_OF_RESOURCES;\r
-  }\r
-\r
-  snprintf (\r
+  sprintf (\r
     FormatString,\r
-    FormatLength,\r
     "%%%us %%%us",\r
     (unsigned) sizeof (GPtr->Guid) - 1,\r
     (unsigned) sizeof (GPtr->BaseName) - 1\r
@@ -2215,7 +2379,6 @@ Returns:
     //\r
     GPtr = malloc (sizeof (GUID_TO_BASENAME));\r
     if (GPtr == NULL) {\r
-      free (FormatString);\r
       fclose (Fptr);\r
       return EFI_OUT_OF_RESOURCES;\r
     }\r
@@ -2232,7 +2395,6 @@ Returns:
     }\r
   }\r
 \r
-  free (FormatString);\r
   fclose (Fptr);\r
   return EFI_SUCCESS;\r
 }\r
@@ -2328,8 +2490,8 @@ Returns:
 \r
   //\r
   // Copyright declaration\r
-  // \r
-  fprintf (stdout, "Copyright (c) 2007 - 2016, Intel Corporation. All rights reserved.\n\n");\r
+  //\r
+  fprintf (stdout, "Copyright (c) 2007 - 2018, Intel Corporation. All rights reserved.\n\n");\r
   fprintf (stdout, "  Display Tiano Firmware Volume FFS image information\n\n");\r
 \r
   //\r