Newer
Older
AMI-Aptio-BIOS-Reversed / PiSmmIpl / PiSmmIpl.c
@Ajax Dong Ajax Dong 2 days ago 52 KB Init
#include "PiSmmIpl.h"

//
// PiSmmIpl.efi - SMM IPL Driver
// Auto-decompiled from HR650X BIOS
// Full decompilation of all functions
//

// =============================================================================
// _ModuleEntryPoint @ 0x1128
// =============================================================================

EFI_STATUS ModuleEntryPoint(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable)
{
 signed __int64 Result; // rbx sub_1154(ImageHandle, SystemTable); /*0x1131*/
 Result = sub_2598(ImageHandle); /*0x113e*/
 if ( Result < 0 ) /*0x1144*/
 sub_1504(); /*0x1146*/
 return Result; /*0x114e*/
}

// =============================================================================
// sub_1154 @ 0x1154
// =============================================================================

__int64 sub_1154(__int64 ImageHandle, EFI_SYSTEM_TABLE *SystemTable)
{
 EFI_BOOT_SERVICES *BootServices; // r10 __int64 BootServices_1; // r10 __int64 Status; // rax __int64 Status; // rax __int64 Status; // rbx __int64 Status; // rax __int64 Status; // rbx __int64 Status; // rax __int64 result; // rax

 ::ImageHandle = ImageHandle; /*0x116c*/
 if ( !ImageHandle ) /*0x1180*/
 sub_2E00( /*0x118f*/
 "e:\\hs\\MdePkg\\Library\\UefiBootServicesTableLib\\UefiBootServicesTableLib.c",
 51,
 "gImageHandle != ((void *) 0)");
 ::SystemTable = (__int64)SystemTable; /*0x1194*/
 if ( !SystemTable ) /*0x119e*/
 sub_2E00("e:\\hs\\MdePkg\\Library\\UefiBootServicesTableLib\\UefiBootServicesTableLib.c", 57, "gST != ((void *) 0)"); /*0x11ad*/
 ::BootServices = (__int64)SystemTable->BootServices; /*0x11b6*/
 if ( !::BootServices ) /*0x11c0*/
 sub_2E00("e:\\hs\\MdePkg\\Library\\UefiBootServicesTableLib\\UefiBootServicesTableLib.c", 63, "gBS != ((void *) 0)"); /*0x11cf*/
 RuntimeServices = (__int64)SystemTable->RuntimeServices; /*0x11d8*/
 if ( !RuntimeServices ) /*0x11e2*/
 sub_2E00( /*0x11f5*/
 "e:\\hs\\MdePkg\\Library\\UefiRuntimeServicesTableLib\\UefiRuntimeServicesTableLib.c",
 47,
 "gRT != ((void *) 0)");
 BootServices = SystemTable->BootServices; /*0x1205*/
 RuntimeServices_0 = (__int64)SystemTable->RuntimeServices; /*0x120c*/
 BootServices_0 = (__int64)BootServices; /*0x121f*/
 ((void ( *)(__int64, __int64, __int64 ( *)()))BootServices->CreateEvent)(513, 8, sub_2E40); /*0x1231*/
 (*(void ( **)(__int64, __int64, __int64 ( *)(), _QWORD, __int64 *))(BootServices_0 + 80))( /*0x1259*/
 1610613250,
 8,
 sub_2E4C,
 0,
 &qword_6420);
 sub_2FAC(); /*0x125c*/
 if ( !RuntimeServices ) /*0x1269*/
 sub_2E00("e:\\hs\\MdePkg\\Library\\UefiRuntimeLib\\RuntimeLib.c", 95, "gRT != ((void *) 0)"); /*0x127c*/
 BootServices_1 = ::BootServices; /*0x1281*/
 if ( !::BootServices ) /*0x128b*/
 {
 sub_2E00("e:\\hs\\MdePkg\\Library\\UefiRuntimeLib\\RuntimeLib.c", 96, "gBS != ((void *) 0)"); /*0x129f*/
 BootServices_1 = ::BootServices; /*0x12a4*/
 }
 RuntimeServices_1 = RuntimeServices; /*0x12bc*/
 Status = (*(__int64 ( **)(__int64, __int64, __int64 ( *)()))(BootServices_1 + 368))(512, 16, sub_3034); /*0x12e7*/
 if ( Status < 0 ) /*0x1304*/
 {
 sub_2D80(0x80000000LL, "\nASSERT_EFI_ERROR (Status = %r)\n", Status); /*0x130e*/
 sub_2E00("e:\\hs\\MdePkg\\Library\\UefiRuntimeLib\\RuntimeLib.c", 111, "!EFI_ERROR (Status)"); /*0x1321*/
 }
 Status = (*(__int64 ( **)(__int64, __int64, __int64 ( *)(), _QWORD, void *, __int64 *))(::BootServices + 368))( /*0x1357*/
 512,
 16,
 nullsub_1,
 0,
 &unk_60B0,
 &qword_6488);
 Status = Status; /*0x135d*/
 if ( Status < 0 ) /*0x1363*/
 {
 sub_2D80(0x80000000LL, "\nASSERT_EFI_ERROR (Status = %r)\n", Status); /*0x136e*/
 sub_2E00("e:\\hs\\MdePkg\\Library\\UefiRuntimeLib\\RuntimeLib.c", 122, "!EFI_ERROR (Status)"); /*0x1382*/
 sub_2D80(0x80000000LL, "\nASSERT_EFI_ERROR (Status = %r)\n", Status); /*0x1390*/
 sub_2E00( /*0x13a4*/
 "e:\\hs\\Build\\HR6N0XMLK\\DEBUG_VS2015\\X64\\MdeModulePkg\\Core\\PiSmmCore\\PiSmmIpl\\DEBUG\\AutoGen.c",
 313,
 "!EFI_ERROR (Status)");
 }
 Status = sub_2EE8(&unk_60F0, &qword_6448); /*0x13b7*/
 Status = Status; /*0x13bc*/
 if ( Status < 0 ) /*0x13c2*/
 {
 sub_2D80(0x80000000LL, "\nASSERT_EFI_ERROR (Status = %r)\n", Status); /*0x13cd*/
 sub_2E00("e:\\hs\\MdePkg\\Library\\DxeServicesTableLib\\DxeServicesTableLib.c", 64, "!EFI_ERROR (Status)"); /*0x13e1*/
 }
 if ( !qword_6448 ) /*0x13ee*/
 sub_2E00("e:\\hs\\MdePkg\\Library\\DxeServicesTableLib\\DxeServicesTableLib.c", 65, "gDS != ((void *) 0)"); /*0x1403*/
 if ( Status < 0 ) /*0x140b*/
 {
 sub_2D80(0x80000000LL, "\nASSERT_EFI_ERROR (Status = %r)\n", Status); /*0x1416*/
 sub_2E00( /*0x142a*/
 "e:\\hs\\Build\\HR6N0XMLK\\DEBUG_VS2015\\X64\\MdeModulePkg\\Core\\PiSmmCore\\PiSmmIpl\\DEBUG\\AutoGen.c",
 316,
 "!EFI_ERROR (Status)");
 }
 sub_43C4(); /*0x142f*/
 Status = (*(__int64 ( **)(__int64, __int64, __int64 ( *)(), _QWORD, void *, __int64 *))(::BootServices + 368))( /*0x145e*/
 512,
 16,
 sub_4424,
 0,
 &unk_60E0,
 &qword_6468);
 if ( Status < 0 ) /*0x1467*/
 {
 sub_2D80(0x80000000LL, "\nASSERT_EFI_ERROR (Status = %r)\n", Status); /*0x1472*/
 sub_2E00( /*0x1486*/
 "e:\\hs\\MdeModulePkg\\Library\\RuntimeDxeReportStatusCodeLib\\ReportStatusCodeLib.c",
 152,
 "!EFI_ERROR (Status)");
 }
 result = (*(__int64 ( **)(__int64, __int64, __int64 ( *)(), _QWORD, void *, __int64 *))(::BootServices + 368))( /*0x14bc*/
 512,
 16,
 sub_444C,
 0,
 &unk_60B0,
 &qword_6470);
 if ( result < 0 ) /*0x14c5*/
 {
 sub_2D80(0x80000000LL, "\nASSERT_EFI_ERROR (Status = %r)\n", result); /*0x14d0*/
 return sub_2E00( /*0x14e4*/
 "e:\\hs\\MdeModulePkg\\Library\\RuntimeDxeReportStatusCodeLib\\ReportStatusCodeLib.c",
 165,
 "!EFI_ERROR (Status)");
 }
 return result; /*0x14f8*/
}

// =============================================================================
// sub_1504 @ 0x1504
// =============================================================================

