diff --git a/UEFITool/uefitool.ui b/UEFITool/uefitool.ui index 5bde7ba..63113c3 100644 --- a/UEFITool/uefitool.ui +++ b/UEFITool/uefitool.ui @@ -913,7 +913,10 @@ false - Export discovered GUIDs... + &Export discovered GUIDs... + + + Ctrl+Alt+E diff --git a/common/ffsparser.cpp b/common/ffsparser.cpp index 72ab610..410382f 100644 --- a/common/ffsparser.cpp +++ b/common/ffsparser.cpp @@ -1659,12 +1659,20 @@ USTATUS FfsParser::parseFileBody(const UModelIndex & index) UByteArray fileGuid = UByteArray(model->header(index).constData(), sizeof(EFI_GUID)); // Parse NVAR store - if (fileGuid == NVRAM_NVAR_STORE_FILE_GUID) + if (fileGuid == NVRAM_NVAR_STORE_FILE_GUID) { + model->setText(index, UString("NVAR store")); return nvramParser->parseNvarStore(index); + } + + if (fileGuid == NVRAM_NVAR_PEI_EXTERNAL_DEFAULTS_FILE_GUID) { + model->setText(index, UString("NVRAM external defaults")); + return nvramParser->parseNvarStore(index); + } // Parse vendor hash file - else if (fileGuid == BG_VENDOR_HASH_FILE_GUID_PHOENIX) + else if (fileGuid == BG_VENDOR_HASH_FILE_GUID_PHOENIX) { return parseVendorHashFile(fileGuid, index); + } return parseRawArea(index); } @@ -2796,39 +2804,34 @@ USTATUS FfsParser::parseRawSectionBody(const UModelIndex & index) // Get parent file parsing data UByteArray parentFileGuid(model->header(parentFile).constData(), sizeof(EFI_GUID)); if (parentFileGuid == EFI_PEI_APRIORI_FILE_GUID) { // PEI apriori file - // Parse apriori file list - UString str; - USTATUS result = parseAprioriRawSection(model->body(index), str); - if (!result && !str.isEmpty()) - model->addInfo(index, UString("\nFile list:") + str); - // Set parent file text model->setText(parentFile, UString("PEI apriori file")); - - return U_SUCCESS; - } - else if (parentFileGuid == EFI_DXE_APRIORI_FILE_GUID) { // DXE apriori file // Parse apriori file list UString str; USTATUS result = parseAprioriRawSection(model->body(index), str); if (!result && !str.isEmpty()) model->addInfo(index, UString("\nFile list:") + str); - - // Set parent file text + return result; + } + else if (parentFileGuid == EFI_DXE_APRIORI_FILE_GUID) { // DXE apriori file + // Rename parent file model->setText(parentFile, UString("DXE apriori file")); - - return U_SUCCESS; + // Parse apriori file list + UString str; + USTATUS result = parseAprioriRawSection(model->body(index), str); + if (!result && !str.isEmpty()) + model->addInfo(index, UString("\nFile list:") + str); + return result; } else if (parentFileGuid == NVRAM_NVAR_EXTERNAL_DEFAULTS_FILE_GUID) { // AMI NVRAM external defaults - // Parse NVAR area - nvramParser->parseNvarStore(index); - - // Set parent file text + // Rename parent file model->setText(parentFile, UString("NVRAM external defaults")); + // Parse NVAR area + return nvramParser->parseNvarStore(index); } else if (parentFileGuid == BG_VENDOR_HASH_FILE_GUID_AMI) { // AMI vendor hash file // Parse AMI vendor hash file - parseVendorHashFile(parentFileGuid, index); + return parseVendorHashFile(parentFileGuid, index); } // Parse as raw area diff --git a/common/nvram.h b/common/nvram.h index 7b9c423..3b27a24 100644 --- a/common/nvram.h +++ b/common/nvram.h @@ -34,6 +34,10 @@ const UByteArray NVRAM_NVAR_STORE_FILE_GUID const UByteArray NVRAM_NVAR_EXTERNAL_DEFAULTS_FILE_GUID ("\x5B\x31\x21\x92\xBB\x30\xB5\x46\x81\x3E\x1B\x1B\xF4\x71\x2B\xD3", 16); +// 77D3DC50-D42B-4916-AC80-8F469035D150 +const UByteArray NVRAM_NVAR_PEI_EXTERNAL_DEFAULTS_FILE_GUID +("\x50\xDC\xD3\x77\x2B\xD4\x16\x49\xAC\x80\x8F\x46\x90\x35\xD1\x50", 16); + extern UString nvarAttributesToUString(const UINT8 attributes); extern UString nvarExtendedAttributesToUString(const UINT8 attributes); extern UString efiTimeToUString(const EFI_TIME & time); @@ -41,7 +45,7 @@ extern UString efiTimeToUString(const EFI_TIME & time); typedef struct NVAR_ENTRY_HEADER_ { UINT32 Signature; // NVAR UINT16 Size; // Size of the entry including header - UINT32 Next : 24; // Offset to the next entry in a list, or empty if latest in the list + UINT32 Next : 24; // Offset to the next entry in a list, or empty if the latest in the list UINT32 Attributes : 8; // Attributes } NVAR_ENTRY_HEADER; @@ -49,14 +53,14 @@ typedef struct NVAR_ENTRY_HEADER_ { #define NVRAM_NVAR_ENTRY_SIGNATURE 0x5241564E // Attributes -#define NVRAM_NVAR_ENTRY_RUNTIME 0x01 -#define NVRAM_NVAR_ENTRY_ASCII_NAME 0x02 -#define NVRAM_NVAR_ENTRY_GUID 0x04 -#define NVRAM_NVAR_ENTRY_DATA_ONLY 0x08 -#define NVRAM_NVAR_ENTRY_EXT_HEADER 0x10 -#define NVRAM_NVAR_ENTRY_HW_ERROR_RECORD 0x20 -#define NVRAM_NVAR_ENTRY_AUTH_WRITE 0x40 -#define NVRAM_NVAR_ENTRY_VALID 0x80 +#define NVRAM_NVAR_ENTRY_RUNTIME 0x01 +#define NVRAM_NVAR_ENTRY_ASCII_NAME 0x02 +#define NVRAM_NVAR_ENTRY_GUID 0x04 +#define NVRAM_NVAR_ENTRY_DATA_ONLY 0x08 +#define NVRAM_NVAR_ENTRY_EXT_HEADER 0x10 +#define NVRAM_NVAR_ENTRY_HW_ERROR_RECORD 0x20 +#define NVRAM_NVAR_ENTRY_AUTH_WRITE 0x40 +#define NVRAM_NVAR_ENTRY_VALID 0x80 // Extended attributes #define NVRAM_NVAR_ENTRY_EXT_CHECKSUM 0x01 diff --git a/common/nvramparser.cpp b/common/nvramparser.cpp index 63e92c4..0d90b29 100644 --- a/common/nvramparser.cpp +++ b/common/nvramparser.cpp @@ -44,9 +44,6 @@ USTATUS NvramParser::parseNvarStore(const UModelIndex & index) emptyByte = readUnaligned(pdata).emptyByte; } - // Rename parent file - model->setText(parentFileIndex, UString("NVAR store")); - // Get local offset UINT32 localOffset = model->header(index).size(); @@ -539,7 +536,7 @@ USTATUS NvramParser::findNextStore(const UModelIndex & index, const UByteArray & UINT32 offset = storeOffset; for (; offset < dataSize - sizeof(UINT32); offset++) { const UINT32* currentPos = (const UINT32*)(volume.constData() + offset); - if (*currentPos == NVRAM_VSS_STORE_SIGNATURE || *currentPos == NVRAM_APPLE_SVS_STORE_SIGNATURE) { //$VSS or $SVS signatures found, perform checks + if (*currentPos == NVRAM_VSS_STORE_SIGNATURE || *currentPos == NVRAM_APPLE_SVS_STORE_SIGNATURE) { // $VSS or $SVS signatures found, perform checks const VSS_VARIABLE_STORE_HEADER* vssHeader = (const VSS_VARIABLE_STORE_HEADER*)currentPos; if (vssHeader->Format != NVRAM_VSS_VARIABLE_STORE_FORMATTED) { msg(usprintf("%s: VSS store candidate at offset %Xh skipped, has invalid format %02Xh", __FUNCTION__, localOffset + offset, vssHeader->Format), index); @@ -552,7 +549,7 @@ USTATUS NvramParser::findNextStore(const UModelIndex & index, const UByteArray & // All checks passed, store found break; } - else if (*currentPos == NVRAM_VSS2_AUTH_VAR_KEY_DATABASE_GUID_PART1 || *currentPos == NVRAM_VSS2_STORE_GUID_PART1) { //VSS2 store signatures found, perform checks + else if (*currentPos == NVRAM_VSS2_AUTH_VAR_KEY_DATABASE_GUID_PART1 || *currentPos == NVRAM_VSS2_STORE_GUID_PART1) { // VSS2 store signatures found, perform checks UByteArray guid = UByteArray(volume.constData() + offset, sizeof(EFI_GUID)); if (guid != NVRAM_VSS2_AUTH_VAR_KEY_DATABASE_GUID && guid != NVRAM_VSS2_STORE_GUID) // Check the whole signature continue; @@ -569,7 +566,7 @@ USTATUS NvramParser::findNextStore(const UModelIndex & index, const UByteArray & // All checks passed, store found break; } - else if (*currentPos == NVRAM_FDC_VOLUME_SIGNATURE) { //FDC signature found + else if (*currentPos == NVRAM_FDC_VOLUME_SIGNATURE) { // FDC signature found const FDC_VOLUME_HEADER* fdcHeader = (const FDC_VOLUME_HEADER*)currentPos; if (fdcHeader->Size == 0 || fdcHeader->Size == 0xFFFFFFFF) { msg(usprintf("%s: FDC store candidate at offset %Xh skipped, has invalid size %Xh", __FUNCTION__, localOffset + offset, fdcHeader->Size), index); @@ -578,7 +575,7 @@ USTATUS NvramParser::findNextStore(const UModelIndex & index, const UByteArray & // All checks passed, store found break; } - else if (*currentPos == NVRAM_APPLE_FSYS_STORE_SIGNATURE || *currentPos == NVRAM_APPLE_GAID_STORE_SIGNATURE) { //Fsys or Gaid signature found + else if (*currentPos == NVRAM_APPLE_FSYS_STORE_SIGNATURE || *currentPos == NVRAM_APPLE_GAID_STORE_SIGNATURE) { // Fsys or Gaid signature found const APPLE_FSYS_STORE_HEADER* fsysHeader = (const APPLE_FSYS_STORE_HEADER*)currentPos; if (fsysHeader->Size == 0 || fsysHeader->Size == 0xFFFF) { msg(usprintf("%s: Fsys store candidate at offset %Xh skipped, has invalid size %Xh", __FUNCTION__, localOffset + offset, fsysHeader->Size), index); @@ -604,7 +601,7 @@ USTATUS NvramParser::findNextStore(const UModelIndex & index, const UByteArray & offset -= sizeof(UINT32); break; } - else if (*currentPos == NVRAM_MAIN_STORE_VOLUME_GUID_DATA1 || *currentPos == EDKII_WORKING_BLOCK_SIGNATURE_GUID_DATA1) { //Possible FTW block signature found + else if (*currentPos == NVRAM_MAIN_STORE_VOLUME_GUID_DATA1 || *currentPos == EDKII_WORKING_BLOCK_SIGNATURE_GUID_DATA1) { // Possible FTW block signature found UByteArray guid = UByteArray(volume.constData() + offset, sizeof(EFI_GUID)); if (guid != NVRAM_MAIN_STORE_VOLUME_GUID && guid != EDKII_WORKING_BLOCK_SIGNATURE_GUID && guid != VSS2_WORKING_BLOCK_SIGNATURE_GUID) // Check the whole signature continue;