Skip to content

Commit fd0faea

Browse files
committed
Add Phoenix CMDB parser
1 parent 01e2e08 commit fd0faea

2 files changed

Lines changed: 41 additions & 2 deletions

File tree

common/nvram.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -414,7 +414,7 @@ typedef struct PHOENIX_CMDB_HEADER_ {
414414
} PHOENIX_CMDB_HEADER;
415415

416416
#define NVRAM_PHOENIX_CMDB_HEADER_SIGNATURE 0x42444D43
417-
#define NVRAM_PHOENIX_CMDB_SIZE 0x100;
417+
#define NVRAM_PHOENIX_CMDB_SIZE 0x100
418418

419419
// Zero GUID
420420
extern const UByteArray ZERO_GUID;

common/nvramparser.cpp

Lines changed: 40 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1216,9 +1216,48 @@ USTATUS NvramParser::parseNvramVolumeBody(const UModelIndex & index,const UINT32
12161216
} catch (...) {
12171217
// Parsing failed, try something else
12181218
}
1219+
12191220
// Phoenix CMDB
1221+
try {
1222+
if (volumeBodySize - storeOffset < NVRAM_PHOENIX_CMDB_SIZE) {
1223+
// No need to parse further, the rest of the volume is too small
1224+
throw 0;
1225+
}
1226+
1227+
UINT32 storeSize = NVRAM_PHOENIX_CMDB_SIZE;
1228+
UByteArray cmdb = volumeBody.mid(storeOffset, storeSize);
1229+
1230+
// Get store header
1231+
const PHOENIX_CMDB_HEADER* cmdbHeader = (const PHOENIX_CMDB_HEADER*)cmdb.constData();
1232+
1233+
if (cmdbHeader->Signature != NVRAM_PHOENIX_CMDB_HEADER_SIGNATURE) {
1234+
throw 0;
1235+
}
1236+
1237+
// Construct header and body
1238+
header = cmdb.left(cmdbHeader->TotalSize);
1239+
body = cmdb.mid(cmdbHeader->TotalSize, storeSize - cmdbHeader->TotalSize);
1240+
1241+
// Add info
1242+
name = UString("CMDB store");
1243+
info = usprintf("Signature: CMDB\nFull size: %Xh (%u)\nHeader size: %Xh (%u)\nBody size: %Xh (%u)",
1244+
storeSize, storeSize,
1245+
(UINT32)header.size(), (UINT32)header.size(),
1246+
(UINT32)body.size(), (UINT32)body.size());
1247+
1248+
// Add tree item
1249+
model->addItem(storeOffset, Types::CmdbStore, 0, name, UString(), info, header, body, UByteArray(), Fixed, index);
1250+
1251+
storeOffset += storeSize - 1;
1252+
previousStoreEndOffset = storeOffset + 1;
1253+
continue;
1254+
} catch (...) {
1255+
// Parsing failed, try something else
1256+
}
1257+
1258+
// Phoenix SLIC Pubkey
12201259

1221-
// Phoenix SLIC Pubkey/Marker
1260+
// Phoenix SLIC Marker
12221261

12231262
// Intel uCode
12241263
try {

0 commit comments

Comments
 (0)