__int64 sub_1504()
{
 __int64 BootServices; // rax __int64 Status; // rax __int64 Status; // rax __int64 BootServices_1; // rax __int64 Status; // rax __int64 Status; // rax __int64 Status; // rbx BootServices = BootServices; /*0x1518*/
 if ( !BootServices ) /*0x1529*/
 {
 sub_2E00( /*0x153a*/
 "e:\\hs\\MdeModulePkg\\Library\\RuntimeDxeReportStatusCodeLib\\ReportStatusCodeLib.c",
 191,
 "gBS != ((void *) 0)");
 BootServices = BootServices; /*0x153f*/
 }
 Status = (*(__int64 ( **)(__int64))(BootServices + 112))(qword_6468); /*0x154d*/
 if ( Status < 0 ) /*0x1566*/
 {
 sub_2D80(0x80000000LL, "\nASSERT_EFI_ERROR (Status = %r)\n", Status); /*0x1570*/
 sub_2E00( /*0x1580*/
 "e:\\hs\\MdeModulePkg\\Library\\RuntimeDxeReportStatusCodeLib\\ReportStatusCodeLib.c",
 193,
 "!EFI_ERROR (Status)");
 }
 Status = (*(__int64 ( **)(__int64))(BootServices + 112))(qword_6470); /*0x1593*/
 if ( Status < 0 ) /*0x1599*/
 {
 sub_2D80(0x80000000LL, "\nASSERT_EFI_ERROR (Status = %r)\n", Status); /*0x15a4*/
 sub_2E00( /*0x15b4*/
 "e:\\hs\\MdeModulePkg\\Library\\RuntimeDxeReportStatusCodeLib\\ReportStatusCodeLib.c",
 196,
 "!EFI_ERROR (Status)");
 }
 BootServices_1 = BootServices; /*0x15b9*/
 if ( !BootServices ) /*0x15c3*/
 {
 sub_2E00("e:\\hs\\MdePkg\\Library\\UefiRuntimeLib\\RuntimeLib.c", 151, "gBS != ((void *) 0)"); /*0x15d8*/
 BootServices_1 = BootServices; /*0x15dd*/
 }
 Status = (*(__int64 ( **)(__int64))(BootServices_1 + 112))(qword_6478); /*0x15eb*/
 if ( Status < 0 ) /*0x15f1*/
 {
 sub_2D80(0x80000000LL, "\nASSERT_EFI_ERROR (Status = %r)\n", Status); /*0x15fc*/
 sub_2E00("e:\\hs\\MdePkg\\Library\\UefiRuntimeLib\\RuntimeLib.c", 153, "!EFI_ERROR (Status)"); /*0x1610*/
 }
 Status = (*(__int64 ( **)(__int64))(BootServices + 112))(qword_6488); /*0x1623*/
 Status = Status; /*0x1626*/
 if ( Status < 0 ) /*0x162c*/
 {
 sub_2D80(0x80000000LL, "\nASSERT_EFI_ERROR (Status = %r)\n", Status); /*0x1637*/
 sub_2E00("e:\\hs\\MdePkg\\Library\\UefiRuntimeLib\\RuntimeLib.c", 156, "!EFI_ERROR (Status)"); /*0x164b*/
 sub_2D80(0x80000000LL, "\nASSERT_EFI_ERROR (Status = %r)\n", Status); /*0x1659*/
 sub_2E00( /*0x166d*/
 "e:\\hs\\Build\\HR6N0XMLK\\DEBUG_VS2015\\X64\\MdeModulePkg\\Core\\PiSmmCore\\PiSmmIpl\\DEBUG\\AutoGen.c",
 359,
 "!EFI_ERROR (Status)");
 }
 (*(void ( **)(__int64))(BootServices_0 + 112))(qword_6418); /*0x1680*/
 return (*(__int64 ( **)(__int64))(BootServices_0 + 112))(qword_6420);
}

// =============================================================================
// sub_16CC @ 0x16CC
// =============================================================================

unsigned __int64 sub_16CC(__int64 a1, _QWORD *a2)
{
 if ( !a1 || !a2 ) /*0x16d4*/
 return 0x8000000000000002uLL; /*0x16f8*/
 if ( !off_6130[41] ) // "smmc" /*0x16dd*/
 return 0x8000000000000003uLL; /*0x16e3*/
 *a2 = *((_QWORD *)off_6130 + 6); // "smmc" /*0x16f2*/
 return 0; /*0x16ed*/
}

// =============================================================================
// sub_1704 @ 0x1704
// =============================================================================

unsigned __int64 sub_1704(__int64 a1, __int64 a2, _QWORD *p_n25)
{
 char *_smmc_; // rax char _smmc__1; // di char *_smmc__2; // rax __int64 Status; // rax if ( !a2 || !p_n25 || *p_n25 < 0x18u ) /*0x172d*/
 return 0x8000000000000002uLL; /*0x17f6*/
 _smmc_ = smmc_; // "smmc" /*0x1733*/
 _smmc__1 = smmc_[41]; // "smmc" /*0x173a*/
 if ( _smmc__1 || !smmc_[40] ) // "smmc" /*0x1743*/
 {
 if ( !byte_6440 && (_smmc__1 || *(_BYTE *)(qword_6490 + 33) && !*(_BYTE *)(qword_6490 + 32)) ) /*0x17ae*/
 {
 smmc_[41] = 1; // "smmc" /*0x17b4*/
 *p_n25 -= 24LL; /*0x17bb*/
 Status = (*(__int64 ( **)(__int64, _QWORD, __int64, _QWORD *))(*((_QWORD *)_smmc_ + 6) + 216LL))( /*0x17cc*/
 a2,
 0,
 a2 + 24,
 p_n25);
 *p_n25 += 24LL; /*0x17d2*/
 smmc_[41] = _smmc__1; // "smmc" /*0x17e3*/
 return -(__int64)(Status != 0) & 0x800000000000000EuLL; /*0x17f4*/
 }
 return 0x8000000000000002uLL; /*0x17b2*/
 }
 *((_QWORD *)smmc_ + 8) = *p_n25; // "smmc" /*0x1752*/
 *((_QWORD *)_smmc_ + 7) = a2; /*0x1759*/
 if ( (*(__int64 ( **)(__int64, _QWORD, _QWORD, _QWORD, _QWORD))qword_64A0)(qword_64A0, 0, 0, 0, 0) < 0 ) /*0x176e*/
 return 0x8000000000000003uLL; /*0x1770*/
 _smmc__2 = smmc_; // "smmc" /*0x177f*/
 *p_n25 = *((_QWORD *)smmc_ + 8); // "smmc" /*0x178a*/
 return *((_QWORD *)_smmc__2 + 9); /*0x1805*/
}

// =============================================================================
// sub_180C @ 0x180C
// =============================================================================

unsigned __int64 sub_180C()
{
 __int64 n25; // [rsp+40h] [rbp+18h] BYREF sub_2B38(&unk_64C0); /*0x1817*/
 qword_64D0 = 1; /*0x1821*/
 byte_64D8 = 0; /*0x1833*/
 n25 = 25; /*0x1841*/
 return sub_1704((__int64)&off_61A8, (__int64)&unk_64C0, &n25); /*0x184f*/
}

// =============================================================================
// sub_1854 @ 0x1854
// =============================================================================

void sub_1854()
{
 byte_63E8 = 1; /*0x1854*/
}

// =============================================================================
// sub_185C @ 0x185C
// =============================================================================

unsigned __int64 sub_185C()
{
 __int64 Status; // rax unsigned __int64 result; // rax __int64 p_n25; // [rsp+40h] [rbp+18h] BYREF sub_2B38(&qword_64C0); /*0x1870*/
 while ( 1 ) /*0x1913*/
 {
 qword_64D0 = 1; /*0x1913*/
 n2 = 0; /*0x1921*/
 p_n25 = 25; /*0x192f*/
 result = sub_1704((__int64)&off_61A8, (__int64)&qword_64C0, &p_n25); /*0x1938*/
 if ( n2 != 2 ) /*0x1944*/
 break; /*0x1944*/
 if ( (*(__int64 ( **)(__int64, __int64, __int64))(qword_6448 + 64))(qword_64E0, qword_64E8, 1) < 0 ) /*0x189d*/
 sub_2D80(2, "SMM IPL failed to reset SMRAM window to EFI_MEMORY_UC\n"); /*0x18ab*/
 Status = (*(__int64 ( **)(__int64))(qword_6490 + 8))(qword_6490); /*0x18ba*/
 if ( Status < 0 ) /*0x18c0*/
 {
 sub_2D80(0x80000000LL, "\nASSERT_EFI_ERROR (Status = %r)\n", Status); /*0x18d1*/
 sub_2E00("e:\\hs\\MdeModulePkg\\Core\\PiSmmCore\\PiSmmIpl.c", 667, "!EFI_ERROR (Status)"); /*0x18e9*/
 }
 sub_2D80(64, "SMM IPL closed SMRAM window\n"); /*0x18fa*/
 sub_2B38(&qword_64C0); /*0x1909*/
 }
 return result; /*0x194f*/
}

// =============================================================================
// sub_1958 @ 0x1958
// =============================================================================

__int64 sub_1958(__int64 a1, __int64 a2)
{
 __int64 result; // rax __int64 Status; // rax char *v4; // r8 __int64 Result; // [rsp+40h] [rbp+18h] BYREF result = (*(__int64 ( **)(__int64, _QWORD, __int64 *))(BootServices + 320))(a2, 0, &Result); /*0x196d*/
 if ( result >= 0 ) /*0x1976*/
 {
 Status = (*(__int64 ( **)(__int64, _QWORD))(Result + 8))(Result, *((_QWORD *)off_6130 + 4));// "smmc" /*0x198b*/
 if ( Status < 0 ) /*0x1991*/
 {
 sub_2D80(0x80000000LL, "\nASSERT_EFI_ERROR (Status = %r)\n", Status); /*0x19a2*/
 sub_2E00("e:\\hs\\MdeModulePkg\\Core\\PiSmmCore\\PiSmmIpl.c", 705, "!EFI_ERROR (Status)"); /*0x19ba*/
 }
 v4 = off_6130; // "smmc" /*0x19bf*/
 off_6130[40] = 1; // "smmc" /*0x19d2*/
 return sub_2D80(64, "SMM IPL registered SMM Entry Point address %p\n", *((const void **)v4 + 4)); /*0x19db*/
 }
 return result; /*0x19e0*/
}

// =============================================================================
// sub_19E8 @ 0x19E8
// =============================================================================

