/** @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
//\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
\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
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
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
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
\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
//\r
// 0x02\r
//\r
- "EFI_SECTION_GUID_DEFINED", \r
+ "EFI_SECTION_GUID_DEFINED",\r
//\r
// 0x03\r
//\r
//\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
//\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
//\r
// 0x1C\r
//\r
- "EFI_SECTION_SMM_DEPEX",\r
+ "EFI_SECTION_MM_DEPEX",\r
//\r
// 0x1C+\r
//\r
\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
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
UINTN Signature[2];\r
UINTN BytesRead;\r
UINT32 Size;\r
+ size_t ReadSize;\r
\r
BytesRead = 0;\r
Size = 0;\r
//\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
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
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
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
}\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
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
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
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
return EFI_ABORTED;\r
}\r
}\r
- #endif \r
+ #endif\r
break;\r
\r
default:\r
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
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
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
//\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
)\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
NewPath[Index + 1] = '\0';\r
}\r
strcat(NewPath, AppendPath);\r
+ strcat(NewPath, QuotesStr);\r
return EFI_SUCCESS;\r
}\r
\r
\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
UINT32 RealHdrLen;\r
CHAR8 *ToolInputFileName;\r
CHAR8 *ToolOutputFileName;\r
+ CHAR8 *UIFileName;\r
+ CHAR8 *VersionString;\r
\r
ParsedLength = 0;\r
ToolInputFileName = NULL;\r
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
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
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
);\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
return EFI_SECTION_ERROR;\r
}\r
\r
+ printf ("/------------ Encapsulation section start -----------------\\\n");\r
Status = ParseSection (\r
ToolOutputBuffer,\r
ToolOutputLength\r
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
//\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
{\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
//\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
//\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
}\r
}\r
\r
- free (FormatString);\r
fclose (Fptr);\r
return EFI_SUCCESS;\r
}\r
\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