| Address | Name | Description |
|---|---|---|
| _ModuleEntryPoint | ||
| AsciiStrHexToUint64 | ||
| StrLen | ||
| StrSize | ||
| SPrintf | ||
| DebugAssert | ||
| DebugPrint | ||
| HexCharToUint | ||
| Image | size: 0x51a0 bytes | |
| This | module is a UEFI Shell-based System Inventory Diagnostic Tool. | |
| It | locates the gSystemInventoryProtocol (or gBmcSystemInventoryProtocol) | |
| and | dumps inventory data for CPU, DIMM, PCIe, and HDD subsystems. | |
| File | paths: e:\hs\MdePkg\Library... | |
| Global | variables | |
| 0x4EF0 | EFI_SYSTEM_TABLE *gST; // 0x4EE8 | |
| 0x4EF8 | EFI_RUNTIME_SERVICES *gRT; // 0x4F00 | |
| 0x4F28 | (secondary copy) | |
| 0x4F38 | (argument count) | |
| 0x4F40 | (argument vector pointer) | |
| 0x4F10 | (HOB list pointer) | |
| 0x4EE0 | (debug output flag) | |
| 0x4F60 | (output buffer) | |
| System | Inventory Protocol GUIDs | |
| unk_49F0 | = gSystemInventoryProtocolGuid | |
| unk_4A00 | = gSystemInventoryProtocol (protocol instance) | |
| unk_4A10 | = gSystemInventoryProtocol + 0 (HOB GUID data) | |
| unk_4A18 | = gSystemInventoryProtocol + 8 | |
| SYSTEM_INVENTORY_PROTOCOL | Layout (size = 3402 = 0xD4A bytes) | |
| Offset | Size Field | |
| 0 | 85 BiosAndMEVersionInfo (BIOS/ME version info) | |
| 85 | 1 BmcDeviceInfoParamaterSelector | |
| 86 | 1 CpuCount | |
| 87 | 170 CpuInfo[] (85 bytes per CPU, max 2 CPUs) | |
| 257 | 1 DimmCount | |
| 258 | 2016 DimmInfo[] (84 bytes per DIMM, max 24 DIMMs) | |
| 2274 | 1 PciCount | |
| 2275 | 76 PciInfo[] (19 bytes per slot, max 4 slots) | |
| 2351 | 1 HddCount | |
| 2352 | 1050 HddInfo[] (75 bytes per HDD, max 14 HDDs) | |
| SINGLE_CPU_INFO | (85 bytes) | |
| 0 | 1 CoreCount | |
| 1 | 1 ThreadCount | |
| 2 | 13 CpuVendor (string) | |
| 15 | 30 CpuFamilyName (string) | |
| 45 | 30 CpuModelIdName (string) | |
| 75 | 10 Stepping (string) | |
| 4 | MaxFrequency (UINT32, value in MHz) | |
| DIMM_INFO | (84 bytes) | |
| 0 | 1 DimmSlotIndex | |
| 1 | 1 NodeNumber | |
| 2 | 1 ChannelNumber | |
| 3 | 10 DimmType (string) | |
| 13 | 10 DdrVoltage (string) | |
| 23 | 4 DimmFreq (UINT32, value in MHz) | |
| 27 | 4 DimmSize (UINT32, value in MB) | |
| 29 | 2 (DWORD checksum/active field | checked for non-zero) |
| 31 | 4 (unused padding?) | |
| 35 | 10 ManufacturerIdName (string) | |
| 45 | 4 SerialNumber (4 bytes) | |
| 49 | 35 PartNumber (string) | |
| PCI_INFO | (19 bytes) | |
| 0 | 1 SlotIndex | |
| 1 | 1 PciType | |
| 2 | 1 BusNumber | |
| 3 | 1 DevFun | |
| 4 | 2 VendorId | |
| 6 | 2 DeviceId | |
| 8 | 2 SubSystemVendorId | |
| 10 | 2 SubSystemId | |
| 12 | 1 InterfaceType | |
| 13 | 1 SubClassCode | |
| 14 | 1 BaseClassCode | |
| 15 | 1 LinkSpeed | |
| 16 | 1 LinkWidth | |
| 17 | 2 (unused/checksum, checked for non-zero) | |
| HDD_INFO | (75 bytes) | |
| 0 | 1 DriveIndex | |
| 1 | 68 VendorId (string) | |
| 69 | 4 DriveSize (UINT32, in MB) | |
| 73 | 1 MediaType | |
| 75 | 1 Formfactor | |
| 77 | 1 SlotNumber | |
| 78 | 1 DeviceState | |
| 4 | (UINT32 checksum at offset 65, checked for non-zero) | |
| inventory | protocol, and dumps inventory data for the requested | |
| subsystem | (cpu/dimm/pci/hdd). | |
| Behavior | modes (based on Argc/Argv): | |
| Save | global protocol pointers | |
| Initialize | HOB list | |
| Initialize | cached system table copies | |
| Try | alternate protocol | |
| argc | OffsetsTable = *Argv; // argv | |
| Show | struct layout info only | |
| Check | for "debug" keyword | show full struct layout |
| determined | by category below | |
| Offset | to CpuCount | |
| Offset | to DimmCount | |
| Offset | to PciCount | |
| Offset | to HddCount | |
| same | for CPU with indexed (argc==3) path... | |
| Check | debug flag | |
| Library | function: AsciiStrHexToUint64 (sub_2434) | |
| Standard | EDK2 implementation | |
| Skips | leading whitespace and '0x' prefix | |
| Checks | alignment, validates range, converts hex digits | |
| Library | function: StrLen (sub_256C) | |
| PcdMaximumUnicodeStringLength | if (!String[++Length]) | |
| overflow | sentinel | |
| Library | function: StrSize (sub_22D0) | |
| Null | check, alignment check, length cap at 0xF4240 | |
| Library | function: StrCmp (sub_2364) | |
| Uses | StrSize for validation, then character-by-character comparison | |
| Library | function: SPrintf / UnicodeBSPrint (sub_29E0) | |
| Complex | format string parser supporting: | |
| Library | function: StatusCodeToString (sub_28F0) | |
| Returns | string names for: | |
| Library | function: GetHobList (sub_26CC) | |
| Reads | HOB list from gST->HobList.Raw | |
| Falls | back to searching SystemTable configuration table | |
| ASSERT | on failure | |
| Library | function: DebugAssert (sub_268C) | |
| Calls | through to EFI_DEBUGGER_PROTOCOL assertion handler | |
| Helper | function: GetDebugProtocol (sub_25C4) | |
| Uses | gBS->AllocatePool, gBS->LocateProtocol to find the debug protocol | |
| Cached | in qword_4F08 | |
| Helper | function: DebugPrint (sub_2644) | |
| Checks | error level against platform configuration (CMOS-based) | |
| Library | function: HexCharToUint (sub_2404) | |
| uppercase | return Char - 55; // 'A' - 10 | |
| Library | function: Uint64ToString (sub_27A4) | |
| Library | function: AsciiStrHexToUintn (sub_2818) | |
| Library | function: UnicodeValueToString (sub_29B8) | |
| Library | function: UnicodeSPrint (sub_2E58) | |
| Platform | function: GetPlatformErrorLevel (sub_2E78) | |
| Uses | CMOS port 0x70/0x71 to read debug level from CMOS index 0x4B. | |
| Also | reads hardware register 0xFDAF0490 on certain CMOS values. | |
| Library | function: ReadUnaligned64 (sub_2F38) | |
| Library | function: HobGuidMatch (sub_2EC8) |
Generated by HR650X BIOS Decompilation Project