/** @file HardwareSignatureEntry.h -- Header for HardwareSignatureEntry Copyright (c) HR650X BIOS Decompilation Project **/ #ifndef __HARDWARESIGNATUREENTRY_H__ #define __HARDWARESIGNATUREENTRY_H__ #include "../uefi_headers/Uefi.h" // // Function Prototypes // EFI_STATUS EFIAPI ModuleEntryPoint( VOID ); EFI_STATUS EFIAPI HiiHardwareSignatureEntry( VOID ); EFI_STATUS EFIAPI HiiProcessHardwareSignature( VOID ); EFI_STATUS EFIAPI HiiReadHardwareConfigData( VOID ); EFI_STATUS EFIAPI RecordHardwareChange( VOID ); EFI_STATUS EFIAPI CheckCmosChecksumChanged( VOID ); EFI_STATUS EFIAPI HardwareSignatureNotificationCallback( VOID ); EFI_STATUS EFIAPI CalculatePhysicalMemorySize( VOID ); EFI_STATUS EFIAPI GetHiiStringTable( VOID ); EFI_STATUS EFIAPI GetHardwareConfigFromFormset( VOID ); EFI_STATUS EFIAPI CompareGuid( VOID ); EFI_STATUS EFIAPI DebugAssert( VOID ); EFI_STATUS EFIAPI ReadUnaligned64( VOID ); EFI_STATUS EFIAPI CalculateCheckSum8( VOID ); EFI_STATUS EFIAPI QuickSort( VOID ); EFI_STATUS EFIAPI FindHardwareFormset( VOID ); EFI_STATUS EFIAPI // ===========================================================================( VOID ); EFI_STATUS EFIAPI UEFI globals from library constructors.( VOID ); EFI_STATUS EFIAPI EFI_HANDLE gImageHandle;( VOID ); EFI_STATUS EFIAPI gChangeListIndex = 0; // 0x1D80( VOID ); EFI_STATUS EFIAPI EFI_HII_DATABASE_PROTOCOL *gHiiDatabase = NULL;// 0x1DA8( VOID ); EFI_STATUS EFIAPI BOOLEAN gMemorySizeCached = FALSE;//0x1DB8( VOID ); EFI_STATUS EFIAPI UINT8 gHardwareStatusByte = 0; // 0x1DC4( VOID ); EFI_STATUS EFIAPI UINT32 gHardwareConfigDword = 0; // 0x1DCC( VOID ); EFI_STATUS EFIAPI UINT32 gFirmwareCapabilityDword = 0; // 0x1DD8( VOID ); EFI_STATUS EFIAPI UINT32 gChangeList[0x14]; // 0x1DE0( VOID ); EFI_STATUS EFIAPI UINT32 gMemorySizeMb = 0; // 0x1E3C( VOID ); EFI_STATUS EFIAPI computation constants( VOID ); EFI_STATUS EFIAPI INT32 gHardwareSignatureMagic = 117704678; // 0x1E30( VOID ); EFI_STATUS EFIAPI const UINT8 gHardwareSignatureYear = 14; // 0x1E36 (2014)( VOID ); EFI_STATUS EFIAPI (sub_2C0)( VOID ); EFI_STATUS EFIAPI memmove: handles forward/backward overlap.( VOID ); EFI_STATUS EFIAPI decompiled code shows:( VOID ); EFI_STATUS EFIAPI &dest[Length-1] down to dest[0].( VOID ); EFI_STATUS EFIAPI >> 3 chunk, then the Length & 7 remainder.( VOID ); EFI_STATUS EFIAPI (CHAR8 *)CopyMem (DestinationBuffer, SourceBuffer, Length);( VOID ); EFI_STATUS EFIAPI (sub_384)( VOID ); EFI_STATUS EFIAPI library constructors initialise ImageHandle, SystemTable( VOID ); EFI_STATUS EFIAPI / UefiRuntimeServicesTableLib).( VOID ); EFI_STATUS EFIAPI HiiHardwareSignatureEntry (ImageHandle, NULL);( VOID ); EFI_STATUS EFIAPI (sub_430)( VOID ); EFI_STATUS EFIAPI the HII Config Access protocol on a child handle and( VOID ); EFI_STATUS EFIAPI the notification callback (HardwareSignatureNotificationCallback)( VOID ); EFI_STATUS EFIAPI the hardware-configuration formset.( VOID ); EFI_STATUS EFIAPI the config-variable store (120 bytes).( VOID ); EFI_STATUS EFIAPI Config Access protocol on a new child handle.( VOID ); EFI_STATUS EFIAPI = gBS->InstallProtocolInterface (( VOID ); EFI_STATUS EFIAPI EFI_NATIVE_INTERFACE( VOID ); EFI_STATUS EFIAPI );( VOID ); EFI_STATUS EFIAPI notify for HII Config Access protocol (unk_1C90)( VOID ); EFI_STATUS EFIAPI = gBS->RegisterProtocolNotify (( VOID ); EFI_STATUS EFIAPI notify again (unk_1CB0, same notification)( VOID ); EFI_STATUS EFIAPI (sub_530)( VOID ); EFI_STATUS EFIAPI hardware-signature processing based on "Type" opcode.( VOID ); EFI_STATUS EFIAPI current total physical memory (MB).( VOID ); EFI_STATUS EFIAPI MemoryMb;( VOID ); EFI_STATUS EFIAPI query mode (DataSize == 0 && Data == NULL), store internal.( VOID ); EFI_STATUS EFIAPI Data provided and *Data is "close enough" to MemoryMb( VOID ); EFI_STATUS EFIAPI |= HW_SIG_FLAG_MEMORY;( VOID ); EFI_STATUS EFIAPI StatusByte;( VOID ); EFI_STATUS EFIAPI ConfigDword;( VOID ); EFI_STATUS EFIAPI CapDword;( VOID ); EFI_STATUS EFIAPI (sub_774)( VOID ); EFI_STATUS EFIAPI "HardwareConfigData" UEFI variable (default 120 bytes).( VOID ); EFI_STATUS EFIAPI (sub_7F0)( VOID ); EFI_STATUS EFIAPI a 32-bit change code into the array gChangeList[].( VOID ); EFI_STATUS EFIAPI (sub_81C)( VOID ); EFI_STATUS EFIAPI CMOS status and checksum to detect battery-backed config( VOID ); EFI_STATUS EFIAPI the CMOS info protocol (gCmosInfoProtocolGuid).( VOID ); EFI_STATUS EFIAPI it has 128 bytes of data, byte[127] is the status byte.( VOID ); EFI_STATUS EFIAPI = gBS->LocateProtocol (( VOID ); EFI_STATUS EFIAPI NULL( VOID ); EFI_STATUS EFIAPI status byte at the last position of the CMOS buffer.( VOID ); EFI_STATUS EFIAPI = *(UINT8 *)(*(UINT64 *)((UINT8 *)CmosProtocol + 8) + 127);( VOID ); EFI_STATUS EFIAPI the CMOS access protocol (gCmosAccessProtocolGuid).( VOID ); EFI_STATUS EFIAPI a checksum from its register-database fields.( VOID ); EFI_STATUS EFIAPI offset +24 -> +8 -> +4/+8( VOID ); EFI_STATUS EFIAPI result in internal format.( VOID ); EFI_STATUS EFIAPI (DataSize == 0)( VOID ); EFI_STATUS EFIAPI query: store ChecksumBytes as 2-byte checksum.( VOID ); EFI_STATUS EFIAPI (sub_B9C)( VOID ); EFI_STATUS EFIAPI callback. Invoked when the hardware-configuration formset is( VOID ); EFI_STATUS EFIAPI all signature components.( VOID ); EFI_STATUS EFIAPI (2, 0, NULL); // memory size( VOID ); EFI_STATUS EFIAPI byte( VOID ); EFI_STATUS EFIAPI DWORD( VOID ); EFI_STATUS EFIAPI checksum( VOID ); EFI_STATUS EFIAPI previous update count via RuntimeServices variable.( VOID ); EFI_STATUS EFIAPI = &gHardwareSignatureVarGuid; // unk_1D68( VOID ); EFI_STATUS EFIAPI any recorded change codes.( VOID ); EFI_STATUS EFIAPI (gChangeListIndex >= 2)( VOID ); EFI_STATUS EFIAPI the event (complete the notification).( VOID ); EFI_STATUS EFIAPI = gBS->SignalEvent (gHardwareConfigVarStore);( VOID ); EFI_STATUS EFIAPI the hardware formset and write the updated count into storage.( VOID ); EFI_STATUS EFIAPI = (VOID *)FindHardwareFormset (&gHardwareFormsetGuid);( VOID ); EFI_STATUS EFIAPI update count is written at offset +8 inside the formset( VOID ); EFI_STATUS EFIAPI block.( VOID ); EFI_STATUS EFIAPI completion on the notification event.( VOID ); EFI_STATUS EFIAPI (sub_F68)( VOID ); EFI_STATUS EFIAPI UEFI memory map and sums physical RAM pages.( VOID ); EFI_STATUS EFIAPI required buffer size.( VOID ); EFI_STATUS EFIAPI = gBS->GetMemoryMap (( VOID ); EFI_STATUS EFIAPI MapSize to page boundary.( VOID ); EFI_STATUS EFIAPI = ALIGN_VALUE (MapSize + EFI_PAGE_SIZE, EFI_PAGE_SIZE);( VOID ); EFI_STATUS EFIAPI descriptors and sum conventional + firmware + ACPI reclaim( VOID ); EFI_STATUS EFIAPI = Map;( VOID ); EFI_STATUS EFIAPI pages of types 0,2..4,7..8,0xA..0xB (conventional + reserved +( VOID ); EFI_STATUS EFIAPI reclaim + ACPI NVS + runtime)( VOID ); EFI_STATUS EFIAPI (MapPtr->Type != 1 && MapPtr->Type != 5 &&( VOID ); EFI_STATUS EFIAPI page-count bits for a packed size estimate:( VOID ); EFI_STATUS EFIAPI += (PhysicalStart >> 12) & (bits 0-7)( VOID ); EFI_STATUS EFIAPI += (MapPtr->PhysicalStart >> 12) +( VOID ); EFI_STATUS EFIAPI result: the sum of page bits plus CachePages.( VOID ); EFI_STATUS EFIAPI = TotalPages + CachePages;( VOID ); EFI_STATUS EFIAPI (sub_11A8)( VOID ); EFI_STATUS EFIAPI HII handles and builds a table of string identifiers( VOID ); EFI_STATUS EFIAPI call to get the number of handles.( VOID ); EFI_STATUS EFIAPI = NULL;( VOID ); EFI_STATUS EFIAPI again.( VOID ); EFI_STATUS EFIAPI (UINTN idx = 0; idx < HandleCount; idx++)( VOID ); EFI_STATUS EFIAPI the HII string protocol on each handle.( VOID ); EFI_STATUS EFIAPI = gBS->OpenProtocol (( VOID ); EFI_STATUS EFIAPI string attributes (language, etc.)( VOID ); EFI_STATUS EFIAPI = StringProtocol->GetString (( VOID ); EFI_STATUS EFIAPI ID( VOID ); EFI_STATUS EFIAPI table entry: 10 bytes per handle.( VOID ); EFI_STATUS EFIAPI EntryBase;( VOID ); EFI_STATUS EFIAPI (sub_13D8)( VOID ); EFI_STATUS EFIAPI HII formsets matching known GUID patterns, extracts( VOID ); EFI_STATUS EFIAPI details in the accompanying .md( VOID ); EFI_STATUS EFIAPI DebugAssert via the HII database protocol's DEBUG output.( VOID ); EFI_STATUS EFIAPI for brevity( VOID ); EFI_STATUS EFIAPI the two's complement of Buffer[0] (checksum).( VOID ); EFI_STATUS EFIAPI decompiled logic: return -*Buffer;( VOID ); EFI_STATUS EFIAPI is the arithmetic negation (two's complement of the first byte).( VOID ); EFI_STATUS EFIAPI (UINT8)(-(INT8)*Buffer);( VOID ); EFI_STATUS EFIAPI in-place quicksort (Hoare partition scheme).( VOID ); EFI_STATUS EFIAPI Pivot;( VOID ); EFI_STATUS EFIAPI of reverse-engineered representation.( VOID ); #endif /* __HARDWARESIGNATUREENTRY_H__ */