The tool dumps the contents of a firmware volume\r
\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
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
//\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
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
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
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
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
);\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
//\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