__int64 sub_19E8(__int64 a1, __int64 a2)
{
 __int64 result; // rax __int64 Index; // rbx __int64 v4; // rax char v5; // [rsp+40h] [rbp+18h] BYREF result = a2; /*0x19fe*/
 if ( !byte_63E9 ) /*0x1a04*/
 {
 if ( (unsigned __int8)sub_2B80(a2, &unk_6050) ) /*0x1a14*/
 {
 result = (*(__int64 ( **)(void *, _QWORD, char *))(BootServices + 320))(&unk_6050, 0, &v5); /*0x1a32*/
 if ( result < 0 ) /*0x1a3b*/
 return result; /*0x1a3b*/
 }
 else
 {
 sub_2D80(2, "SMM IPL! DXE SMM Ready To Lock Protocol not installed before Ready To Boot signal\n"); /*0x1a4f*/
 }
 if ( !byte_63E8 ) /*0x1a5b*/
 {
 sub_2D80(0x80000000LL, "EndOfDxe Event must be signaled before DxeSmmReadyToLock Protocol installation!\n"); /*0x1a69*/
 sub_4464(); /*0x1a6e*/
 sub_2E00("e:\\hs\\MdeModulePkg\\Core\\PiSmmCore\\PiSmmIpl.c", 768, "((BOOLEAN)(0==1))"); /*0x1a86*/
 }
 (*(void ( **)(__int64))(qword_6490 + 16))(qword_6490); /*0x1a95*/
 Index = 0; /*0x1a98*/
 if ( off_61C0 ) /*0x1aa1*/
 {
 v4 = 0; /*0x1aa3*/
 do /*0x1acd*/
 {
 if ( *((_BYTE *)&unk_61B0 + v4 + 1) ) /*0x1aac*/
 (*(void ( **)(_QWORD))(BootServices + 112))(*(_QWORD *)((char *)&unk_61B0 + v4 + 40)); /*0x1abf*/
 ++Index; /*0x1ac2*/
 v4 = 48 *Index; /*0x1ac9*/
 }
 while ( *((_QWORD *)&unk_61B0 + 6 *Index + 2) ); /*0x1acd*/
 }
 sub_180C(); /*0x1adf*/
 result = sub_2D80(64, "SMM IPL locked SMRAM window\n"); /*0x1af0*/
 byte_63E9 = 1; /*0x1af5*/
 }
 return result; /*0x1b06*/
}

// =============================================================================
// sub_1AA8 @ 0x1AA8
// =============================================================================

__int64 sub_19E8(__int64 a1, __int64 a2)
{
 __int64 result; // rax __int64 Index; // rbx __int64 v4; // rax char v5; // [rsp+40h] [rbp+18h] BYREF result = a2; /*0x19fe*/
 if ( !byte_63E9 ) /*0x1a04*/
 {
 if ( (unsigned __int8)sub_2B80(a2, &unk_6050) ) /*0x1a14*/
 {
 result = (*(__int64 ( **)(void *, _QWORD, char *))(BootServices + 320))(&unk_6050, 0, &v5); /*0x1a32*/
 if ( result < 0 ) /*0x1a3b*/
 return result; /*0x1a3b*/
 }
 else
 {
 sub_2D80(2, "SMM IPL! DXE SMM Ready To Lock Protocol not installed before Ready To Boot signal\n"); /*0x1a4f*/
 }
 if ( !byte_63E8 ) /*0x1a5b*/
 {
 sub_2D80(0x80000000LL, "EndOfDxe Event must be signaled before DxeSmmReadyToLock Protocol installation!\n"); /*0x1a69*/
 sub_4464(); /*0x1a6e*/
 sub_2E00("e:\\hs\\MdeModulePkg\\Core\\PiSmmCore\\PiSmmIpl.c", 768, "((BOOLEAN)(0==1))"); /*0x1a86*/
 }
 (*(void ( **)(__int64))(qword_6490 + 16))(qword_6490); /*0x1a95*/
 Index = 0; /*0x1a98*/
 if ( off_61C0 ) /*0x1aa1*/
 {
 v4 = 0; /*0x1aa3*/
 do /*0x1acd*/
 {
 if ( *((_BYTE *)&unk_61B0 + v4 + 1) ) /*0x1aac*/
 (*(void ( **)(_QWORD))(BootServices + 112))(*(_QWORD *)((char *)&unk_61B0 + v4 + 40)); /*0x1abf*/
 ++Index; /*0x1ac2*/
 v4 = 48 *Index; /*0x1ac9*/
 }
 while ( *((_QWORD *)&unk_61B0 + 6 *Index + 2) ); /*0x1acd*/
 }
 sub_180C(); /*0x1adf*/
 result = sub_2D80(64, "SMM IPL locked SMRAM window\n"); /*0x1af0*/
 byte_63E9 = 1; /*0x1af5*/
 }
 return result; /*0x1b06*/
}

// =============================================================================
// sub_1B0C @ 0x1B0C
// =============================================================================

__int64 sub_1B0C()
{
 return (*(__int64 ( **)(_QWORD, __int64 *))(RuntimeServices + 64))(0, &qword_64A0);
}

// =============================================================================
// sub_1B20 @ 0x1B20
// =============================================================================

__int64 sub_1B20(__int64 a1, _QWORD *a2, __int64 a3)
{
 char *v3; // r12 __int64 v4; // r14 __int64 Result; // rbx unsigned __int64 v7; // rax __int64 Index; // rdi __int64 v9; // rsi int v10; // r8d int v11; // r9d __int64 result; // rax unsigned int v13; // r9d unsigned __int64 v14; // rbx unsigned __int64 v15; // rbx __int64 v16; // r8 __int64 v17; // rax char *v18; // r8 unsigned __int64 v19; // [rsp+30h] [rbp-A9h] BYREF __int64 v20; // [rsp+38h] [rbp-A1h] BYREF __int64 v21; // [rsp+40h] [rbp-99h] BYREF __int64 v22; // [rsp+48h] [rbp-91h] BYREF _BYTE v23[8]; // [rsp+50h] [rbp-89h] BYREF _BYTE v24[24]; // [rsp+58h] [rbp-81h] BYREF const void *v25; // [rsp+70h] [rbp-69h] BYREF __int64 v26; // [rsp+78h] [rbp-61h]
 __int64 ( *v27)(char *, __int64); // [rsp+88h] [rbp-51h]
 __int64 ( *sub_422C_1)(__int64, __int64, __int64 *, __int64); // [rsp+90h] [rbp-49h]
 __int64 v29; // [rsp+98h] [rbp-41h]
 unsigned int v30; // [rsp+A8h] [rbp-31h]
 __int64 v31; // [rsp+140h] [rbp+67h] BYREF __int64 v32; // [rsp+150h] [rbp+77h] BYREF __int64 v33; // [rsp+158h] [rbp+7Fh] BYREF v32 = a3; /*0x1b20*/
 v31 = a1; /*0x1b25*/
 v3 = off_6130; // "smmc" /*0x1b40*/
 v4 = qword_6498; /*0x1b4b*/
 v33 = 0; /*0x1b57*/
 LOBYTE(v32) = 13; /*0x1b75*/
 Result = (*(__int64 ( **)(__int64, void *, _QWORD, unsigned __int64 *, __int64 *))(BootServices + 312))( /*0x1b83*/
 2,
 &unk_6060,
 0,
 &v19,
 &v33);
 if ( Result >= 0 ) /*0x1b89*/
 {
 v7 = v19; /*0x1b8f*/
 Index = 0; /*0x1b94*/
 if ( v19 ) /*0x1b99*/
 {
 while ( 1 ) /*0x1bc0*/
 {
 Result = (*(__int64 ( **)(_QWORD, void *, __int64 *))(BootServices + 152))( /*0x1bc0*/
 *(_QWORD *)(v33 + 8 *Index),
 &unk_6060,
 &v22);
 if ( Result >= 0 ) /*0x1bc6*/
 {
 v21 = 0; /*0x1bc8*/
 v9 = 1; /*0x1bce*/
 do /*0x1c0b*/
 {
 Result = (*(__int64 ( **)(__int64, __int64 *, __int64 *, _BYTE *, __int64 *, _BYTE *))(v22 + 40))( /*0x1bff*/
 v22,
 &v21,
 &v32,
 v24,
 &v31,
 v23);
 if ( Result < 0 ) /*0x1c05*/
 break; /*0x1c05*/
 --v9; /*0x1c07*/
 }
 while ( v9 ); /*0x1c0b*/
 if ( !v9 ) /*0x1c10*/
 {
 Result = sub_42D0(*(_QWORD *)(v33 + 8 *Index), (unsigned int)v24, v10, v11, (__int64)&v20, (__int64)v23); /*0x1c38*/
 if ( Result >= 0 ) /*0x1c3e*/
 break; /*0x1c3e*/
 }
 }
 v7 = v19; /*0x1c40*/
 if ( ++Index >= v19 ) /*0x1c4b*/
 goto LABEL_10; /*0x1c4b*/
 }
 }
 else
 {
LABEL_10:
 if ( Index == v7 ) /*0x1c5e*/
 Result = 0x800000000000000EuLL; /*0x1c5e*/
 }
 if ( v33 ) /*0x1c69*/
 sub_2EA4(); /*0x1c6b*/
 }
 if ( Result >= 0 ) /*0x1c73*/
 {
 v29 = v20; /*0x1c82*/
 sub_422C_1 = sub_422C; /*0x1c8d*/
 result = sub_359C(&v25); /*0x1c91*/
 if ( result < 0 ) /*0x1c99*/
 return result; /*0x1c99*/
 v13 = v30; /*0x1c9f*/
 v14 = ((v26 + (unsigned __int64)v30) >> 12) + (((v26 + v30) & 0xFFF) != 0); /*0x1cc2*/
 if ( (*(_DWORD *)(v4 + 16) & 0xFFFLL) != 0 ) /*0x1cc8*/
 {
 sub_2E00( /*0x1cdd*/
 (__int64)"e:\\hs\\MdeModulePkg\\Core\\PiSmmCore\\PiSmmIpl.c",
 1018,
 (__int64)"(SmramRange->PhysicalSize & 0xFFF) == 0");
 v13 = v30; /*0x1ce2*/
 }
 v15 = v14 << 12; /*0x1ce6*/
 if ( *(_QWORD *)(v4 + 16) <= v15 ) /*0x1cee*/
 {
 sub_2E00( /*0x1d03*/
 (__int64)"e:\\hs\\MdeModulePkg\\Core\\PiSmmCore\\PiSmmIpl.c",
 1019,
 (__int64)"SmramRange->PhysicalSize > ((PageCount) << 12)");
 v13 = v30; /*0x1d08*/
 }
 *(_QWORD *)(v4 + 16) -= v15; /*0x1d0c*/
 v16 = *(_QWORD *)(v4 + 8) + *(_QWORD *)(v4 + 16); /*0x1d1f*/
 a2[1] = v16; /*0x1d28*/
 *a2 = *(_QWORD *)(v4 + 16) + *(_QWORD *)v4; /*0x1d38*/
 v17 = *(_QWORD *)(v4 + 24) | 0x10LL; /*0x1d3f*/
 a2[2] = v15; /*0x1d43*/
 a2[3] = v17; /*0x1d47*/
 v25 = (const void *)(~(v13 - 1LL) & (v13 - 1 + v16)); /*0x1d57*/
 sub_2D80(64, "SMM IPL loading SMM Core at SMRAM address %p\n", v25); /*0x1d5b*/
 Result = sub_3C30(&v25); /*0x1d69*/
 if ( Result >= 0 ) /*0x1d6f*/
 {
 Result = sub_3910(&v25); /*0x1d7e*/
 if ( Result >= 0 ) /*0x1d84*/
 {
 if ( v26 ) /*0x1d91*/
 {
 if ( v26 - 1 > (unsigned __int64)(-1LL - (_QWORD)v25) ) /*0x1da1*/
 sub_2E00( /*0x1db4*/
 (__int64)"e:\\hs\\MdePkg\\Library\\BaseCacheMaintenanceLib\\X86Cache.c",
 69,
 (__int64)"(Length - 1) <= (0xFFFFFFFFFFFFFFFFULL - (UINTN)Address)");
 }
 sub_2D80(64, "SMM IPL calling SMM Core at SMRAM address %p\n", v27); /*0x1dc7*/
 v18 = off_6130; // "smmc" /*0x1dcc*/
 *((_QWORD *)off_6130 + 10) = v25; // "smmc" /*0x1de1*/
 *((_QWORD *)v18 + 11) = v26; /*0x1de9*/
 sub_2D80(64, "PiSmmCoreImageBase - 0x%016lx\n", *((_QWORD *)v18 + 10)); /*0x1df1*/
 sub_2D80(64, "PiSmmCoreImageSize - 0x%016lx\n", *((_QWORD *)off_6130 + 11));// "smmc" /*0x1e0b*/
 *((_QWORD *)off_6130 + 12) = v27; // "smmc" /*0x1e1e*/
 Result = v27(v3, SystemTable); /*0x1e2c*/
 }
 }
 sub_2EA4(); /*0x1e34*/
 }
 return Result; /*0x1e3c*/
}

