From 01e2e0877ba54b81ff7cc3c57e9bfd62db18d759 Mon Sep 17 00:00:00 2001 From: Nikolaj Schlej Date: Fri, 7 Mar 2025 12:17:31 +0700 Subject: [PATCH] Add FFS volume parser for non-AMI NVRAM areas --- common/nvramparser.cpp | 34 +++++++++++++++++++++++++++++++++- 1 file changed, 33 insertions(+), 1 deletion(-) diff --git a/common/nvramparser.cpp b/common/nvramparser.cpp index 38156af..eec8193 100644 --- a/common/nvramparser.cpp +++ b/common/nvramparser.cpp @@ -1250,8 +1250,40 @@ USTATUS NvramParser::parseNvramVolumeBody(const UModelIndex & index,const UINT32 if (U_SUCCESS != ffsParser->parseIntelMicrocodeHeader(ucode, storeOffset, index, ucodeIndex)) { throw 0; } + + UINT32 storeSize = ucodeHeader->TotalSize; - storeOffset += ucodeHeader->TotalSize - 1; + storeOffset += storeSize - 1; + previousStoreEndOffset = storeOffset + 1; + continue; + } catch (...) { + // Parsing failed, try something else + } + + // FFS volume + try { + // Check data size + if (volumeBodySize - storeOffset < sizeof(EFI_FIRMWARE_VOLUME_HEADER)) { + throw 0; + } + + // Check volume header candidate + const EFI_FIRMWARE_VOLUME_HEADER* volumeHeader = (const EFI_FIRMWARE_VOLUME_HEADER*)(volumeBody.constData() + storeOffset); + if (volumeHeader->Signature != EFI_FV_SIGNATURE) { + throw 0; + } + + // All checks passed, volume found + UByteArray volume = volumeBody.mid(storeOffset); + UModelIndex volumeIndex; + if (U_SUCCESS != ffsParser->parseVolumeHeader(volume, storeOffset, index, volumeIndex)) { + throw 0; + } + + (VOID)ffsParser->parseVolumeBody(volumeIndex); + UINT32 storeSize = (UINT32)(model->header(volumeIndex).size() + model->body(volumeIndex).size()); + + storeOffset += storeSize - 1; previousStoreEndOffset = storeOffset + 1; continue; } catch (...) {