#include "../uefi_headers/Uefi.h"
// ==================================================================
// PE/COFF Loader Library
// Source: MdePkg/Library/BasePeCoffLib/BasePeCoff.c
// MdePkg/Library/BasePeCoffGetEntryPointLib/PeCoffGetEntryPoint.c
// MdePkg/Library/BasePeCoffGetEntryPointLib/PeCoffGetEntryPoint.c (PeCoffGetImageInfo)
// MdeModulePkg/Library/DxeReportStatusCodeLib/ReportStatusCodeLib.c
// MdePkg/Library/BaseCpuExceptionHandlerLib/X64Exception.c
// MdePkg/Library/LzmaDecompressLib
// ==================================================================
// PeCoffGetEntryPoint
// PeCoffGetEntryPoint -- Validate PE headers and locate entry point
//
RETURN_STATUS __cdecl PeCoffGetEntryPoint(void *Pe32Data, void **EntryPoint)
{
double v2; // xmm3_8
char *Pe32Data_1; // rax
if ( !Pe32Data ) /*0x14cc3*/
Assert_7( /*0x14cd6*/
(__int64)"e:\\hs\\MdePkg\\Library\\BasePeCoffGetEntryPointLib\\PeCoffGetEntryPoint.c",
54,
(__int64)"Pe32Data != ((void *) 0)",
v2);
if ( !EntryPoint ) /*0x14cde*/
Assert_7( /*0x14cf1*/
(__int64)"e:\\hs\\MdePkg\\Library\\BasePeCoffGetEntryPointLib\\PeCoffGetEntryPoint.c",
55,
(__int64)"EntryPoint != ((void *) 0)",
v2);
if ( *(_WORD *)Pe32Data == 23117 ) /*0x14cfe*/
Pe32Data_1 = (char *)Pe32Data + *((unsigned __int16 *)Pe32Data + 30); /*0x14d04*/
else
Pe32Data_1 = (char *)Pe32Data; /*0x14d09*/
if ( *(_WORD *)Pe32Data_1 == 23126 ) /*0x14d14*/
{
*EntryPoint = (char *)Pe32Data /*0x14d27*/
+ *((unsigned int *)Pe32Data_1 + 2)
- (unsigned __int64)*((unsigned __int16 *)Pe32Data_1 + 3)
+ 40;
return 0; /*0x14d2c*/
}
if ( *(_DWORD *)Pe32Data_1 == 17744 ) /*0x14d34*/
{
*EntryPoint = (char *)Pe32Data + *((unsigned int *)Pe32Data_1 + 10); /*0x14d3c*/
return 0; /*0x14d3f*/
}
return 0x8000000000000003uLL; /*0x14d50*/
}
// PeCoffGetImageInfo
// PeCoffGetImageInfo -- Query image info from PE headers
//
RETURN_STATUS __cdecl PeCoffGetImageInfo(PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext)
{
double v1; // xmm3_8
__int64 v3; // r10
PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext_1; // rax
unsigned int *p_EntryPoint; // rdx
char *v6; // rcx
int n512; // ecx
__int16 EntryPoint; // cx
unsigned int FixupDataSize_high; // r8d
unsigned __int64 v10; // r8
_DWORD *i; // rcx
_DWORD *v12; // rax
if ( !ImageContext ) /*0x14d64*/
Assert_7( /*0x14d79*/
(__int64)"e:\\hs\\MdePkg\\Library\\BasePeCoffGetEntryPointLib\\PeCoffGetEntryPoint.c",
166,
(__int64)"Pe32Data != ((void *) 0)",
v1);
v3 = 0; /*0x14d7e*/
if ( LOWORD(ImageContext->ImageAddress) == 23117 ) /*0x14d89*/
ImageContext_1 = (PE_COFF_LOADER_IMAGE_CONTEXT *)((char *)ImageContext + LOWORD(ImageContext->PeCoffHeaderOffset)); /*0x14d8f*/
else
ImageContext_1 = ImageContext; /*0x14d94*/
if ( LOWORD(ImageContext_1->ImageAddress) != 23126 ) /*0x14d9f*/
{
if ( LODWORD(ImageContext_1->ImageAddress) != 17744 ) /*0x14dcb*/
return 0; /*0x14dcb*/
n512 = WORD2(ImageContext_1->ImageAddress); /*0x14dd1*/
if ( n512 == 332 ) /*0x14de0*/
{
EntryPoint = 267; /*0x14df8*/
}
else
{
if ( n512 == 512 || n512 == 34404 ) /*0x14df0*/
goto LABEL_17; /*0x14df0*/
EntryPoint = ImageContext_1->EntryPoint; /*0x14df2*/
}
if ( EntryPoint == 267 ) /*0x14dfd*/
{
FixupDataSize_high = HIDWORD(ImageContext_1->FixupDataSize); /*0x14dff*/
p_EntryPoint = (unsigned int *)&ImageContext_1[1].EntryPoint; /*0x14e03*/
goto LABEL_19; /*0x14e0a*/
}
LABEL_17:
if ( LOWORD(ImageContext_1->EntryPoint) != 523 ) /*0x14e15*/
goto LABEL_20; /*0x14e15*/
FixupDataSize_high = HIDWORD(ImageContext_1->HiiResourceData); /*0x14e17*/
p_EntryPoint = (unsigned int *)&ImageContext_1[1].Handle; /*0x14e1e*/
LABEL_19:
v6 = (char *)ImageContext + *p_EntryPoint; /*0x14e25*/
if ( FixupDataSize_high > 6 ) /*0x14e2e*/
goto LABEL_21; /*0x14e2e*/
LABEL_20:
p_EntryPoint = 0; /*0x14e30*/
v6 = 0; /*0x14e32*/
goto LABEL_21; /*0x14e32*/
}
p_EntryPoint = (unsigned int *)&ImageContext_1->ImageRead; /*0x14da1*/
if ( !LODWORD(ImageContext_1->ImageRead) ) /*0x14da8*/
return 0; /*0x14e8e*/
v3 = 40LL - HIWORD(ImageContext_1->ImageAddress); /*0x14db8*/
v6 = (char *)ImageContext_1 + *p_EntryPoint + v3; /*0x14dc0*/
LABEL_21:
if ( !v6 ) /*0x14e37*/
return 0; /*0x14e37*/
if ( !p_EntryPoint ) /*0x14e3c*/
return 0; /*0x14e3c*/
v10 = 0; /*0x14e42*/
if ( !p_EntryPoint[1] ) /*0x14e3e*/
return 0; /*0x14e48*/
for ( i = v6 + 16; ; i += 7 ) /*0x14e4a*/
{
if ( *(i - 1) != 2 || !*i ) /*0x14e54*/
goto LABEL_30; /*0x14e57*/
v12 = (_DWORD *)((char *)ImageContext + v3 + (unsigned int)i[1]); /*0x14e5f*/
if ( *v12 == 808534606 ) /*0x14e68*/
break; /*0x14e68*/
if ( *v12 == 1129272397 ) /*0x14e70*/
return (RETURN_STATUS)(v12 + 5); /*0x14e99*/
if ( *v12 == 1396986706 ) /*0x14e78*/
return (RETURN_STATUS)(v12 + 6); /*0x14e93*/
LABEL_30:
v10 += 28LL; /*0x14e7a*/
if ( v10 >= p_EntryPoint[1] ) /*0x14e85*/
return 0; /*0x14e85*/
}
return (RETURN_STATUS)(v12 + 4); /*0x14e89*/
}
// PeCoffLoadImage
// PeCoffLoadImage -- Load PE/COFF image with base relocations
//
RETURN_STATUS __cdecl PeCoffLoadImage(PE_COFF_LOADER_IMAGE_CONTEXT *ImageContext)
{
double v1; // xmm3_8
PHYSICAL_ADDRESS DestinationAddress; // rdx
PHYSICAL_ADDRESS v4; // rax
unsigned int v5; // r15d
__int64 DestinationAddress_1; // rcx
PHYSICAL_ADDRESS v7; // r9
unsigned int n5; // edx
__int64 n176; // rcx
unsigned int *v10; // rcx
unsigned int *v11; // rdi
PHYSICAL_ADDRESS ImageAddress; // rax
UINT64 ImageSize; // r10
UINT64 v14; // rcx
unsigned __int64 v15; // rdx
UINT64 v16; // r11
unsigned __int64 v17; // r10
RETURN_STATUS result; // rax
unsigned __int64 v19; // r13
char *FixupData; // r8
bool v21; // cf
unsigned int *v22; // r14
__int64 v23; // rcx
unsigned int *v24; // rbp
UINT64 v25; // r11
UINT64 v26; // rsi
_WORD *v27; // rcx
int v28; // r11d
int v29; // r11d
int v30; // r11d
int n7; // r11d
char *v32; // r8
char *v33; // r8
PHYSICAL_ADDRESS DestinationAddress_2; // rax
if ( !ImageContext ) /*0x169a0*/
Assert_7( /*0x169b5*/
(__int64)"e:\\hs\\MdePkg\\Library\\BasePeCoffLib\\BasePeCoff.c",
958,
(__int64)"ImageContext != ((void *) 0)",
v1);
ImageContext->ImageError = 0; /*0x169ba*/
if ( ImageContext->RelocationsStripped ) /*0x169bd*/
return 0; /*0x169bd*/
DestinationAddress = ImageContext->DestinationAddress; /*0x169c7*/
if ( !DestinationAddress ) /*0x169ce*/
DestinationAddress = ImageContext->ImageAddress; /*0x169d0*/
if ( ImageContext->IsTeImage ) /*0x169d8*/
{
ImageAddress = ImageContext->ImageAddress; /*0x16a44*/
v5 = *(unsigned __int16 *)(ImageContext->ImageAddress + 6) - 40; /*0x16a4f*/
v7 = DestinationAddress - v5 - *(_QWORD *)(ImageContext->ImageAddress + 16); /*0x16a59*/
if ( DestinationAddress - v5 != *(_QWORD *)(ImageContext->ImageAddress + 16) ) /*0x16a5d*/
*(_QWORD *)(ImageAddress + 16) = DestinationAddress - v5; /*0x16a62*/
v11 = (unsigned int *)(ImageAddress + 24); /*0x16a66*/
}
else
{
if ( (v4 = ImageContext->ImageAddress + ImageContext->PeCoffHeaderOffset, v5 = 0, *(_WORD *)(v4 + 4) == 512) /*0x16a04*/
&& *(_WORD *)(v4 + 24) == 267
|| *(_WORD *)(v4 + 24) != 267 )
{
v7 = DestinationAddress - *(_QWORD *)(v4 + 48); /*0x16a21*/
if ( DestinationAddress != *(_QWORD *)(v4 + 48) ) /*0x16a25*/
*(_QWORD *)(v4 + 48) = DestinationAddress; /*0x16a27*/
n5 = *(_DWORD *)(v4 + 132); /*0x16a2b*/
n176 = 176; /*0x16a31*/
}
else
{
DestinationAddress_1 = *(unsigned int *)(v4 + 52); /*0x16a06*/
v7 = DestinationAddress - DestinationAddress_1; /*0x16a0c*/
if ( DestinationAddress != DestinationAddress_1 ) /*0x16a0f*/
*(_DWORD *)(v4 + 52) = DestinationAddress; /*0x16a11*/
n5 = *(_DWORD *)(v4 + 116); /*0x16a14*/
n176 = 160; /*0x16a17*/
}
v10 = (unsigned int *)(v4 + n176); /*0x16a36*/
v11 = 0; /*0x16a39*/
if ( n5 >= 5 ) /*0x16a3e*/
v11 = v10; /*0x16a3e*/
}
if ( v11 && v11[1] ) /*0x16a6f*/
{
ImageSize = ImageContext->ImageSize; /*0x16a74*/
v14 = *v11; /*0x16a78*/
if ( v14 < ImageSize + v5 ) /*0x16a84*/
{
v15 = v14 + ImageContext->ImageAddress - v5; /*0x16a94*/
}
else
{
ImageContext->ImageError = 5; /*0x16a86*/
v15 = 0; /*0x16a89*/
}
v16 = v11[1] + *v11 - 1; /*0x16aa1*/
if ( v16 < ImageSize + v5 ) /*0x16aa8*/
{
v17 = v16 + ImageContext->ImageAddress - v5; /*0x16ab8*/
}
else
{
ImageContext->ImageError = 5; /*0x16aaa*/
v17 = 0; /*0x16aad*/
}
if ( !v15 || !v17 || v17 < v15 ) /*0x16ac8*/
goto LABEL_33; /*0x16ac8*/
}
else
{
v17 = 0; /*0x16ae0*/
v15 = 0; /*0x16ae3*/
}
v19 = v15; /*0x16ae6*/
if ( !v7 ) /*0x16aec*/
return 0; /*0x16c7a*/
FixupData = (char *)ImageContext->FixupData; /*0x16af2*/
v21 = v15 < v17; /*0x16af6*/
LABEL_37:
if ( !v21 ) /*0x16af9*/
{
if ( FixupData > (char *)ImageContext->FixupData + ImageContext->FixupDataSize ) /*0x16c50*/
Assert_7( /*0x16c65*/
(__int64)"e:\\hs\\MdePkg\\Library\\BasePeCoffLib\\BasePeCoff.c",
1164,
(__int64)"(UINTN)FixupData <= (UINTN)ImageContext->FixupData + ImageContext->FixupDataSize",
v1);
DestinationAddress_2 = ImageContext->DestinationAddress; /*0x16c6a*/
if ( DestinationAddress_2 ) /*0x16c71*/
ImageContext->EntryPoint += DestinationAddress_2 - ImageContext->ImageAddress; /*0x16c76*/
return 0; /*0x16c76*/
}
v22 = (unsigned int *)(v15 + 8); /*0x16aff*/
if ( !*(_DWORD *)(v15 + 4) ) /*0x16b03*/
goto LABEL_33; /*0x16b03*/
v23 = *(unsigned int *)(v15 + 4); /*0x16b08*/
if ( v15 > ~v23 ) /*0x16b13*/
goto LABEL_33; /*0x16b13*/
v24 = (unsigned int *)(v23 + v15); /*0x16b18*/
if ( v23 + v15 > v19 + v11[1] ) /*0x16b22*/
goto LABEL_33; /*0x16b22*/
v25 = *(unsigned int *)v15; /*0x16b28*/
if ( v25 >= v5 + ImageContext->ImageSize ) /*0x16b34*/
{
ImageContext->ImageError = 5; /*0x16c39*/
goto LABEL_33; /*0x16c40*/
}
if ( !(v25 + ImageContext->ImageAddress - v5) ) /*0x16b43*/
{
LABEL_33:
ImageContext->ImageError = 9; /*0x16aca*/
return 0x8000000000000001uLL; /*0x16adb*/
}
while ( 1 ) /*0x16bff*/
{
if ( v22 >= v24 ) /*0x16c02*/
{
v15 = (unsigned __int64)v24; /*0x16c08*/
v21 = (unsigned __int64)v24 < v17; /*0x16c0b*/
goto LABEL_37; /*0x16c0e*/
}
v26 = *(_DWORD *)v15 + (*(_WORD *)v22 & 0xFFFu); /*0x16b5b*/
if ( v26 >= v5 + ImageContext->ImageSize ) /*0x16b64*/
break; /*0x16b64*/
v27 = (_WORD *)(v26 + ImageContext->ImageAddress - v5); /*0x16b70*/
if ( !v27 ) /*0x16b73*/
goto LABEL_64; /*0x16b73*/
v28 = *(unsigned __int16 *)v22 >> 12; /*0x16b79*/
if ( v28 ) /*0x16b82*/
{
v29 = v28 - 1; /*0x16b84*/
if ( !v29 ) /*0x16b88*/
{
*v27 += WORD1(v7); /*0x16be8*/
LABEL_57:
if ( FixupData ) /*0x16bf1*/
{
*(_WORD *)FixupData = *v27; /*0x16bf3*/
FixupData += 2; /*0x16bf7*/
}
goto LABEL_59; /*0x16bf7*/
}
v30 = v29 - 1; /*0x16b8a*/
if ( !v30 ) /*0x16b8e*/
{
*v27 += v7; /*0x16bdc*/
goto LABEL_57; /*0x16be0*/
}
n7 = v30 - 1; /*0x16b90*/
if ( n7 ) /*0x16b94*/
{
if ( n7 != 7 ) /*0x16b9a*/
{
result = 0x8000000000000003uLL; /*0x16c13*/
goto LABEL_65; /*0x16c1d*/
}
*(_QWORD *)v27 += v7; /*0x16b9c*/
if ( FixupData ) /*0x16ba5*/
{
v32 = &FixupData[-(int)FixupData & 7]; /*0x16bb0*/
*(_QWORD *)v32 = *(_QWORD *)v27; /*0x16bb3*/
FixupData = v32 + 8; /*0x16bb6*/
}
}
else
{
*(_DWORD *)v27 += v7; /*0x16bbc*/
if ( FixupData ) /*0x16bc5*/
{
v33 = &FixupData[-(int)FixupData & 3]; /*0x16bd0*/
*(_DWORD *)v33 = *(_DWORD *)v27; /*0x16bd3*/
FixupData = v33 + 4; /*0x16bd6*/
}
}
}
LABEL_59:
v22 = (unsigned int *)((char *)v22 + 2); /*0x16bfb*/
}
ImageContext->ImageError = 5; /*0x16c1f*/
LABEL_64:
result = 0x8000000000000001uLL; /*0x16c26*/
LABEL_65:
ImageContext->ImageError = 9; /*0x16c30*/
return result; /*0x16c8b*/
}
// DumpCpuExceptionInfo
// DumpCpuExceptionInfo -- Dump CPU exception context registers
//
__int64 __fastcall DumpCpuExceptionInfo(__int64 n14, _QWORD *a2, double a3)
{
int v4; // eax
v4 = GetInfo_12(); /*0x17c24*/
Assert_5("!!!! X64 Exception Type - %02x(%a) CPU Apic ID - %08x !!!!\n", n14, a3, v4); /*0x17c39*/
if ( ((unsigned int)&unk_27D00 & (1 << n14)) != 0 ) /*0x17c4f*/
{
Assert_5("ExceptionData - %016lx", *a2); /*0x17c63*/
if ( n14 == 14 ) /*0x17c6c*/
Assert_5( /*0x17cd1*/
" I:%x R:%x U:%x W:%x P:%x PK:%x S:%x",
(*a2 >> 4) & 1,
(*a2 >> 3) & 1,
(*a2 >> 2) & 1,
(*a2 >> 1) & 1,
*a2 & 1,
(*a2 >> 5) & 1,
(*a2 >> 15) & 1);
Assert_5("\n"); /*0x17cdd*/
}
Assert_5("RIP - %016lx, CS - %016lx, RFLAGS - %016lx\n", a2[84], a2[89], a2[77]); /*0x17d02*/
Assert_5("RAX - %016lx, RCX - %016lx, RDX - %016lx\n", a2[98], a2[97], a2[96]); /*0x17d27*/
Assert_5("RBX - %016lx, RSP - %016lx, RBP - %016lx\n", a2[95], a2[94], a2[93]); /*0x17d4c*/
Assert_5("RSI - %016lx, RDI - %016lx\n", a2[92], a2[91]); /*0x17d6a*/
Assert_5("R8 - %016lx, R9 - %016lx, R10 - %016lx\n", a2[99], a2[100], a2[101]); /*0x17d8f*/
Assert_5("R11 - %016lx, R12 - %016lx, R13 - %016lx\n", a2[102], a2[103], a2[104]); /*0x17db4*/
Assert_5("R14 - %016lx, R15 - %016lx\n", a2[105], a2[106]); /*0x17dd2*/
Assert_5("DS - %016lx, ES - %016lx, FS - %016lx\n", a2[88], a2[87], a2[86]); /*0x17df7*/
Assert_5("GS - %016lx, SS - %016lx\n", a2[85], a2[90]); /*0x17e15*/
Assert_5("CR0 - %016lx, CR2 - %016lx, CR3 - %016lx\n", a2[71], a2[73], a2[74]); /*0x17e3a*/
Assert_5("CR4 - %016lx, CR8 - %016lx\n", a2[75], a2[76]); /*0x17e58*/
Assert_5("DR0 - %016lx, DR1 - %016lx, DR2 - %016lx\n", a2[65], a2[66], a2[67]); /*0x17e7d*/
Assert_5("DR3 - %016lx, DR6 - %016lx, DR7 - %016lx\n", a2[68], a2[69], a2[70]); /*0x17ea2*/
Assert_5("GDTR - %016lx %016lx, LDTR - %016lx\n", a2[80], a2[81], a2[78]); /*0x17ec7*/
Assert_5("IDTR - %016lx %016lx, TR - %016lx\n", a2[82], a2[83], a2[79]); /*0x17eec*/
return Assert_5("FXSAVE_STATE - %016lx\n", (int)a2 + 8); /*0x17f0f*/
}
// ReportStatusCodeWithExtendedData
// ReportStatusCodeWithExtendedData -- Report status code with extended data buffer
//
// local variable allocation has failed, the output may be wrong!
EFI_STATUS __cdecl ReportStatusCodeWithExtendedData(
EFI_STATUS_CODE_TYPE Type,
EFI_STATUS_CODE_VALUE Value,
const void *ExtendedData,
UINTN ExtendedDataSize)
{
double v4; // xmm3_8
unsigned __int64 n0x10; // rbx
__int64 v8; // r8
_BYTE *v9; // rax
__int64 *v10; // rdx
__int64 v11; // r8
void *ExtendedDataSize_1; // r9
EFI_STATUS v13; // rbx
_BYTE v15[528]; // [rsp+30h] [rbp-218h] BYREF
__int64 *v16; // [rsp+270h] [rbp+28h]
__int64 *p__; // [rsp+278h] [rbp+30h]
_BYTE *v18; // [rsp+280h] [rbp+38h] BYREF
if ( !p__ ) /*0x1480c*/
Assert_7( /*0x14821*/
(__int64)"e:\\hs\\MdeModulePkg\\Library\\DxeReportStatusCodeLib\\ReportStatusCodeLib.c",
496,
(__int64)"!((ExtendedData == ((void *) 0)) && (ExtendedDataSize != 0))",
v4);
if ( !buf_0 || !*((_QWORD *)buf_0 + 8) || !*((_QWORD *)buf_0 + 9) ) /*0x14841*/
return 0x8000000000000003uLL; /*0x14957*/
n0x10 = (*((__int64 (__fastcall **)(__int64, _QWORD, const void *))buf_0 + 3))(31, *(_QWORD *)&Value, ExtendedData); /*0x1485e*/
(*((void (__fastcall **)(unsigned __int64))buf_0 + 4))(n0x10); /*0x14861*/
v18 = 0; /*0x14864*/
if ( n0x10 > 0x10 || ((*((void (__fastcall **)(__int64, __int64, _BYTE **))buf_0 + 8))(4, 28, &v18), (v9 = v18) == 0) ) /*0x14898*/
{
v9 = v15; /*0x1489a*/
v18 = v15; /*0x1489f*/
}
v10 = &qword_223C0; /*0x148ac*/
*(_WORD *)v9 = 20; /*0x148b3*/
*((_WORD *)v18 + 1) = 8; /*0x148c1*/
if ( v16 ) /*0x148d8*/
v10 = v16; /*0x148d8*/
Assert_108(v18 + 4, (__int64)v10, v8, v4); /*0x148e0*/
if ( p__ ) /*0x148ee*/
MemConfig_1(v18 + 20, (char *)p__, 8u, v4); /*0x14907*/
ExtendedDataSize_1 = &unk_22760; /*0x14914*/
if ( ExtendedDataSize ) /*0x1492a*/
ExtendedDataSize_1 = (void *)ExtendedDataSize; /*0x1492a*/
v13 = sub_146F0(1u, Value, v11, (__int64)ExtendedDataSize_1, (__int64)v18); /*0x1493b*/
if ( v18 != v15 ) /*0x14946*/
(*((void (**)(void))buf_0 + 9))(); /*0x1494f*/
return v13; /*0x14971*/
}
// LzmaDecompress -- LZMA decompressor (adaptive range coder + Huffman + LZ77 sliding window)
// Located at 0x18818, 3039 bytes. Full decompilation too large to embed.
// See LzmaDecompress.c in MdePkg/Library/LzmaDecompressLib for reference implementation.