// =============================================================================
// sub_1E50 @ 0x1E50
// =============================================================================

__int64 sub_1E50(
 _QWORD *a1,
 unsigned __int64 *a2,
 __int64 a3,
 __int64 *a4,
 __int64 a5,
 __int64 *a6,
 __int64 a7,
 __int64 *a8)
{
 __int64 result; // rax unsigned __int64 v9; // r10 unsigned __int64 v11; // rcx unsigned __int64 v13; // rdi unsigned __int64 v15; // rsi __int64 v16; // rax __int64 v17; // r10 __int64 v18; // r8 __int64 v19; // rcx __int64 v20; // rdx __int64 v21; // rdx __int64 v22; // rcx __int64 v23; // rcx unsigned __int64 v24; // rax __int64 v25; // r8 __int64 v26; // rcx __int64 v27; // rdx __int64 v28; // rcx __int64 v29; // rdx __int64 v30; // rcx __int64 v31; // rcx _UNKNOWN *retaddr; // [rsp+8h] [rbp+0h] BYREF result = (__int64)&retaddr; /*0x1e50*/
 v9 = *a2; /*0x1e65*/
 v11 = a1[1]; /*0x1e6b*/
 v13 = *a2 + a2[1]; /*0x1e79*/
 v15 = v11 + a1[2]; /*0x1e83*/
 if ( *a2 <= v11 ) /*0x1e89*/
 {
 if ( v11 < v13 ) /*0x1e92*/
 {
 a2[1] = v11 - v9; /*0x1e9b*/
 v16 = a1[1]; /*0x1e9f*/
 if ( v15 >= v13 ) /*0x1ea6*/
 {
 v21 = *a8; /*0x1f2c*/
 v22 = 32 * *a8; /*0x1f32*/
 *(_QWORD *)(v22 + a7 + 8) = v16; /*0x1f36*/
 *(_QWORD *)(v22 + a7) = *a1; /*0x1f3e*/
 *(_QWORD *)(v22 + a7 + 24) = a1[3] | 0x10LL; /*0x1f4a*/
 *(_QWORD *)(v22 + a7 + 16) = v13 - a1[1]; /*0x1f53*/
 *a8 = v21 + 1; /*0x1f5c*/
 v23 = 32 * (v21 + 1); /*0x1f5f*/
 a1[1] += *(_QWORD *)(v23 + a7 - 16); /*0x1f68*/
 *a1 += *(_QWORD *)(v23 + a7 - 16); /*0x1f71*/
 result = *(_QWORD *)(v23 + a7 - 16); /*0x1f74*/
 a1[2] -= result; /*0x1f79*/
 }
 else
 {
 v17 = *a8; /*0x1eb7*/
 v18 = *a6; /*0x1eba*/
 v19 = 32 * *a8; /*0x1ec0*/
 *(_QWORD *)(v19 + a7 + 8) = v16; /*0x1ec4*/
 *(_QWORD *)(v19 + a7) = *a1; /*0x1ecc*/
 *(_QWORD *)(v19 + a7 + 24) = a1[3] | 0x10LL; /*0x1ed8*/
 ++v17; /*0x1edd*/
 *(_QWORD *)(v19 + a7 + 16) = a1[2]; /*0x1ee4*/
 a1[2] = 0; /*0x1ee9*/
 *a8 = v17; /*0x1ef3*/
 v20 = 2 *v18; /*0x1efd*/
 *(_QWORD *)(a5 + 8 *v20) = *(_QWORD *)(32 *v17 + a7 - 16) + *(_QWORD *)(32 *v17 + a7 - 24); /*0x1f0a*/
 *(_QWORD *)(a5 + 8 *v20 + 8) = v13 - v15; /*0x1f15*/
 *a6 = v18 + 1; /*0x1f1a*/
 return v18 + 1; /*0x1f11*/
 }
 return result; /*0x1f1d*/
 }
 if ( v9 < v11 ) /*0x1f85*/
 return result; /*0x1f85*/
 }
 if ( v9 < v15 ) /*0x1f8e*/
 {
 a1[2] = v9 - v11; /*0x1f9c*/
 v24 = *a2; /*0x1fa0*/
 if ( v13 >= v15 ) /*0x1fa6*/
 {
 v29 = *a8; /*0x2036*/
 v30 = 32 * *a8; /*0x203c*/
 *(_QWORD *)(v30 + a7 + 8) = v24; /*0x2040*/
 *(_QWORD *)(v30 + a7) = *a1 + a1[2]; /*0x204c*/
 *(_QWORD *)(v30 + a7 + 24) = a1[3] | 0x10LL; /*0x2058*/
 *(_QWORD *)(v30 + a7 + 16) = v15 - *a2; /*0x2060*/
 *a8 = v29 + 1; /*0x2069*/
 v31 = 32 * (v29 + 1); /*0x206c*/
 *a2 += *(_QWORD *)(v31 + a7 - 16); /*0x2075*/
 result = *(_QWORD *)(v31 + a7 - 16); /*0x2078*/
 a2[1] -= result; /*0x207d*/
 }
 else
 {
 v25 = *a8; /*0x1fb1*/
 v26 = 32 * *a8; /*0x1fb7*/
 *(_QWORD *)(v26 + a7 + 8) = v24; /*0x1fbb*/
 *(_QWORD *)(v26 + a7) = *a1 + a1[2]; /*0x1fc7*/
 *(_QWORD *)(v26 + a7 + 24) = a1[3] | 0x10LL; /*0x1fd3*/
 ++v25; /*0x1fd8*/
 *(_QWORD *)(v26 + a7 + 16) = a2[1]; /*0x1fdf*/
 a2[1] = 0; /*0x1fe4*/
 *a8 = v25; /*0x1fe9*/
 v27 = *a4; /*0x1fec*/
 v25 *= 32; /*0x1fef*/
 v28 = 32 * *a4; /*0x1ff6*/
 *(_QWORD *)(v28 + a3 + 8) = *(_QWORD *)(v25 + a7 - 16) + *(_QWORD *)(v25 + a7 - 24); /*0x2004*/
 *(_QWORD *)(v28 + a3) = *(_QWORD *)(v25 + a7 - 16) + *(_QWORD *)(v25 + a7 - 32); /*0x2013*/
 *(_QWORD *)(v28 + a3 + 24) = a1[3]; /*0x201e*/
 *a4 = v27 + 1; /*0x2027*/
 *(_QWORD *)(v28 + a3 + 16) = v15 - v13; /*0x202a*/
 return v27 + 1; /*0x2023*/
 }
 }
 return result; /*0x2095*/
}

// =============================================================================
// sub_2098 @ 0x2098
// =============================================================================

__int64 sub_2098(unsigned __int64 *a1)
{
 __int64 v2; // rax __int64 v3; // rcx unsigned __int64 v4; // rsi unsigned __int64 v5; // rbx _QWORD *v6; // rax unsigned __int64 v7; // r15 __int64 v8; // r12 __int64 v9; // rdi unsigned __int64 v10; // r14 __int64 v11; // rcx __int64 v12; // rcx __int64 v13; // r13 unsigned __int64 v14; // rdi __int64 v15; // r14 __int64 v16; // rax unsigned __int64 v17; // rcx __int64 v18; // r12 unsigned __int64 v19; // rax char v20; // r15 unsigned __int64 *v21; // r14 __int64 v22; // r11 unsigned __int64 *v23; // rbx unsigned __int64 v24; // r8 unsigned __int64 v25; // rdx __int64 v26; // rcx __int64 v27; // rax __int64 v28; // rsi unsigned __int64 v29; // rbx _QWORD *v30; // rax unsigned __int64 v31; // rcx __int64 v32; // r8 _QWORD *v33; // rdx __int64 v34; // rbx __int64 v36; // rdi __int64 v37; // rax __int64 v38; // rbx __int64 v39; // rax _QWORD *v40; // [rsp+40h] ... [9911 chars total]

// =============================================================================
// sub_2598 @ 0x2598
// =============================================================================

__int64 sub_2598(__int64 ImageHandle, __int64 a2)
{
 __int64 v2; // rax __int64 v3; // rax __int64 v4; // rax __int64 v5; // rbx __int64 v6; // rax unsigned __int64 n258048; // rdi __int64 v8; // rdx __int64 v9; // r11 __int64 v10; // r9 _BYTE *v11; // r10 __int64 v12; // rcx unsigned __int64 v13; // rdx __int64 v14; // rcx char v15; // r11 unsigned __int64 v16; // rbx __int64 v17; // r10 __int64 v18; // rax unsigned __int64 v19; // r9 __int64 v20; // r8 __int64 v21; // rax __int64 v22; // rdi __int64 ( **v23)(); // rcx __int64 v24; // rbx __int64 v25; // rbp __int64 v26; // r14 __int64 ( *v27)(); // rsi __int64 v28; // r15 __int64 v29; // rax __int64 v30; // rax __int64 v31; // rax __int64 v33; // rax __int64 v34; // [rsp+70h] [rbp+8h] BYREF __int64 v35; // [rsp+78h] [rbp+10h] BYREF char v36; // [rsp+80h] [rbp+18h] BYREF v35 = a2; /*0x2598*/
 ImageHandle_0 = ImageHandle; /*0x25b9*/
 ... [8958 chars total]

// =============================================================================
// sub_2B38 @ 0x2B38
// =============================================================================

__int64 sub_2B38(__int64 a1, __int64 a2)
{
 __int64 v4; // rax __int64 v5; // rax v4 = sub_2C88(a2); /*0x2b4b*/
 sub_2CB8(a1, v4); /*0x2b56*/
 v5 = sub_2C88(a2 + 8); /*0x2b5f*/
 sub_2CB8(a1 + 8, v5); /*0x2b6b*/
 return a1; /*0x2b78*/
}

// =============================================================================
// sub_2B80 @ 0x2B80
// =============================================================================

bool sub_2B80(__int64 a1, __int64 a2)
{
 __int64 Result; // rsi __int64 v5; // rbx __int64 v6; // rdi __int64 v7; // rax Result = sub_2C88(a1); /*0x2ba2*/
 v5 = sub_2C88(a2); /*0x2bae*/
 v6 = sub_2C88(a1 + 8); /*0x2bba*/
 v7 = sub_2C88(a2 + 8); /*0x2bbd*/
 return Result == v5 && v6 == v7; /*0x2be1*/
}

// =============================================================================
// sub_2BE8 @ 0x2BE8
// =============================================================================

__int64 sub_2BE8(__int64 a1, __int64 a2, __int64 n16)
{
 unsigned __int64 v3; // rbp v3 = n16 - 1; /*0x2c05*/
 if ( n16 - 1 > (unsigned __int64)(-1 - a1) ) /*0x2c1b*/
 sub_2E00( /*0x2c2e*/
 (__int64)"e:\\hs\\MdePkg\\Library\\BaseMemoryLibRepStr\\CopyMemWrapper.c",
 56,
 (__int64)"(Length - 1) <= (0xFFFFFFFFFFFFFFFFULL - (UINTN)DestinationBuffer)");
 if ( v3 > -1 - a2 ) /*0x2c39*/
 sub_2E00( /*0x2c4e*/
 (__int64)"e:\\hs\\MdePkg\\Library\\BaseMemoryLibRepStr\\CopyMemWrapper.c",
 57,
 (__int64)"(Length - 1) <= (0xFFFFFFFFFFFFFFFFULL - (UINTN)SourceBuffer)");
 if ( a1 == a2 ) /*0x2c56*/
 return a1; /*0x2c58*/
 else return sub_1000(a1, a2, n16); /*0x2c66*/
}

// =============================================================================
// sub_2C88 @ 0x2C88
// =============================================================================

__int64 sub_2C88(__int64 a1)
{
 if ( !a1 ) /*0x2c94*/
 sub_2E00("e:\\hs\\MdePkg\\Library\\BaseLib\\Unaligned.c", 192, "Buffer != ((void *) 0)"); /*0x2ca9*/
 return *(_QWORD *)a1; /*0x2cb1*/
}

// =============================================================================
// sub_2CB8 @ 0x2CB8
// =============================================================================

__int64 sub_2CB8(_QWORD *a1, __int64 a2)
{
 if ( !a1 ) /*0x2ccb*/
 sub_2E00("e:\\hs\\MdePkg\\Library\\BaseLib\\Unaligned.c", 219, "Buffer != ((void *) 0)"); /*0x2ce0*/
 *a1 = a2; /*0x2ce5*/
 return a2; /*0x2cf0*/
}

// =============================================================================
// sub_2CF8 @ 0x2CF8
// =============================================================================

__int64 sub_2CF8()
{
 __int64 result; // rax unsigned __int64 n0x10; // rbx __int64 v2; // rax __int64 Result; // rcx result = qword_6430; /*0x2d02*/
 if ( !qword_6430 ) /*0x2d0e*/
 {
 if ( BootServices_0 /*0x2d3c*/
 && (n0x10 = (*(__int64 ( **)(__int64))(BootServices_0 + 24))(31),
 (*(void ( **)(unsigned __int64))(BootServices_0 + 32))(n0x10),
 n0x10 <= 0x10) )
 {
 v2 = (*(__int64 ( **)(void *, _QWORD, __int64 *))(BootServices_0 + 320))(&unk_6000, 0, &qword_6430); /*0x2d55*/
 Result = qword_6430; /*0x2d5b*/
 if ( v2 < 0 ) /*0x2d65*/
 Result = 0; /*0x2d65*/
 qword_6430 = Result; /*0x2d69*/
 return Result; /*0x2d70*/
 }
 else
 {
 return 0; /*0x2d1c*/
 }
 }
 return result; /*0x2d78*/
}

// =============================================================================
// sub_2D80 @ 0x2D80
// =============================================================================

__int64 sub_2D80(__int64 a1, const char *a2, ...)
{
 __int64 result; // rax __int64 v4; // r8 __int64 ( **v5)(__int64, const char *, __int64 *); // r9 unsigned __int8 v6; // al unsigned __int8 n3; // al int Result; // edx va_list va; // [rsp+40h] [rbp+18h] BYREF va_start(va, a2);
 result = sub_2CF8(); /*0x2d97*/
 v4 = 0; /*0x2d9c*/
 v5 = (__int64 ( **)(__int64, const char *, __int64 *))result; /*0x2d9f*/
 if ( result ) /*0x2da5*/
 {
 v6 = __inbyte(0x70u); /*0x2dab*/
 __outbyte(0x70u, v6 & 0x80 | 0x4B); /*0x2db0*/
 Result = 113; /*0x2db1*/
 n3 = __inbyte(0x71u); /*0x2db5*/
 LOBYTE(Result) = n3; /*0x2db6*/
 if ( n3 > 3u ) /*0x2dba*/
 {
 Result = 3; /*0x2dc3*/
 if ( Result ) /*0x2dc9*/
 Result = (unsigned __int8)Result; /*0x2dc9*/
 }
 result = (unsigned int)(Result - 1); /*0x2dcc*/
 if ( (unsigned __int8)(Result - 1) <= 0xFDu ) /*0x2dd1*/
 {
 result = 2147483652LL; /*0x2dd6*/
 v4 = 2147483718LL; /*0x2ddb*/
 if ( (_BYTE)Result == 1 ) /*0x2de1*/
 v4 = 2147483652LL; /*0x2de1*/
 }
 if ( (v4 & a1) != 0 ) /*0x2de8*/
 return (*v5)(a1, a2, (__int64 *)va); /*0x2df7*/
 }
 return result; /*0x2dfa*/
}

// =============================================================================
// sub_2E00 @ 0x2E00
// =============================================================================

__int64 sub_2E00(__int64 a1, __int64 a2, __int64 a3)
{
 __int64 result; // rax result = sub_2CF8(); /*0x2e18*/
 if ( result ) /*0x2e20*/
 return (*(__int64 ( **)(__int64, __int64, __int64))(result + 8))(a1, a2, a3); /*0x2e2b*/
 return result; /*0x2e38*/
}

// =============================================================================
// sub_2E40 @ 0x2E40
// =============================================================================

void sub_2E40()
{
 BootServices_0 = 0; /*0x2e40*/
}

// =============================================================================
// sub_2E4C @ 0x2E4C
// =============================================================================

__int64 sub_2E4C()
{
 __int64 result; // rax if ( qword_6430 ) /*0x2e58*/
 return (*(__int64 ( **)(_QWORD, __int64 *))(RuntimeServices_0 + 64))(0, &qword_6430); /*0x2e6a*/
 return result; /*0x2e6d*/
}

// =============================================================================
// sub_2E74 @ 0x2E74
// =============================================================================

__int64 sub_2E74(__int64 a1, __int64 a2)
{
 __int64 v2; // rax __int64 Result; // rcx __int64 v5; // [rsp+40h] [rbp+18h] BYREF v2 = (*(__int64 ( **)(__int64, __int64, __int64 *))(BootServices + 64))(4, a2, &v5); /*0x2e89*/
 Result = v5; /*0x2e8c*/
 if ( v2 < 0 ) /*0x2e96*/
 return 0; /*0x2e96*/
 return Result; /*0x2e9d*/
}

// =============================================================================
// sub_2EA4 @ 0x2EA4
// =============================================================================

__int64 sub_2EA4()
{
 __int64 result; // rax result = (*(__int64 (**)(void))(BootServices + 72))(); /*0x2eaf*/
 if ( result < 0 ) /*0x2eb5*/
 {
 sub_2D80(0x80000000LL, "\nASSERT_EFI_ERROR (Status = %r)\n", result); /*0x2ec6*/
 return sub_2E00( /*0x2ede*/
 (__int64)"e:\\hs\\MdePkg\\Library\\UefiMemoryAllocationLib\\MemoryAllocationLib.c",
 819,
 (__int64)"!EFI_ERROR (Status)");
 }
 return result; /*0x2ee3*/
}

// =============================================================================
// sub_2EE8 @ 0x2EE8
// =============================================================================

unsigned __int64 sub_2EE8(__int64 a1, _QWORD *a2)
{
 __int64 SystemTable; // rdi __int64 Index; // rbx __int64 i; // r14 if ( !a1 ) /*0x2f0a*/
 sub_2E00((__int64)"e:\\hs\\MdePkg\\Library\\UefiLib\\UefiLib.c", 97, (__int64)"TableGuid != ((void *) 0)"); /*0x2f1d*/
 if ( !a2 ) /*0x2f25*/
 sub_2E00((__int64)"e:\\hs\\MdePkg\\Library\\UefiLib\\UefiLib.c", 98, (__int64)"Table != ((void *) 0)"); /*0x2f38*/
 SystemTable = SystemTable; /*0x2f3d*/
 Index = 0; /*0x2f44*/
 *a2 = 0; /*0x2f46*/
 if ( !*(_QWORD *)(SystemTable + 104) ) /*0x2f4a*/
 return 0x800000000000000EuLL; /*0x2f73*/
 for ( i = 0; !sub_2B80(a1, i + *(_QWORD *)(SystemTable + 112)); i += 24 ) /*0x2f50*/
 {
 if ( (unsigned __int64)++Index >= *(_QWORD *)(SystemTable + 104) ) /*0x2f71*/
 return 0x800000000000000EuLL; /*0x2f71*/
 }
 *a2 = *(_QWORD *)(*(_QWORD *)(SystemTable + 112) + 24 *Index + 16); /*0x2fa7*/
 return 0; /*0x2f91*/
}

// =============================================================================
// sub_2FAC @ 0x2FAC
// =============================================================================

__int64 sub_2FAC()
{
 __int64 result; // rax __int64 Status; // rax result = qword_6438; /*0x2fb0*/
 if ( !qword_6438 ) /*0x2fba*/
 {
 Status = sub_2EE8(&unk_60A0, &qword_6438); /*0x2fca*/
 if ( Status < 0 ) /*0x2fd2*/
 {
 sub_2D80(0x80000000LL, "\nASSERT_EFI_ERROR (Status = %r)\n", Status); /*0x2fe3*/
 sub_2E00((__int64)"e:\\hs\\MdePkg\\Library\\DxeHobLib\\HobLib.c", 54, (__int64)"!EFI_ERROR (Status)"); /*0x2ffb*/
 }
 result = qword_6438; /*0x3000*/
 if ( !qword_6438 ) /*0x300a*/
 {
 sub_2E00((__int64)"e:\\hs\\MdePkg\\Library\\DxeHobLib\\HobLib.c", 55, (__int64)"mHobList != ((void *) 0)"); /*0x301d*/
 return qword_6438; /*0x3022*/
 }
 }
 return result; /*0x3029*/
}

// =============================================================================
// sub_3034 @ 0x3034
// =============================================================================

__int64 sub_3034()
{
 __int64 result; // rax result = (*(__int64 ( **)(_QWORD, __int64 *))(RuntimeServices + 64))(0, &RuntimeServices_1); /*0x3048*/
 byte_6440 = 1; /*0x304b*/
 return result; /*0x3052*/
}

// =============================================================================
// sub_3058 @ 0x3058
// =============================================================================

unsigned __int64 sub_3058(__int64 a1, __int64 a2)
{
 __int64 v3; // rcx bool v4; // zf unsigned int v5; // eax __int64 v6; // r9 __int64 v7; // rcx __int64 v8; // rcx __int16 v9; // ax unsigned __int64 v10; // rdx __int64 v12; // rcx __int64 v13; // rax int v14; // r8d unsigned int v15; // r8d unsigned int v16; // r10d unsigned int v17; // edx unsigned int v18; // edx int v19; // edx int v20; // ecx unsigned int n0x10; // r8d int v22; // r9d unsigned int v23; // r8d unsigned int v24; // r10d unsigned int v25; // edx unsigned int v26; // edx __int16 n3772; // cx unsigned __int64 v28; // r15 unsigned int n40; // esi unsigned int v30; // r14d __int64 v31; // rcx unsigned int v32; // edx int v33; // ecx unsigned __int64 v34; // rax _BYTE v35[12]; // [rsp+20h] [rbp-49h] BYREF unsigned int v36; // [rsp+2Ch] [rbp-3Dh]
 unsigned int v37; // [rsp+30h] [rbp-39h]
 unsigned int v38; // [rsp+34h] [rbp-35h]
 _WORD v39[30]... [11107 chars total]

// =============================================================================
// sub_359C @ 0x359C
// =============================================================================

signed __int64 sub_359C(__int64 a1)
{
 signed __int64 result; // rax char n512_3; // r9 int n523_2; // edx __int16 n523; // r8 char v6; // cl unsigned __int16 Index; // r10 unsigned int v8; // esi __int64 v9; // rax unsigned int n6; // eax char *v11; // r15 unsigned __int64 Index; // rdi unsigned __int64 v13; // r12 __int64 Result; // rsi bool i; // cf __int64 Result; // rcx bool v17; // zf unsigned __int64 v18; // r14 unsigned __int64 v19; // rsi __int64 v20; // rcx unsigned __int64 v21; // r12 __int64 Result; // r14 unsigned __int64 v23; // r15 unsigned __int64 n512_2; // rdi __int64 Result; // rcx unsigned __int64 n512_1; // r8 unsigned __int64 Ptr; // rax unsigned __int64 v28; // rsi __int64 v29; // rcx _BYTE v30[12]; // [rsp+20h] [rbp-E0h] BYREF int n2; // [rsp+2Ch] [rbp-D4h]
 unsigned int v32; // [rsp+30h] [rbp-D0h]
 int v33; // [rsp+34h] [rbp-CCh]
 int v34; // [rsp+38h] [rbp-C8h]
 _BYTE Result[8]; // [rsp+40h] [rbp-C0h] BYREF int v36; // [rsp+48h] [rbp-B8h]
 unsigned int v37; // [rsp+4Ch] [rbp-B4h]
 unsigned int v38; // [rsp+54h] [rbp-ACh]
 _BYTE v39[4]; // [rsp+70h] [rbp-90h] BYREF __int16 Index; // [rsp+74h] [rbp-8Ch]
 unsigned __int16 Index; // [rsp+76h] [rbp-8Ah]
 __int64 v42; // [rsp+80h] [rbp-80h]
 int n523_1; // [rsp+88h] [rbp-78h]
 int v44; // [rsp+8Ch] [rbp-74h]
 unsigned int v45; // [rsp+90h] [rbp-70h]
 unsigned int v46; // [rsp+94h] [rbp-6Ch]
 __int64 v47; // [rsp+A0h] [rbp-60h]
 unsigned int n6_1; // [rsp+E4h] [rbp-1Ch]
 unsigned int n6_2; // [rsp+F4h] [rbp-Ch]
 char v50; // [rsp+118h] [rbp+18h] BYREF char v51; // [rsp+128h] [rbp+28h] BYREF __int64 n40_1; // [rsp+1B0h] [rbp+B0h] BYREF

 *(_DWORD *)(a1 + 104) = 0; /*0x35c8*/
 result = sub_3058(a1, (__int64)v39); /*0x35cf*/
 if ( result < 0 ) /*0x35d7*/
 return result; /*0x35d7*/
 n512_3 = Index; /*0x35dd*/
 n523_2 = n523_1; /*0x35e8*/
 if ( Index == 512 && (_WORD)n523_1 == 267 ) /*0x35fb*/
 n523 = 523; /*0x35fd*/
 else n523 = n523_1; /*0x3603*/
 v6 = *(_BYTE *)(a1 + 125); /*0x3607*/
 Index = Index; /*0x360a*/
 if ( v6 ) /*0x3612*/
 {
 v8 = Index - 40; /*0x362c*/
 v9 = v42 + v8; /*0x3631*/
 }
 else
 {
 v8 = 0; /*0x3614*/
 if ( n523 == 267 ) /*0x361b*/
 v9 = HIDWORD(v47); /*0x361d*/
 else v9 = v47; /*0x3622*/
 }
 *(_QWORD *)a1 = v9; /*0x3635*/
 *(_QWORD *)(a1 + 16) = 0; /*0x3638*/
 *(_DWORD *)(a1 + 64) = 0; /*0x363c*/
 *(_QWORD *)(a1 + 72) = 0; /*0x3640*/
 *(_QWORD *)(a1 + 80) = 0; /*0x3644*/
 if ( v6 ) /*0x364a*/
 {
 if ( v44 || n523_2 ) /*0x365e*/
 goto LABEL_17; /*0x365e*/
 }
 else if ( (v42 & 0x1000000000000LL) == 0 ) /*0x3650*/
 {
LABEL_17:
 *(_BYTE *)(a1 + 124) = 0; /*0x3666*/
 goto LABEL_18; /*0x3666*/
 }
 *(_BYTE *)(a1 + 124) = 1; /*0x3660*/
LABEL_18:
 if ( v6 ) /*0x366c*/
 {
 v21 = v45; /*0x37c8*/
 Result = 40; /*0x37cc*/
 v23 = 0; /*0x37d2*/
 n512_2 = 0; /*0x37d5*/
 if ( n512_3 ) /*0x37db*/
 {
 do /*0x3884*/
 {
 Result = *(_QWORD *)(a1 + 40); /*0x37e1*/
 n40_1 = 40; /*0x37f1*/
 result = (*(__int64 ( **)(__int64, __int64, __int64 *, _BYTE *))(a1 + 32))(Result, Result, &n40_1, Result); /*0x37ff*/
 if ( result < 0 ) /*0x3805*/
 {
LABEL_41:
 v17 = n40_1 == 40; /*0x37a6*/
LABEL_42:
 *(_DWORD *)(a1 + 104) = 1; /*0x37ae*/
 if ( !v17 ) /*0x37bf*/
 return 0x8000000000000003uLL; /*0x37bf*/
 return result; /*0x37bf*/
 }
 v17 = n40_1 == 40; /*0x3807*/
 if ( n40_1 != 40 ) /*0x380f*/
 goto LABEL_42; /*0x380f*/
 if ( v21 < v37 /*0x3849*/
 || v21 >= v36 + v37
 || (n512_1 = (unsigned __int8)Index,
 v23 = v21 + v38 - (unsigned __int64)v8 - v37,
 n512_2 >= (unsigned __int64)(unsigned __int8)Index - 1) )
 {
 ++n512_2; /*0x3867*/
 n512_1 = (unsigned __int8)Index; /*0x386a*/
 if ( n512_2 == (unsigned __int8)Index ) /*0x3871*/
 *(_QWORD *)(a1 + 8) = v37 + v36 - v8; /*0x3879*/
 Result += 40; /*0x387d*/
 }
 else
 {
 Ptr = (unsigned __int8)Index - 1 - n512_2; /*0x3857*/
 n512_2 = (unsigned __int8)Index - 1; /*0x385a*/
 Result += 40 *Ptr; /*0x3861*/
 }
 }
 while ( n512_2 < n512_1 ); /*0x3884*/
 if ( v23 ) /*0x388d*/
 {
 v28 = 0; /*0x388f*/
 if ( v46 ) /*0x3896*/
 {
 while ( 1 ) /*0x389d*/
 {
 v29 = *(_QWORD *)(a1 + 40); /*0x389d*/
 n40_1 = 28; /*0x38aa*/
 result = (*(__int64 ( **)(__int64, unsigned __int64, __int64 *, _BYTE *))(a1 + 32))( /*0x38b8*/
 v29,
 v28 + v23,
 &n40_1,
 v30);
 if ( result < 0 ) /*0x38be*/
 {
LABEL_40:
 v17 = n40_1 == 28; /*0x379d*/
 goto LABEL_42; /*0x37a4*/
 }
 v17 = n40_1 == 28; /*0x38c4*/
 if ( n40_1 != 28 ) /*0x38cb*/
 goto LABEL_42; /*0x38cb*/
 if ( n2 == 2 ) /*0x38d6*/
 break; /*0x38d6*/
 v28 += 28LL; /*0x38db*/
 if ( v28 >= v46 ) /*0x38e1*/
 return 0; /*0x38e1*/
 }
 *(_DWORD *)(a1 + 64) = v21 + v28; /*0x38e9*/
 }
 }
 }
 }
 else
 {
 if ( n523 == 267 ) /*0x3676*/
 {
 n6 = n6_1; /*0x3678*/
 v11 = &v50; /*0x367b*/
 }
 else
 {
 n6 = n6_2; /*0x3681*/
 v11 = &v51; /*0x3684*/
 }
 if ( n6 > 6 ) /*0x368b*/
 {
 Index = 0; /*0x3695*/
 v13 = *(unsigned int *)v11; /*0x369f*/
 Result = *(unsigned int *)(a1 + 60) + WORD2(v42) + 24LL; /*0x36a2*/
 for ( i = Index != 0; i; i = Index < Index ) /*0x36a5*/
 {
 Result = *(_QWORD *)(a1 + 40); /*0x36af*/
 n40_1 = 40; /*0x36bf*/
 result = (*(__int64 ( **)(__int64, __int64, __int64 *, _BYTE *))(a1 + 32))(Result, Result, &n40_1, Result); /*0x36cd*/
 if ( result < 0 ) /*0x36d3*/
 goto LABEL_41; /*0x36d3*/
 v17 = n40_1 == 40; /*0x36d9*/
 if ( n40_1 != 40 ) /*0x36e1*/
 goto LABEL_42; /*0x36e1*/
 if ( v13 >= v37 && v13 < v37 + v36 ) /*0x36f9*/
 {
 v18 = v13 + v38 - (unsigned __int64)v37; /*0x3714*/
 if ( !v18 ) /*0x3717*/
 return 0; /*0x3717*/
 v19 = 0; /*0x371d*/
 if ( !*((_DWORD *)v11 + 1) ) /*0x3720*/
 return 0; /*0x3724*/
 while ( 1 ) /*0x372f*/
 {
 v20 = *(_QWORD *)(a1 + 40); /*0x372f*/
 n40_1 = 28; /*0x373c*/
 result = (*(__int64 ( **)(__int64, unsigned __int64, __int64 *, _BYTE *))(a1 + 32))( /*0x374a*/
 v20,
 v19 + v18,
 &n40_1,
 v30);
 if ( result < 0 ) /*0x3750*/
 goto LABEL_40; /*0x3750*/
 v17 = n40_1 == 28; /*0x3752*/
 if ( n40_1 != 28 ) /*0x3759*/
 goto LABEL_42; /*0x3759*/
 if ( n2 == 2 ) /*0x3760*/
 {
 *(_DWORD *)(a1 + 64) = v13 + v19; /*0x3777*/
 if ( !v33 ) /*0x377f*/
 {
 if ( v34 ) /*0x378a*/
 *(_QWORD *)(a1 + 8) += v32; /*0x3794*/
 }
 return 0; /*0x3798*/
 }
 v19 += 28LL; /*0x3766*/
 if ( v19 >= *((unsigned int *)v11 + 1) ) /*0x376c*/
 return 0; /*0x376c*/
 }
 }
 Result += 40; /*0x3700*/
 ++Index; /*0x3704*/
 }
 }
 }
 return 0; /*0x3902*/
}

// =============================================================================
// sub_3910 @ 0x3910
// =============================================================================

unsigned __int64 sub_3910(__int64 *a1)
{
 __int64 Ptr; // rdx __int64 Ptr; // rax unsigned int v4; // r15d __int64 v5; // rcx __int64 v6; // r9 unsigned int n5; // edx __int64 n176; // rcx unsigned int *v9; // rcx unsigned int *v10; // rdi __int64 v11; // rax __int64 v12; // r10 unsigned __int64 v13; // rcx unsigned __int64 v14; // rdx unsigned __int64 v15; // r11 unsigned __int64 v16; // r10 unsigned __int64 result; // rax unsigned __int64 v18; // r13 _WORD *v19; // r8 bool v20; // cf unsigned int *v21; // r14 __int64 v22; // rcx unsigned int *v23; // rbp unsigned __int64 v24; // r11 unsigned __int64 v25; // rsi _WORD *v26; // rcx int v27; // r11d int v28; // r11d int v29; // r11d int n7; // r11d _QWORD *v31; // r8 _DWORD *v32; // r8 __int64 v33; // rax if ( !a1 ) /*0x3934*/
 sub_2E00( /*0x3949*/
 (__int64)"e:\\hs\\MdePkg\\Library\\BasePeCoffLib\\BasePeCoff.c",
 958,
 (__int64)"ImageContext != ((void *) 0)");
 *((_DWORD *)a1 + 26) = 0; /*0x394e*/
 if ( *((_BYTE *)a1 + 124) ) /*0x3951*/
 return 0; /*0x3951*/
 Ptr = a1[2]; /*0x395b*/
 if ( !Ptr ) /*0x3962*/
 Ptr = *a1; /*0x3964*/
 if ( *((_BYTE *)a1 + 125) ) /*0x396c*/
 {
 v11 = *a1; /*0x39d8*/
 v4 = *(unsigned __int16 *)(*a1 + 6) - 40; /*0x39e3*/
 v6 = Ptr - v4 - *(_QWORD *)(*a1 + 16); /*0x39ed*/
 if ( Ptr - v4 != *(_QWORD *)(*a1 + 16) ) /*0x39f1*/
 *(_QWORD *)(v11 + 16) = Ptr - v4; /*0x39f6*/
 v10 = (unsigned int *)(v11 + 24); /*0x39fa*/
 }
 else
 {
 if ( (Ptr = *a1 + *((unsigned int *)a1 + 15), v4 = 0, *(_WORD *)(Ptr + 4) == 512) && *(_WORD *)(Ptr + 24) == 267 /*0x3998*/
 || *(_WORD *)(Ptr + 24) != 267 )
 {
 v6 = Ptr - *(_QWORD *)(Ptr + 48); /*0x39b5*/
 if ( Ptr != *(_QWORD *)(Ptr + 48) ) /*0x39b9*/
 *(_QWORD *)(Ptr + 48) = Ptr; /*0x39bb*/
 n5 = *(_DWORD *)(Ptr + 132); /*0x39bf*/
 n176 = 176; /*0x39c5*/
 }
 else
 {
 v5 = *(unsigned int *)(Ptr + 52); /*0x399a*/
 v6 = Ptr - v5; /*0x39a0*/
 if ( Ptr != v5 ) /*0x39a3*/
 *(_DWORD *)(Ptr + 52) = Ptr; /*0x39a5*/
 n5 = *(_DWORD *)(Ptr + 116); /*0x39a8*/
 n176 = 160; /*0x39ab*/
 }
 v9 = (unsigned int *)(Ptr + n176); /*0x39ca*/
 v10 = 0; /*0x39cd*/
 if ( n5 >= 5 ) /*0x39d2*/
 v10 = v9; /*0x39d2*/
 }
 if ( v10 && v10[1] ) /*0x3a03*/
 {
 v12 = a1[1]; /*0x3a08*/
 v13 = *v10; /*0x3a0c*/
 if ( v13 < v12 + (unsigned __int64)v4 ) /*0x3a18*/
 {
 v14 = v13 + *a1 - v4; /*0x3a28*/
 }
 else
 {
 *((_DWORD *)a1 + 26) = 5; /*0x3a1a*/
 v14 = 0; /*0x3a1d*/
 }
 v15 = v10[1] + *v10 - 1; /*0x3a35*/
 if ( v15 < v12 + (unsigned __int64)v4 ) /*0x3a3c*/
 {
 v16 = v15 + *a1 - v4; /*0x3a4c*/
 }
 else
 {
 *((_DWORD *)a1 + 26) = 5; /*0x3a3e*/
 v16 = 0; /*0x3a41*/
 }
 if ( !v14 || !v16 || v16 < v14 ) /*0x3a5c*/
 goto LABEL_32; /*0x3a5c*/
 }
 else
 {
 v16 = 0; /*0x3a74*/
 v14 = 0; /*0x3a77*/
 }
 v18 = v14; /*0x3a7a*/
 if ( !v6 ) /*0x3a80*/
 return 0; /*0x3c0e*/
 v19 = (_WORD *)a1[6]; /*0x3a86*/
 v20 = v14 < v16; /*0x3a8a*/
LABEL_36:
 if ( !v20 ) /*0x3a8d*/
 {
 if ( (unsigned __int64)v19 > a1[6] + a1[14] ) /*0x3be4*/
 sub_2E00( /*0x3bf9*/
 (__int64)"e:\\hs\\MdePkg\\Library\\BasePeCoffLib\\BasePeCoff.c",
 1164,
 (__int64)"(UINTN)FixupData <= (UINTN)ImageContext->FixupData + ImageContext->FixupDataSize");
 v33 = a1[2]; /*0x3bfe*/
 if ( v33 ) /*0x3c05*/
 a1[3] += v33 - *a1; /*0x3c0a*/
 return 0; /*0x3c0a*/
 }
 v21 = (unsigned int *)(v14 + 8); /*0x3a93*/
 if ( !*(_DWORD *)(v14 + 4) ) /*0x3a97*/
 goto LABEL_32; /*0x3a97*/
 v22 = *(unsigned int *)(v14 + 4); /*0x3a9c*/
 if ( v14 > ~v22 ) /*0x3aa7*/
 goto LABEL_32; /*0x3aa7*/
 v23 = (unsigned int *)(v22 + v14); /*0x3aac*/
 if ( v22 + v14 > v18 + v10[1] ) /*0x3ab6*/
 goto LABEL_32; /*0x3ab6*/
 v24 = *(unsigned int *)v14; /*0x3abc*/
 if ( v24 >= (unsigned __int64)v4 + a1[1] ) /*0x3ac8*/
 {
 *((_DWORD *)a1 + 26) = 5; /*0x3bcd*/
 goto LABEL_32; /*0x3bd4*/
 }
 if ( !(v24 + *a1 - v4) ) /*0x3ad7*/
 {
LABEL_32:
 *((_DWORD *)a1 + 26) = 9; /*0x3a5e*/
 return 0x8000000000000001uLL; /*0x3a6f*/
 }
 while ( 1 ) /*0x3b93*/
 {
 if ( v21 >= v23 ) /*0x3b96*/
 {
 v14 = (unsigned __int64)v23; /*0x3b9c*/
 v20 = (unsigned __int64)v23 < v16; /*0x3b9f*/
 goto LABEL_36; /*0x3ba2*/
 }
 v25 = *(_DWORD *)v14 + (*(_WORD *)v21 & 0xFFFu); /*0x3aef*/
 if ( v25 >= (unsigned __int64)v4 + a1[1] ) /*0x3af8*/
 break; /*0x3af8*/
 v26 = (_WORD *)(v25 + *a1 - v4); /*0x3b04*/
 if ( !v26 ) /*0x3b07*/
 goto LABEL_63; /*0x3b07*/
 v27 = *(unsigned __int16 *)v21 >> 12; /*0x3b0d*/
 if ( v27 ) /*0x3b16*/
 {
 v28 = v27 - 1; /*0x3b18*/
 if ( !v28 ) /*0x3b1c*/
 {
 *v26 += WORD1(v6); /*0x3b7c*/
LABEL_56:
 if ( v19 ) /*0x3b85*/
 *v19++ = *v26; /*0x3b87*/
 goto LABEL_58; /*0x3b8b*/
 }
 v29 = v28 - 1; /*0x3b1e*/
 if ( !v29 ) /*0x3b22*/
 {
 *v26 += v6; /*0x3b70*/
 goto LABEL_56; /*0x3b74*/
 }
 n7 = v29 - 1; /*0x3b24*/
 if ( n7 ) /*0x3b28*/
 {
 if ( n7 != 7 ) /*0x3b2e*/
 {
 result = 0x8000000000000003uLL; /*0x3ba7*/
 goto LABEL_64; /*0x3bb1*/
 }
 *(_QWORD *)v26 += v6; /*0x3b30*/
 if ( v19 ) /*0x3b39*/
 {
 v31 = (_QWORD *)((char *)v19 + (-(int)v19 & 7)); /*0x3b44*/
 *v31 = *(_QWORD *)v26; /*0x3b47*/
 v19 = v31 + 1; /*0x3b4a*/
 }
 }
 else
 {
 *(_DWORD *)v26 += v6; /*0x3b50*/
 if ( v19 ) /*0x3b59*/
 {
 v32 = (_DWORD *)((char *)v19 + (-(int)v19 & 3)); /*0x3b64*/
 *v32 = *(_DWORD *)v26; /*0x3b67*/
 v19 = v32 + 1; /*0x3b6a*/
 }
 }
 }
LABEL_58:
 v21 = (unsigned int *)((char *)v21 + 2); /*0x3b8f*/
 }
 *((_DWORD *)a1 + 26) = 5; /*0x3bb3*/
LABEL_63:
 result = 0x8000000000000001uLL; /*0x3bba*/
LABEL_64:
 *((_DWORD *)a1 + 26) = 9; /*0x3bc4*/
 return result; /*0x3c1f*/
}

// =============================================================================
// sub_3C30 @ 0x3C30
// =============================================================================

signed __int64 sub_3C30(__int64 a1)
{
 unsigned __int64 v1; // rsi signed __int64 result; // rax __int64 v4; // rcx __int64 v5; // r8 __int64 v6; // rax __int64 v7; // rdx unsigned int v8; // r11d __int64 v9; // r8 __int64 v10; // r9 __int64 v11; // rbx unsigned __int64 v12; // rax unsigned int *v13; // r13 __int64 v14; // rax __int64 v15; // r12 __int64 v16; // r10 unsigned __int64 v17; // rdx __int64 v18; // r9 unsigned __int64 v19; // r14 __int64 v20; // r14 unsigned __int64 v21; // r8 __int64 v22; // r8 unsigned __int64 v23; // rax __int16 n523; // r8 unsigned __int64 v25; // rdx unsigned __int64 v26; // rcx unsigned __int64 v27; // rax unsigned int v28; // r10d unsigned __int64 v29; // rcx __int64 v30; // rcx unsigned int n5; // eax __int64 n164; // rcx unsigned __int64 v33; // rax unsigned __int64 v34; // r14 _DWORD *v35; // r14 unsigned int v36; // r12d unsigned int v37; // r8d unsigned int v38; ... [12968 chars total]

// =============================================================================
// sub_422C @ 0x422C
// =============================================================================

__int64 sub_422C(__int64 a1, __int64 a2, __int64 *p_n16, __int64 a4)
{
 if ( !p_n16 ) /*0x424f*/
 sub_2E00((__int64)"e:\\hs\\MdePkg\\Library\\BasePeCoffLib\\BasePeCoff.c", 1928, (__int64)"ReadSize != ((void *) 0)"); /*0x4264*/
 if ( !a1 ) /*0x426c*/
 sub_2E00( /*0x4281*/
 (__int64)"e:\\hs\\MdePkg\\Library\\BasePeCoffLib\\BasePeCoff.c",
 1929,
 (__int64)"FileHandle != ((void *) 0)");
 if ( !a4 ) /*0x4289*/
 sub_2E00((__int64)"e:\\hs\\MdePkg\\Library\\BasePeCoffLib\\BasePeCoff.c", 1930, (__int64)"Buffer != ((void *) 0)"); /*0x429e*/
 if ( *p_n16 ) /*0x42a3*/
 sub_2BE8(a4, a1 + a2, *p_n16); /*0x42b2*/
 return 0; /*0x42c8*/
}

// =============================================================================
// sub_43C4 @ 0x43C4
// =============================================================================

void sub_43C4()
{
 __int64 ( *v0)(void *, _QWORD, __int64 *); // r9 __int64 v1; // rax __int64 v2; // rcx if ( !qword_6458 && !byte_6450 ) /*0x43db*/
 {
 if ( BootServices ) /*0x43e7*/
 {
 v0 = *(__int64 ( **)(void *, _QWORD, __int64 *))(BootServices + 320); /*0x43e9*/
 if ( v0 ) /*0x43f3*/
 {
 v1 = v0(&unk_6020, 0, &qword_6458); /*0x4405*/
 v2 = qword_6458; /*0x4408*/
 if ( v1 < 0 ) /*0x4412*/
 v2 = 0; /*0x4412*/
 qword_6458 = v2; /*0x4416*/
 }
 }
 }
}

// =============================================================================
// sub_4424 @ 0x4424
// =============================================================================

__int64 sub_4424()
{
 __int64 result; // rax if ( qword_6458 ) /*0x4430*/
 return (*(__int64 ( **)(_QWORD, __int64 *))(RuntimeServices + 64))(0, &qword_6458); /*0x4442*/
 return result; /*0x4445*/
}

// =============================================================================
// sub_444C @ 0x444C
// =============================================================================

void sub_444C()
{
 sub_43C4(); /*0x4450*/
 byte_6450 = 1; /*0x4455*/
}

// =============================================================================
// sub_44A8 @ 0x44A8
// =============================================================================

__int64 sub_44A8(__int64 a1, unsigned __int64 a2)
{
 if ( !a2 ) /*0x44bb*/
 return a1; /*0x44bd*/
 if ( !a1 ) /*0x44c5*/
 sub_2E00( /*0x44d8*/
 (__int64)"e:\\hs\\MdePkg\\Library\\BaseMemoryLibRepStr\\ZeroMemWrapper.c",
 53,
 (__int64)"Buffer != ((void *) 0)");
 if ( a2 > -a1 ) /*0x44e6*/
 sub_2E00( /*0x44fb*/
 (__int64)"e:\\hs\\MdePkg\\Library\\BaseMemoryLibRepStr\\ZeroMemWrapper.c",
 54,
 (__int64)"Length <= (0xFFFFFFFFFFFFFFFFULL - (UINTN)Buffer + 1)");
 return sub_1070(a1, a2); /*0x4510*/
}