Newer
Older
AMI-Aptio-BIOS-Reversed / MdeModulePkg / Core / DxeIplPeim / DxeIpl.c
@Ajax Dong Ajax Dong 7 days ago 74 KB Recovering names
//
// DxeIpl.efi - Full Decompilation
// Source: IDA Pro MCP port 13388
// Functions: 80
//

#include <Uefi.h>
#include <PiPei.h>



































































int DxeIplZeroMem()
{
 unsigned __int32 v0; // eax
 unsigned __int64 v1; // rax
 _BYTE retaddr[8]; // [esp+0h] [ebp+0h]

 _disable(); /*0xffc15298*/
 *(_DWORD *)retaddr = &byte_FFC152BF; /*0xffc15299*/
 v0 = __readcr4(); /*0xffc152a0*/
 LOBYTE(v0) = v0 | 0x20; /*0xffc152a3*/
 __writecr4(v0); /*0xffc152a5*/
 v1 = __readmsr(0xC0000080); /*0xffc152ad*/
 BYTE1(v1) |= 1u; /*0xffc152af*/
 __writemsr(0xC0000080, v1); /*0xffc152b2*/
 LODWORD(v1) = __readcr0(); /*0xffc152b4*/
 __writecr0(v1 | 0x80000000); /*0xffc152bb*/
 return MK_FP(*(_WORD *)retaddr, *(_DWORD *)retaddr)(-1073741696, HIDWORD(v1));
}

char *DxeIplCopyMem(char *dst, char *src, unsigned int count_1)
{
 unsigned int count; // edx
 char *dst_1; // edi
 char *src_1; // esi

 count = count_1; /*0xffc152f2*/
 if ( src < dst && &src[count_1 - 1] >= dst ) /*0xffc15300*/
 {
 src_1 = &src[count_1 - 1]; /*0xffc15314*/
 dst_1 = &dst[count_1 - 1]; /*0xffc15316*/
 }
 else
 {
 count = count_1 & 3; /*0xffc15304*/
 qmemcpy(dst, src, 4 * (count_1 >> 2)); /*0xffc1530d*/
 src_1 = &src[4 * (count_1 >> 2)]; /*0xffc1530d*/
 dst_1 = &dst[4 * (count_1 >> 2)]; /*0xffc1530d*/
 }
 qmemcpy(dst_1, src_1, count); /*0xffc1531d*/
 return dst; /*0xffc15324*/
}

void *DxeIplSetMem32(void *buf, unsigned int count)
{
 memset(buf, 0, count); /*0xffc1533f*/
 return buf; /*0xffc15346*/
}

void *DxeIplSetMem64(void *buf, unsigned int count, char value)
{
 memset(buf, value, count); /*0xffc15355*/
 return buf; /*0xffc1535b*/
}

int DxeIplGetNextHob(int a1, int a2, int a3, int a4)
{
 do /*0xffc15381*/
 {
 *(_DWORD *)(a1 + 8 *a2 - 8) = a3; /*0xffc15379*/
 *(_DWORD *)(a1 + 8 *a2-- - 4) = a4; /*0xffc1537d*/
 }
 while ( a2 ); /*0xffc15381*/
 return a1; /*0xffc15385*/
}

void *DxeIplGetFirstHob(void *buf, unsigned int count, int value)
{
 memset32(buf, value, count); /*0xffc15395*/
 return buf; /*0xffc1539b*/
}

_WORD *DxeIplSetMem16(_WORD *a1, int a2, __int16 a3)
{
 _WORD *v3; // edi

 v3 = a1; /*0xffc1542d*/
 while ( a2 ) /*0xffc15435*/
 {
 *v3++ = a3; /*0xffc15435*/
 --a2; /*0xffc15435*/
 }
 return a1; /*0xffc1543c*/
}

EFI_STATUS ModuleEntryPoint(EFI_HANDLE ImageHandle, EFI_SYSTEM_TABLE *SystemTable)
{
 void *v2; // ecx
 int v3; // ebp
 void *v4; // ecx
 void *v5; // ecx
 int ModuleBase; // eax
 bool v7; // zf
 EFI_STATUS result; // eax
 int v9; // [esp-14h] [ebp-1Ch]
 _DWORD *v10; // [esp-14h] [ebp-1Ch]
 _BYTE v11[6]; // [esp-Ch] [ebp-14h] BYREF
 int v12; // [esp-4h] [ebp-Ch] BYREF
 _BYTE *v13; // [esp+0h] [ebp-8h]
 int v14; // [esp+4h] [ebp-4h]

 if ( *(char *)(DxeIplGetModuleBase(v2) + 1024068) >= 0 ) /*0xffc1544f*/
 {
 DxeIplInitGlobalFlags(v4); /*0xffc15451*/
 ModuleBase = DxeIplGetModuleBase(v5); /*0xffc15456*/
 *(_BYTE *)(ModuleBase + 1024068) |= 0x80u; /*0xffc15462*/
 }
 DxeIplInstallPpi((char *)FvDeviceHandle, (int (*)())DxeIplPpiNotifyCallback, (int (*)())DxeIplPeiEndCallback); /*0xffc15473*/
 DxeIplInstallPpi((char *)DxeIplPpi, (int (*)())DxeIplDxeIplPpiNotify, (int (*)())DxeIplEndOfPeiNotify); /*0xffc15489*/
 off_FFC18DF8 = &unk_FFC18B10; /*0xffc15493*/
 n64 = 64; /*0xffc1549d*/
 v14 = v3; /*0xffc154ad*/
 v7 = DxeIplGetPlatformBootMode() == 17; /*0xffc154bb*/
 v13 = v11; /*0xffc154c1*/
 if ( v7 ) /*0xffc154c4*/
 {
 __sidt(v13); /*0xffc15506*/
 (*(void ( **)(_DWORD, void *))(**(_DWORD **)(*(_DWORD *)&v11[2] - 4) + 36))( /*0xffc15517*/
 *(_DWORD *)(*(_DWORD *)&v11[2] - 4),
 &unk_FFC18A64);
 return DxeIplReportStatus(&unk_FFC18A7C); /*0xffc15517*/
 }
 __sidt(v13); /*0xffc154c9*/
 result = (*(int ( **)(EFI_HANDLE))(**(_DWORD **)(*(_DWORD *)&v11[2] - 4) + 116))(ImageHandle); /*0xffc154d5*/
 if ( result ) /*0xffc154db*/
 {
 result = DxeIplLocatePpiByGuid((int)&unk_FFC18D68, 0, v9, (int)&v12); /*0xffc154e9*/
 if ( (result & 0x80000000) == 0 ) /*0xffc154f2*/
 {
 DxeIplDebugPrint(v10); /*0xffc154f9*/
 return DxeIplReportStatus(&unk_FFC18A7C); /*0xffc1551c*/
 }
 }
 return result; /*0xffc1552a*/
}

int __thiscall DxeIplDebugPrint(_DWORD *this)
{
 int v1; // esi
 int v2; // ebp
 _DWORD *v3; // edi
 int v4; // ebx
 _DWORD *this_1; // [esp+0h] [ebp-4h] BYREF

 this_1 = this; /*0xffc1552b*/
 if ( DxeIplFvOpenDevice(&this_1) >= 0 ) /*0xffc15536*/
 {
 v1 = this_1[1]; /*0xffc1553d*/
 v2 = this_1[2]; /*0xffc15540*/
 if ( v1 ) /*0xffc15545*/
 {
 v3 = (_DWORD *)DxeIplAllocateZeroPages(12 *v1); /*0xffc15553*/
 v4 = v2 + 16 *v1; /*0xffc15558*/
 do /*0xffc1557a*/
 {
 v4 -= 16; /*0xffc1555a*/
 *v3 = -2147483632; /*0xffc1555d*/
 v3[2] = &off_FFC18A4C; /*0xffc15565*/
 v3[1] = v4; /*0xffc1556c*/
 DxeIplReportStatus(v3); /*0xffc1556f*/
 v3 += 3; /*0xffc15574*/
 --v1; /*0xffc15577*/
 }
 while ( v1 ); /*0xffc1557a*/
 }
 }
 return DxeIplReportStatus(&unk_FFC18A54);
}

char DxeIplMeasureFv(int a1, unsigned int n128)
{
 unsigned int n128_1; // eax
 int v4; // eax

 if ( !a1 ) /*0xffc15592*/
 return 0; /*0xffc15592*/
 n128_1 = 8 * (n128 >> 3); /*0xffc1559f*/
 if ( n128_1 != n128 || *(_DWORD *)(n128_1 + a1 - 8) != 15 ) /*0xffc155ab*/
 return 0; /*0xffc15597*/
 v4 = 0; /*0xffc155ad*/
 if ( n128 >> 3 != 1 ) /*0xffc155b2*/
 {
 while ( *(_DWORD *)(a1 + 8 *v4) < 0xFu ) /*0xffc155b8*/
 {
 if ( ++v4 >= (n128 >> 3) - 1 ) /*0xffc155bd*/
 return 1; /*0xffc155bd*/
 }
 return 0; /*0xffc155b8*/
 }
 return 1; /*0xffc15596*/
}

int DxeIplFvReadSection(int a1, int a2, int *a3, unsigned int *a4, int a5)
{
 int v5; // edi
 int result; // eax
 unsigned int v7; // esi
 unsigned int v8; // ecx
 int v9; // ecx
 int v10; // eax
 _BYTE v11[4]; // [esp+Ch] [ebp-14h] BYREF
 _DWORD *v12; // [esp+10h] [ebp-10h] BYREF
 unsigned int v13; // [esp+14h] [ebp-Ch] BYREF
 unsigned int v14; // [esp+18h] [ebp-8h]
 unsigned int v15; // [esp+1Ch] [ebp-4h] BYREF

 v5 = 0; /*0xffc155d3*/
 result = DxeIplFvOpenDevice(&v12); /*0xffc155d5*/
 if ( result >= 0 ) /*0xffc155df*/
 {
 v7 = 0; /*0xffc155ef*/
 v8 = v12[1]; /*0xffc15603*/
 v14 = v8; /*0xffc15606*/
 if ( v8 ) /*0xffc1560c*/
 {
 v8 = v12[2]; /*0xffc1560e*/
 while ( !(unsigned __int8)DxeIplFvIsAddrValid(v8) ) /*0xffc15618*/
 {
 ++v7; /*0xffc1561a*/
 v8 = v9 + 16; /*0xffc1561b*/
 if ( v7 >= v14 ) /*0xffc15622*/
 goto LABEL_6; /*0xffc15622*/
 }
 result = (*(int ( **)(int, unsigned int *, unsigned int *, _BYTE *))(v12[4] + 4 *v7))(a2, &v13, &v15, v11); /*0xffc15675*/
 }
 else
 {
LABEL_6:
 result = -2147483645; /*0xffc15624*/
 }
 if ( result >= 0 ) /*0xffc1562b*/
 {
 if ( v15 ) /*0xffc15637*/
 {
 v5 = DxeIplAllocatePages(v8, (v15 >> 12) + ((v15 & 0xFFF) != 0)); /*0xffc15651*/
 if ( !v5 ) /*0xffc15655*/
 return -2147483639; /*0xffc15655*/
 }
 if ( (v11[0] & 1) != 0 && v13 ) /*0xffc1568d*/
 {
 v10 = DxeIplAllocatePages(v8, (v13 >> 12) + ((v13 & 0xFFF) != 0) + 1); /*0xffc156a0*/
 *a3 = v10; /*0xffc156a5*/
 if ( !v10 ) /*0xffc156a9*/
 return -2147483639; /*0xffc1565c*/
 *a3 = v10 + 4092; /*0xffc156b0*/
 }
 result = DxeIplDecompress(v5, a5); /*0xffc156ba*/
 if ( result >= 0 ) /*0xffc156c3*/
 {
 *a4 = v13; /*0xffc156cc*/
 return 0; /*0xffc156ce*/
 }
 }
 }
 return result; /*0xffc156d0*/
}

int DxeIplFvExtractSection(int FvHandle, unsigned int SrcSize_, int *DstBuffer, unsigned int *DstSize)
{
 unsigned int SectionType; // ecx
 unsigned int SectionStart; // eax
 int TypeFlag; // ecx
 unsigned int SectionType_2; // edi
 int HeaderSize; // ecx
 unsigned int CompSize; // edx
 unsigned __int8 *src; // ebx
 int Scratch; // ecx
 unsigned __int8 **Pages; // ebp
 int DstAlloc; // eax
 int DstPtr; // esi
 int BufAlloc; // eax
 int SavedCtx; // [esp-14h] [ebp-18h]
 unsigned int SectionType_1; // [esp+0h] [ebp-4h] BYREF

 SectionType_1 = SectionType; /*0xffc156d7*/
 SectionStart = SrcSize_; /*0xffc156d8*/
 if ( *(_BYTE *)(SrcSize_ + 3) != 1 ) /*0xffc156e0*/
 return -2147483646; /*0xffc156e8*/
 TypeFlag = *(_DWORD *)SrcSize_ & 0xFFFFFF; /*0xffc156f0*/
 if ( TypeFlag == 0xFFFFFF ) /*0xffc156f6*/
 {
 SectionType_2 = *(_DWORD *)(SrcSize_ + 8); /*0xffc156fe*/
 HeaderSize = 13; /*0xffc15703*/
 CompSize = *(_DWORD *)(SrcSize_ + 4) - 13; /*0xffc15704*/
 LOBYTE(SrcSize_) = *(_BYTE *)(SrcSize_ + 12); /*0xffc15706*/
 }
 else
 {
 SectionType_2 = *(_DWORD *)(SrcSize_ + 4); /*0xffc1570c*/
 CompSize = TypeFlag - 9; /*0xffc1570f*/
 LOBYTE(SrcSize_) = *(_BYTE *)(SrcSize_ + 8); /*0xffc15717*/
 HeaderSize = 9; /*0xffc1571b*/
 }
 src = (unsigned __int8 *)(HeaderSize + SectionStart); /*0xffc1571c*/
 if ( (_BYTE)SrcSize_ ) /*0xffc15729*/
 {
 if ( (unsigned __int8)SrcSize_ != 1 || DxeIplLzmaGetProp(src, CompSize, &SectionType_1, &SrcSize_) < 0 ) /*0xffc15745*/
 return -2147483634; /*0xffc15745*/
 Pages = (unsigned __int8 **)DxeIplAllocatePages(SavedCtx, (SrcSize_ >> 12) + ((SrcSize_ & 0xFFF) != 0)); /*0xffc15764*/
 if ( Pages ) /*0xffc15768*/
 {
 SectionType_2 = SectionType_1; /*0xffc1576a*/
 DstAlloc = DxeIplAllocatePages(Scratch, (SectionType_1 >> 12) + ((SectionType_1 & 0xFFF) != 0) + 1); /*0xffc1577e*/
 if ( DstAlloc ) /*0xffc15787*/
 {
 DstPtr = DstAlloc + 4092; /*0xffc15789*/
 if ( (DxeIplLzmaDecodeProp(src, (unsigned __int8 *)(DstAlloc + 4092), Pages, 1) & 0x80000000) != 0 ) /*0xffc1579f*/
 return -2147483634; /*0xffc157a6*/
 goto LABEL_16; /*0xffc1579f*/
 }
 }
 return -2147483639; /*0xffc157cc*/
 }
 BufAlloc = DxeIplAllocatePages(HeaderSize, (SectionType_2 >> 12) + ((SectionType_2 & 0xFFF) != 0) + 1); /*0xffc157bc*/
 if ( !BufAlloc ) /*0xffc157c5*/
 return -2147483639; /*0xffc157c5*/
 DstPtr = BufAlloc + 4092; /*0xffc157ce*/
 DxeIplFvFreePages((char *)(BufAlloc + 4092), (char *)src, SectionType_2); /*0xffc157d9*/
LABEL_16:
 *DstSize = SectionType_2; /*0xffc157df*/
 *DstBuffer = DstPtr; /*0xffc157e9*/
 return 0; /*0xffc156e8*/
}

int DxeIplFvProcessSections(int a1, int a2)
{
 int i; // edx
 int result; // eax
 int v4; // esi

 for ( i = DxeIplGetPeiServices(); ; i = v4 + *(unsigned __int16 *)(v4 + 2) ) /*0xffc157f9*/
 {
 result = DxeIplLocatePpi(2, i); /*0xffc15817*/
 v4 = result; /*0xffc1581c*/
 if ( !result ) /*0xffc15820*/
 break; /*0xffc15820*/
 if ( (unsigned __int8)DxeIplFvIsAddrValid(&unk_FFC18CD8) ) /*0xffc15805*/
 {
 DxeIplFreePages(*(_DWORD *)(v4 + 24), *(_DWORD *)(v4 + 28), *(_DWORD *)(v4 + 32), *(_DWORD *)(v4 + 36)); /*0xffc15830*/
 *(_DWORD *)(v4 + 36) = 0; /*0xffc1583c*/
 *(_DWORD *)(v4 + 24) = a1; /*0xffc15840*/
 *(_DWORD *)(v4 + 28) = a2; /*0xffc15847*/
 *(_DWORD *)(v4 + 32) = 0x100000; /*0xffc1584a*/
 return a2; /*0xffc15843*/
 }
 }
 return result; /*0xffc15822*/
}

int __thiscall DxeIplCheckBootMode(void *this)
{
 int v1; // esi
 int v3; // [esp-4h] [ebp-Ch]
 int ( **v4)(_DWORD); // [esp+4h] [ebp-4h] BYREF

 v1 = DxeIplLocatePpiByGuid(this, &v4); /*0xffc1586b*/
 if ( v1 >= 0 ) /*0xffc15872*/
 {
 DxeIplGetBootModeFromHob(v3, "DxeIpl"); /*0xffc1588f*/
 return (*v4)(v4); /*0xffc1589b*/
 }
 else
 {
 DxeIplReportStatusCode(-2147483646, 50532354); /*0xffc1587e*/
 return v1; /*0xffc15886*/
 }
}

int __thiscall DxeIplGetNextFfsFile(void *this)
{
 int i_1; // esi
 int v2; // edi
 int v3; // eax
 int v4; // eax
 int i; // ecx
 int v6; // ecx
 int v7; // eax
 _BYTE v9[2]; // [esp+10h] [ebp-18h] BYREF
 int v10; // [esp+12h] [ebp-16h]
 int v11; // [esp+18h] [ebp-10h] BYREF
 _BYTE *v12; // [esp+1Ch] [ebp-Ch] BYREF
 _BYTE v13[6]; // [esp+20h] [ebp-8h] BYREF

 i_1 = 0; /*0xffc158b8*/
 v2 = DxeIplLocatePpiByGuid(this, &v12); /*0xffc158bf*/
 if ( v2 >= 0 ) /*0xffc158ca*/
 {
 *(_DWORD *)v13 = v9; /*0xffc158e3*/
 __sidt(v9); /*0xffc158e9*/
 v2 = (*(int ( **)(_DWORD, _BYTE *))v12)(*(_DWORD *)(v10 - 4), v12); /*0xffc158fa*/
 }
 else
 {
 DxeIplReportStatusCode(-2147483646, 50532358); /*0xffc158d6*/
 }
 if ( v2 >= 0 /*0xffc1591d*/
 && (v3 = DxeIplGetPeiServices(), (v4 = DxeIplGetBootModeGuid(&unk_FFC18CB8, v3)) != 0)
 && !*(_BYTE *)(v4 + 32)
 && *(_QWORD *)(v4 + 24) )
 {
 DxeIplGetPlatformBootMode(); /*0xffc15925*/
 for ( i = 0; DxeIplOpenFv(i, &v11) >= 0; i = i_1 ) /*0xffc1592a*/
 ++i_1; /*0xffc1592e*/
 }
 else
 {
 v12 = v9; /*0xffc15942*/
 __sidt(v9); /*0xffc15948*/
 v6 = *(_DWORD *)(v10 - 4); /*0xffc1594e*/
 v12 = v13; /*0xffc15954*/
 __sidt(v13); /*0xffc1595a*/
 (*(void ( **)(int, int, int, _DWORD, _DWORD, _DWORD))(**(_DWORD **)(*(_DWORD *)&v13[2] - 4) + 88))( /*0xffc1596f*/
 v6,
 -2147483646,
 50532359,
 0,
 0,
 0);
 v7 = DxeIplGetPeiBootMode(); /*0xffc15972*/
 if ( (*(unsigned __int8 ( **)(int))(v7 + 24))(9) ) /*0xffc15979*/
 {
 v12 = v9; /*0xffc15986*/
 __sidt(v9); /*0xffc1598c*/
 (*(void ( **)(int, _DWORD, _DWORD, _DWORD))(**(_DWORD **)(v10 - 4) + 128))(2, 0, 0, 0); /*0xffc1599c*/
 DxeIplNullStall(); /*0xffc159a5*/
 }
 }
 return i_1; /*0xffc159aa*/
}

int __thiscall DxeIplDiscoverDxeCore(void *n32)
{
 _WORD *i; // eax
 int v3; // ecx
 const __int16 *PreviousMemoryTypeInformation; // edi
 int v5; // esi
 int n64; // edx
 unsigned int n128; // [esp+10h] [ebp-8Ch] BYREF
 int ( **v9)(_DWORD, const __int16 *, void *, _DWORD, unsigned int *, _BYTE *); // [esp+14h] [ebp-88h] BYREF
 _BYTE v10[132]; // [esp+18h] [ebp-84h] BYREF

 for ( i = (_WORD *)DxeIplGetPeiServices(); ; *i = -2 ) /*0xffc159bf*/
 {
 i = (_WORD *)DxeIplGetBootModeGuid(&unk_FFC18CC8, i); /*0xffc159d7*/
 if ( !i ) /*0xffc159de*/
 break; /*0xffc159de*/
 }
 if ( DxeIplLocatePpiByGuid(v3, &v9) < 0 ) /*0xffc159fb*/
 goto LABEL_13; /*0xffc159fb*/
 n128 = 128; /*0xffc159fd*/
 PreviousMemoryTypeInformation = L"PreviousMemoryTypeInformation"; /*0xffc15a05*/
 if ( n32 != (void *)5 ) /*0xffc15a0d*/
 PreviousMemoryTypeInformation = L"MemoryTypeInformation"; /*0xffc15a0f*/
 v5 = (*v9)(v9, PreviousMemoryTypeInformation, &unk_FFC18DD8, 0, &n128, v10); /*0xffc15a29*/
 if ( v5 == -2147483634 ) /*0xffc15a34*/
 v5 = (*v9)(v9, PreviousMemoryTypeInformation, &unk_FFC18CC8, 0, &n128, v10); /*0xffc15a4e*/
 if ( v5 < 0 ) /*0xffc15a52*/
 goto LABEL_13; /*0xffc15a52*/
 if ( !DxeIplMeasureFv((int)v10, n128) ) /*0xffc15a5c*/
 v5 = -2147483645; /*0xffc15a6f*/
 if ( v5 < 0 ) /*0xffc15a76*/
 {
LABEL_13:
 n64 = n64; /*0xffc15a78*/
 n128 = n64; /*0xffc15a83*/
 }
 DxeIplAllocPagesBelow4G(n64); /*0xffc15a8c*/
 return DxeIplAllocPagesBelow4G(16); /*0xffc15a9e*/
}

int DxeIplEntry(int PeiServicesPtr, int BootServices)
{
 int Guid; // ecx
 int Vol; // esi
 int NextFfsFile; // edi
 int PlatformBootMode; // eax
 void *Status; // ecx
 void *PlatformBootMode_1; // ebx
 int FvSection; // eax
 int PpiStatus; // ecx
 int FvStatus; // eax
 int DxeHandle; // ecx
 int PpiStatus_1; // [esp-4h] [ebp-64h]
 int DxeHandle_1; // [esp+Ch] [ebp-54h] BYREF
 int v15; // [esp+10h] [ebp-50h] BYREF
 _BYTE *v16; // [esp+14h] [ebp-4Ch]
 int ( **v17)(_DWORD, int, int *, __int64 *, int *, _BYTE *); // [esp+18h] [ebp-48h] BYREF
 _BYTE v18[4]; // [esp+1Ch] [ebp-44h] BYREF
 _BYTE v19[2]; // [esp+20h] [ebp-40h] BYREF
 int v20; // [esp+22h] [ebp-3Eh]
 int v21[2]; // [esp+28h] [ebp-38h] BYREF
 __int64 v22; // [esp+30h] [ebp-30h] BYREF
 int v23[2]; // [esp+38h] [ebp-28h] BYREF
 _BYTE v24[32]; // [esp+40h] [ebp-20h] BYREF

 Vol = 0; /*0xffc15abd*/
 NextFfsFile = 0; /*0xffc15abf*/
 DxeIplDebugPrintGuid(Guid, "DxeIpl"); /*0xffc15ac1*/
 (*(void ( **)(int, int, int, _DWORD, _DWORD, _DWORD))(*(_DWORD *)BootServices + 88))( /*0xffc15ad9*/
 BootServices,
 1,
 50466817,
 0,
 0,
 0);
 PlatformBootMode = DxeIplGetPlatformBootMode(); /*0xffc15adf*/
 PlatformBootMode_1 = (void *)PlatformBootMode; /*0xffc15ae4*/
 if ( PlatformBootMode == 17 ) /*0xffc15ae9*/
 {
 if ( DxeIplCheckBootMode(Status) < 0 ) /*0xffc15af2*/
 {
 DxeIplReportStatusCode(2, 50532357); /*0xffc15b01*/
 v16 = v19; /*0xffc15b0d*/
 __sidt(v19); /*0xffc15b15*/
 (*(void ( **)(_DWORD))(**(_DWORD **)(v20 - 4) + 92))(*(_DWORD *)(v20 - 4)); /*0xffc15b22*/
 }
 }
 else if ( PlatformBootMode == 32 || PlatformBootMode == 18 ) /*0xffc15b30*/
 {
 NextFfsFile = DxeIplGetNextFfsFile(Status); /*0xffc15b37*/
 PlatformBootMode_1 = (void *)DxeIplGetPlatformBootMode(); /*0xffc15b3e*/
 }
 DxeIplReportStatus(&unk_FFC18AC4); /*0xffc15b45*/
 DxeIplDiscoverDxeCore(PlatformBootMode_1); /*0xffc15b4c*/
 do /*0xffc15b68*/
 {
 FvStatus = DxeIplOpenFv(NextFfsFile++, (int)&v15); /*0xffc15b70*/
 if ( FvStatus < 0 ) /*0xffc15b78*/
 {
 DxeIplReportStatusCode(2, 50466816); /*0xffc15b87*/
 DxeIplGetBootModeFromHob(); /*0xffc15b91*/
 return -2147483634; /*0xffc15ba4*/
 }
 DxeHandle_1 = 0; /*0xffc15b5c*/
 FvSection = DxeIplReadFvSection(v15, (int)&DxeHandle_1); /*0xffc15b60*/
 PpiStatus = PpiStatus_1; /*0xffc15b65*/
 }
 while ( FvSection < 0 ); /*0xffc15b68*/
 do /*0xffc15bdc*/
 DxeIplLocatePpiByGuid((int)&unk_FFC18D88, Vol++, PpiStatus, (int)&v17); /*0xffc15bb2*/
 while ( (*v17)(v17, DxeHandle_1, v23, &v22, v21, v18) < 0 ); /*0xffc15bdc*/
 DxeHandle = DxeHandle_1; /*0xffc15bde*/
 v16 = v19; /*0xffc15be6*/
 __sidt(v19); /*0xffc15bee*/
 (*(void ( **)(int, _BYTE *))(**(_DWORD **)(v20 - 4) + 108))(DxeHandle, v24); /*0xffc15c00*/
 DxeIplDecompressPages( /*0xffc15c2f*/
 v23[0],
 v23[1],
 v22 + (-(int)v22 & 0xFFF),
 (v22 + (unsigned __int64)(-(int)v22 & 0xFFF)) >> 32,
 v21[0],
 v21[1]);
 DxeIplTransferToDxeCore(); /*0xffc15c3f*/
 DxeIplNullStall(); /*0xffc15c47*/
 return -2147483639; /*0xffc15b9e*/
}

int DxeIplTransferToDxeCore()
{
 int v0; // ecx
 int v1; // ecx
 int v2; // ecx
 __int64 v4; // [esp+Ch] [ebp-10h] BYREF
 unsigned __int32 v5; // [esp+18h] [ebp-4h]

 DxeIplFvGetFileSize(&v4); /*0xffc15c68*/
 v5 = (unsigned __int64)(v4 + 1048544) >> 32; /*0xffc15c83*/
 __lgdt("G"); /*0xffc15c90*/
 v5 = DxeIplCreatePageTables(); /*0xffc15c9f*/
 DxeIplDebugPrintGuid(v0, "PeiEnd"); /*0xffc15ca5*/
 DxeIplReportStatus(&unk_FFC18A70); /*0xffc15cb2*/
 DxeIplGetBootModeFromHob(v1, "PeiEnd"); /*0xffc15cbc*/
 DxeIplGetBootModeFromHob(v2, "DxeIpl"); /*0xffc15cc6*/
 __writecr3(v5); /*0xffc15cd1*/
 DxeIplFvProcessSections(v4, SHIDWORD(v4)); /*0xffc15cdc*/
 return DxeIplZeroMem(); /*0xffc15cf9*/
}

int __thiscall DxeIplCreatePageTables(void *this)
{
 unsigned __int8 ( **PeiServices)(int); // eax
 _WORD *i; // eax
 _WORD *Ppi; // eax
 int PhysAddrBits; // ecx
 unsigned __int8 MaxPhysAddr; // bl
 int result; // eax
 int NumPml4Entries; // esi
 __int64 v8; // rax
 __int64 NumPdptEntries; // rax
 int NumPml4Entries_2; // edx
 int Pml4Table; // eax
 unsigned int Index; // edx
 _DWORD *Pml4Table_1; // edi
 int *PdptTable_1; // eax
 int NumPml4Entries_5; // ecx
 int *PdptTable; // esi
 bool v17; // zf
 int v18; // eax
 int PageAttr_1; // edi
 int n512_5; // ecx
 unsigned int Index_2; // kr00_4
 _DWORD *Pml4Table_4; // edi
 unsigned int n512_4; // edx
 _DWORD *PdptTable_4; // edi
 _DWORD *PdptTable_5; // edx
 int v26; // eax
 unsigned int Index_3; // ecx
 int n512_3; // edi
 unsigned __int64 Index_4; // kr08_8
 unsigned int v30; // edi
 int v31; // ebx
 int PhysAddrBits_1; // [esp-4h] [ebp-54h]
 int PhysAddrBits_2; // [esp-4h] [ebp-54h]
 int Pml4Table_2; // [esp+14h] [ebp-3Ch]
 int NumPml4Entries_4; // [esp+18h] [ebp-38h]
 unsigned int n512_2; // [esp+1Ch] [ebp-34h]
 int v37; // [esp+20h] [ebp-30h] BYREF
 unsigned int NumPml4Entries_1; // [esp+24h] [ebp-2Ch]
 int NumPml4Entries_3; // [esp+28h] [ebp-28h]
 unsigned int n512_1; // [esp+2Ch] [ebp-24h]
 int *PdptTable_2; // [esp+30h] [ebp-20h]
 unsigned int n512; // [esp+34h] [ebp-1Ch]
 _DWORD *PdptTable_3; // [esp+38h] [ebp-18h]
 _DWORD *Pml4Table_3; // [esp+3Ch] [ebp-14h]
 int PageAttr; // [esp+40h] [ebp-10h]
 int Enable1GPages; // [esp+44h] [ebp-Ch]
 unsigned int Index_1; // [esp+48h] [ebp-8h]
 unsigned int p_n36; // [esp+4Ch] [ebp-4h] BYREF

 LOBYTE(Enable1GPages) = 0; /*0xffc15d0b*/
 PeiServices = (unsigned __int8 ( **)(int))DxeIplGetPeiBootMode(this); /*0xffc15d0e*/
 if ( PeiServices[6](4) ) /*0xffc15d15*/
 {
 DxeIplGetBootMode(0x80000000, &p_n36, PhysAddrBits_1, PhysAddrBits_1, 0); /*0xffc15d2a*/
 if ( p_n36 >= 0x80000001 ) /*0xffc15d38*/
 {
 DxeIplGetBootMode(-2147483647, 0, -2147483647, -2147483647, &v37); /*0xffc15d42*/
 if ( (v37 & 0x4000000) != 0 ) /*0xffc15d51*/
 LOBYTE(Enable1GPages) = 1; /*0xffc15d53*/
 }
 }
 i = (_WORD *)DxeIplGetPeiServices(); /*0xffc15d57*/
 Ppi = DxeIplLocatePpi(6, i); /*0xffc15d61*/
 if ( Ppi ) /*0xffc15d68*/
 {
 MaxPhysAddr = *((_BYTE *)Ppi + 8); /*0xffc15d6a*/
 }
 else
 {
 DxeIplGetBootMode(0x80000000, &p_n36, PhysAddrBits, PhysAddrBits, 0); /*0xffc15d77*/
 PhysAddrBits = -2147483640; /*0xffc15d7c*/
 if ( p_n36 < 0x80000008 ) /*0xffc15d87*/
 {
 MaxPhysAddr = 36; /*0xffc15d9c*/
 }
 else
 {
 DxeIplGetBootMode(-2147483640, &p_n36, -2147483640, -2147483640, 0); /*0xffc15d8f*/
 MaxPhysAddr = p_n36; /*0xffc15d94*/
 }
 }
 LOBYTE(Index_1) = MaxPhysAddr; /*0xffc15d9e*/
 if ( MaxPhysAddr > 0x30u ) /*0xffc15da4*/
 {
 MaxPhysAddr = 48; /*0xffc15da6*/
 LOBYTE(Index_1) = 48; /*0xffc15da8*/
 }
 if ( dword_FFC18E48 ) /*0xffc15db2*/
 {
 result = dword_FFC18E48(Index_1, Enable1GPages); /*0xffc15dba*/
 PhysAddrBits = PhysAddrBits_2; /*0xffc15dbd*/
 if ( result ) /*0xffc15dc0*/
 return result; /*0xffc15dc0*/
 }
 if ( MaxPhysAddr > 0x27u ) /*0xffc15dcc*/
 {
 NumPml4Entries_1 = MaxPhysAddr - 39; /*0xffc15e12*/
 LOBYTE(PhysAddrBits) = MaxPhysAddr - 39; /*0xffc15e15*/
 NumPdptEntries = 0x100000000LL; /*0xffc15e18*/
 if ( ((MaxPhysAddr - 39) & 0x20) == 0 ) /*0xffc15e20*/
 NumPdptEntries = 1; /*0xffc15e22*/
 NumPml4Entries = NumPdptEntries << (PhysAddrBits & 0x1F); /*0xffc15e2c*/
 NumPml4Entries_1 = NumPml4Entries; /*0xffc15e33*/
 LODWORD(NumPdptEntries) = 512; /*0xffc15e36*/
 n512 = 512; /*0xffc15e38*/
 }
 else
 {
 PhysAddrBits = 1; /*0xffc15dd3*/
 NumPml4Entries_3 = MaxPhysAddr - 30; /*0xffc15dd4*/
 NumPml4Entries = 1; /*0xffc15ddb*/
 NumPml4Entries_1 = 1; /*0xffc15ddd*/
 LOBYTE(PhysAddrBits) = MaxPhysAddr - 30; /*0xffc15de3*/
 v8 = 0x100000000LL; /*0xffc15de6*/
 if ( ((MaxPhysAddr - 30) & 0x20) == 0 ) /*0xffc15dee*/
 v8 = 1; /*0xffc15df0*/
 NumPdptEntries = v8 << (PhysAddrBits & 0x1F); /*0xffc15df8*/
 n512 = NumPdptEntries; /*0xffc15dfa*/
 }
 if ( (_BYTE)Enable1GPages ) /*0xffc15e42*/
 NumPml4Entries_2 = NumPml4Entries; /*0xffc15e4c*/
 else
 NumPml4Entries_2 = NumPml4Entries * (NumPdptEntries + 1); /*0xffc15e47*/
 Pml4Table = DxeIplAllocatePages(PhysAddrBits, NumPml4Entries_2 + 1); /*0xffc15e4f*/
 Index = 0; /*0xffc15e56*/
 PageAttr = 0; /*0xffc15e58*/
 Pml4Table_1 = (_DWORD *)Pml4Table; /*0xffc15e5b*/
 Pml4Table_2 = Pml4Table; /*0xffc15e5d*/
 PdptTable_1 = (int *)(Pml4Table + 4096); /*0xffc15e60*/
 NumPml4Entries_5 = 0; /*0xffc15e65*/
 Pml4Table_3 = (_DWORD *)Pml4Table_2; /*0xffc15e67*/
 Index_1 = 0; /*0xffc15e6a*/
 if ( !NumPml4Entries ) /*0xffc15e6f*/
 {
LABEL_44:
 v31 = 512 - NumPml4Entries_5; /*0xffc15f95*/
 do /*0xffc15fa7*/
 {
 DxeIplSetMem32(Pml4Table_1, 8u); /*0xffc15f9a*/
 Pml4Table_1 += 2; /*0xffc15fa0*/
 --v31; /*0xffc15fa4*/
 }
 while ( v31 ); /*0xffc15fa7*/
 return Pml4Table_2; /*0xffc15fa7*/
 }
 NumPml4Entries_3 = NumPml4Entries; /*0xffc15e75*/
 NumPml4Entries_4 = NumPml4Entries; /*0xffc15e78*/
 do /*0xffc15f87*/
 {
 Pml4Table_1[1] = 0; /*0xffc15e7b*/
 PdptTable = PdptTable_1; /*0xffc15e7f*/
 *Pml4Table_1 = PdptTable_1; /*0xffc15e86*/
 *Pml4Table_1 |= 2u; /*0xffc15e88*/
 *Pml4Table_1 |= 1u; /*0xffc15e8b*/
 v17 = (_BYTE)Enable1GPages == 0; /*0xffc15e8e*/
 PdptTable_3 = PdptTable_1 + 1024; /*0xffc15e92*/
 v18 = Pml4Table_1[1]; /*0xffc15e95*/
 PdptTable_2 = PdptTable; /*0xffc15e98*/
 Pml4Table_1[1] = v18; /*0xffc15e9b*/
 if ( v17 ) /*0xffc15e9e*/
 {
 n512_4 = 0; /*0xffc15edc*/
 if ( n512 ) /*0xffc15ee0*/
 {
 PdptTable_4 = PdptTable_3; /*0xffc15ee2*/
 n512_1 = n512; /*0xffc15ee5*/
 n512_2 = n512; /*0xffc15ee8*/
 do /*0xffc15f4c*/
 {
 PdptTable[1] = 0; /*0xffc15eeb*/
 PdptTable_5 = PdptTable_4; /*0xffc15eef*/
 v26 = PdptTable[1]; /*0xffc15ef1*/
 Index_3 = Index_1; /*0xffc15efa*/
 *PdptTable = (int)PdptTable_4; /*0xffc15efd*/
 *PdptTable |= 2u; /*0xffc15eff*/
 *PdptTable |= 1u; /*0xffc15f02*/
 PdptTable_3 = PdptTable_4 + 1024; /*0xffc15f05*/
 n512_3 = 512; /*0xffc15f08*/
 PdptTable[1] = v26; /*0xffc15f0a*/
 Index_4 = __PAIR64__(PageAttr, Index_3); /*0xffc15f0d*/
 do /*0xffc15f34*/
 {
 *PdptTable_5 = Index_4 | 2; /*0xffc15f15*/
 *PdptTable_5 |= 1u; /*0xffc15f19*/
 *PdptTable_5 |= 0x80u; /*0xffc15f1c*/
 PdptTable_5[1] = HIDWORD(Index_4); /*0xffc15f28*/
 PdptTable_5 += 2; /*0xffc15f2b*/
 Index_4 += 0x200000LL; /*0xffc15f2e*/
 --n512_3; /*0xffc15f31*/
 }
 while ( n512_3 ); /*0xffc15f34*/
 PdptTable_4 = PdptTable_3; /*0xffc15f36*/
 PageAttr = HIDWORD(Index_4); /*0xffc15f39*/
 PdptTable = PdptTable_2 + 2; /*0xffc15f3f*/
 Index_1 = Index_4; /*0xffc15f42*/
 v17 = n512_1-- == 1; /*0xffc15f45*/
 PdptTable_2 += 2; /*0xffc15f49*/
 }
 while ( !v17 ); /*0xffc15f4c*/
 Pml4Table_4 = Pml4Table_3; /*0xffc15f4e*/
 if ( n512 >= 0x200 ) /*0xffc15f54*/
 goto LABEL_40; /*0xffc15f54*/
 n512_4 = n512_2; /*0xffc15f56*/
 }
 v30 = 512 - n512_4; /*0xffc15f60*/
 do /*0xffc15f72*/
 {
 DxeIplSetMem32(PdptTable, 8u); /*0xffc15f65*/
 PdptTable += 2; /*0xffc15f6b*/
 --v30; /*0xffc15f6f*/
 }
 while ( v30 ); /*0xffc15f72*/
 Pml4Table_4 = Pml4Table_3; /*0xffc15f74*/
LABEL_40:
 Index = Index_1; /*0xffc15f77*/
 goto LABEL_41; /*0xffc15f77*/
 }
 PageAttr_1 = PageAttr; /*0xffc15ea0*/
 n512_5 = 512; /*0xffc15ea3*/
 do /*0xffc15ec9*/
 {
 *PdptTable = Index | 2; /*0xffc15eaa*/
 *PdptTable |= 1u; /*0xffc15eae*/
 *PdptTable |= 0x80u; /*0xffc15eb1*/
 PdptTable[1] = PageAttr_1; /*0xffc15ebd*/
 PdptTable += 2; /*0xffc15ec0*/
 Index_2 = Index + 0x40000000; /*0xffc15ec3*/
 PageAttr_1 = (__PAIR64__(PageAttr_1, Index) + 0x40000000) >> 32; /*0xffc15ec3*/
 Index += 0x40000000; /*0xffc15ec3*/
 --n512_5; /*0xffc15ec6*/
 }
 while ( n512_5 ); /*0xffc15ec9*/
 PageAttr = PageAttr_1; /*0xffc15ecb*/
 Pml4Table_4 = Pml4Table_3; /*0xffc15ece*/
 Index_1 = Index_2; /*0xffc15ed1*/
LABEL_41:
 PdptTable_1 = PdptTable_3; /*0xffc15f7a*/
 Pml4Table_1 = Pml4Table_4 + 2; /*0xffc15f7d*/
 v17 = NumPml4Entries_3-- == 1; /*0xffc15f80*/
 Pml4Table_3 = Pml4Table_1; /*0xffc15f84*/
 }
 while ( !v17 ); /*0xffc15f87*/
 if ( NumPml4Entries_1 < 0x200 ) /*0xffc15f90*/
 {
 NumPml4Entries_5 = NumPml4Entries_4; /*0xffc15f92*/
 goto LABEL_44; /*0xffc15f92*/
 }
 return Pml4Table_2; /*0xffc15fac*/
}

void DxeIplNullStall()
{
 while ( 1 ) /*0xffc15fbe*/
 ; /*0xffc15fbe*/
}

int DxeIplGetBootMode(int _EAX, unsigned int *p_n36, int PhysAddrBits, int a4, _DWORD *a5)
{
 _EAX = _EAX; /*0xffc15fdd*/
 __asm { cpuid } /*0xffc15fe0*/
 if ( p_n36 ) /*0xffc15fe6*/
 *p_n36 = _EAX; /*0xffc15fe8*/
 if ( a5 ) /*0xffc15ffc*/
 *a5 = _EDX; /*0xffc15ffe*/
 return _EAX; /*0xffc16003*/
}

int DxeIplGetPeiServices()
{
 _BYTE v1[2]; // [esp+0h] [ebp-10h] BYREF
 int v2; // [esp+2h] [ebp-Eh]
 _DWORD v3[2]; // [esp+8h] [ebp-8h] BYREF

 v3[1] = v1; /*0xffc16011*/
 __sidt(v1); /*0xffc16017*/
 (*(void ( **)(_DWORD, _DWORD *))(**(_DWORD **)(v2 - 4) + 48))(*(_DWORD *)(v2 - 4), v3); /*0xffc16027*/
 return v3[0]; /*0xffc1602f*/
}

_WORD *DxeIplLocatePpi(__int16 n6, _WORD *i)
{
 while ( 1 ) /*0xffc16046*/
 {
 if ( *i == 0xFFFF ) /*0xffc1604c*/
 return 0; /*0xffc16051*/
 if ( *i == n6 ) /*0xffc1603e*/
 break; /*0xffc1603e*/
 i = (_WORD *)((char *)i + (unsigned __int16)i[1]); /*0xffc16044*/
 }
 return i; /*0xffc16050*/
}

_WORD *DxeIplGetBootModeGuid(int a1, _WORD *i)
{
 _WORD *v3; // esi

 while ( 1 ) /*0xffc16079*/
 {
 v3 = DxeIplLocatePpi(4, i); /*0xffc16079*/
 if ( !v3 || (unsigned __int8)DxeIplFvIsAddrValid(a1) ) /*0xffc16062*/
 break; /*0xffc16062*/
 i = (_WORD *)((char *)v3 + (unsigned __int16)v3[1]); /*0xffc1606f*/
 }
 return v3; /*0xffc1607f*/
}

int DxeIplGetPlatformBootMode()
{
 _BYTE v1[2]; // [esp+0h] [ebp-10h] BYREF
 int v2; // [esp+2h] [ebp-Eh]
 _DWORD v3[2]; // [esp+8h] [ebp-8h] BYREF

 v3[1] = v1; /*0xffc1608e*/
 __sidt(v1); /*0xffc16094*/
 (*(void ( **)(_DWORD, _DWORD *))(**(_DWORD **)(v2 - 4) + 40))(*(_DWORD *)(v2 - 4), v3); /*0xffc160a4*/
 return v3[0]; /*0xffc160ac*/
}

int DxeIplSetBootMode(int n2, int n72)
{
 _BYTE v3[2]; // [esp+8h] [ebp-10h] BYREF
 int v4; // [esp+Ah] [ebp-Eh]
 _DWORD v5[2]; // [esp+10h] [ebp-8h] BYREF

 v5[1] = v3; /*0xffc160bb*/
 __sidt(v3); /*0xffc160c1*/
 if ( (*(int ( **)(_DWORD, int, int, _DWORD *))(**(_DWORD **)(v4 - 4) + 52))(*(_DWORD *)(v4 - 4), n2, n72, v5) >= 0 ) /*0xffc160dd*/
 return v5[0]; /*0xffc160e3*/
 else
 return 0; /*0xffc160df*/
}

_DWORD *DxeIplDecompressPages(int a1, int a2, int a3, int a4, int a5, int a6)
{
 int v6; // ecx
 int v7; // edi
 _DWORD *result; // eax
 _DWORD *v9; // esi

 v7 = v6; /*0xffc160f2*/
 result = (_DWORD *)DxeIplSetBootMode(2, 72); /*0xffc160f7*/
 v9 = result; /*0xffc160fc*/
 if ( result ) /*0xffc16100*/
 {
 result[2] = dword_FFC18D28; /*0xffc16108*/
 result[3] = dword_FFC18D2C; /*0xffc16111*/
 result[4] = dword_FFC18D30; /*0xffc16119*/
 result[5] = dword_FFC18D34; /*0xffc16121*/
 result[6] = a1; /*0xffc16127*/
 result[7] = a2; /*0xffc1612d*/
 result[8] = a3; /*0xffc16133*/
 result[9] = a4; /*0xffc16139*/
 result[10] = 3; /*0xffc16142*/
 DxeIplSetMem32(result + 11, 4u); /*0xffc16149*/
 DxeIplFvSetError(v9 + 12, v7); /*0xffc16155*/
 v9[16] = a5; /*0xffc1615d*/
 v9[17] = a6; /*0xffc16163*/
 return (_DWORD *)a6; /*0xffc16160*/
 }
 return result; /*0xffc16166*/
}

int DxeIplAllocPages(_DWORD *DxeIplPpi, int BufferSize)
{
 int Status; // eax
 int FvEntry; // esi

 Status = DxeIplSetBootMode(4, BufferSize + 24); /*0xffc16175*/
 FvEntry = Status; /*0xffc1617a*/
 if ( Status ) /*0xffc1617e*/
 {
 DxeIplFvSetError((_DWORD *)(Status + 8), DxeIplPpi); /*0xffc16185*/
 return FvEntry + 24; /*0xffc1618a*/
 }
 return Status; /*0xffc1618d*/
}

char *DxeIplAllocPagesBelow4G(_DWORD *DxeIplPpi, char *SourceData, int BufferSize)
{
 char *Destination; // eax

 Destination = (char *)DxeIplAllocPages(DxeIplPpi, BufferSize); /*0xffc16198*/
 if ( Destination ) /*0xffc1619f*/
 return DxeIplFvFreePages(Destination, SourceData, BufferSize); /*0xffc161ab*/
 return Destination; /*0xffc161a1*/
}

_DWORD *DxeIplFreePages(int a1, int a2, int a3, int a4)
{
 _DWORD *result; // eax
 _DWORD *v5; // esi

 result = (_DWORD *)DxeIplSetBootMode(2, 48); /*0xffc161ba*/
 v5 = result; /*0xffc161bf*/
 if ( result ) /*0xffc161c3*/
 {
 DxeIplSetMem32(result + 2, 0x10u); /*0xffc161cb*/
 v5[7] = a2; /*0xffc161d8*/
 v5[8] = a3; /*0xffc161df*/
 v5[9] = a4; /*0xffc161e8*/
 v5[10] = 4; /*0xffc161ed*/
 v5[6] = a1; /*0xffc161f4*/
 return DxeIplSetMem32(v5 + 11, 4u); /*0xffc161f7*/
 }
 return result; /*0xffc161ff*/
}

int __thiscall DxeIplReportStatus(void *this)
{
 _BYTE v2[2]; // [esp+0h] [ebp-Ch] BYREF
 int v3; // [esp+2h] [ebp-Ah]
 _BYTE *v4; // [esp+8h] [ebp-4h]

 v4 = v2; /*0xffc1620a*/
 __sidt(v2); /*0xffc16210*/
 return (*(int ( **)(_DWORD, void *))(**(_DWORD **)(v3 - 4) + 24))(*(_DWORD *)(v3 - 4), this); /*0xffc16222*/
}

int DxeIplLocatePpiByGuid(int a1, int a2, int a3, int a4)
{
 _BYTE v5[2]; // [esp+4h] [ebp-Ch] BYREF
 int v6; // [esp+6h] [ebp-Ah]
 _BYTE *v7; // [esp+Ch] [ebp-4h]

 v7 = v5; /*0xffc16230*/
 __sidt(v5); /*0xffc16236*/
 return (*(int ( **)(_DWORD, int, int, _DWORD, int))(**(_DWORD **)(v6 - 4) + 32))( /*0xffc1624f*/
 *(_DWORD *)(v6 - 4),
 a1,
 a2,
 0,
 a4);
}

int DxeIplOpenFv(int i, int a2)
{
 _BYTE v3[2]; // [esp+4h] [ebp-Ch] BYREF
 int v4; // [esp+6h] [ebp-Ah]
 _BYTE *v5; // [esp+Ch] [ebp-4h]

 v5 = v3; /*0xffc1625e*/
 __sidt(v3); /*0xffc16264*/
 return (*(int ( **)(_DWORD, int, int))(**(_DWORD **)(v4 - 4) + 56))(*(_DWORD *)(v4 - 4), i, a2); /*0xffc16278*/
}

int __usercall DxeIplReadFvSection@<eax>(int a1@<edx>, int p_DxeHandle)
{
 _BYTE v3[2]; // [esp+0h] [ebp-Ch] BYREF
 int v4; // [esp+2h] [ebp-Ah]
 _BYTE *v5; // [esp+8h] [ebp-4h]

 v5 = v3; /*0xffc16286*/
 __sidt(v3); /*0xffc1628c*/
 return (*(int ( **)(_DWORD, int, int, int))(**(_DWORD **)(v4 - 4) + 60))( /*0xffc162a4*/
 *(_DWORD *)(v4 - 4),
 5,
 a1,
 p_DxeHandle);
}

int __usercall DxeIplFvGetFileSize@<eax>(int FfsHeader@<edx>, int p_FileSize)
{
 _BYTE v3[2]; // [esp+0h] [ebp-Ch] BYREF
 int v4; // [esp+2h] [ebp-Ah]
 _BYTE *v5; // [esp+8h] [ebp-4h]

 v5 = v3; /*0xffc162b1*/
 __sidt(v3); /*0xffc162b7*/
 return (*(int ( **)(_DWORD, int, int, int))(**(_DWORD **)(v4 - 4) + 72))( /*0xffc162cf*/
 *(_DWORD *)(v4 - 4),
 4,
 FfsHeader,
 p_FileSize);
}

char *DxeIplFvFreePages(char *dst, char *src, unsigned int n0x14)
{
 if ( !n0x14 || dst == src ) /*0xffc162df*/
 return dst; /*0xffc162da*/
 else
 return DxeIplCopyMem(dst, src, n0x14); /*0xffc162e7*/
}

_DWORD *DxeIplFvSetError(_DWORD *a1, _DWORD *DxeIplPpi)
{
 *a1 = *DxeIplPpi; /*0xffc162f2*/
 a1[1] = DxeIplPpi[1]; /*0xffc162f7*/
 a1[2] = DxeIplPpi[2]; /*0xffc162fd*/
 a1[3] = DxeIplPpi[3]; /*0xffc16303*/
 return a1; /*0xffc16308*/
}

bool DxeIplFvIsAddrValid(_DWORD *a1, _DWORD *a2)
{
 return *a1 == *a2 && a1[1] == a2[1] && a1[2] == a2[2] && a1[3] == a2[3]; /*0xffc16329*/
}

int DxeIplAllocatePages(int Buffer, int FfsHeader)
{
 int FileSize; // [esp+0h] [ebp-8h] BYREF

 if ( FfsHeader && DxeIplFvGetFileSize(FfsHeader, (int)&FileSize) >= 0 ) /*0xffc16346*/
 return FileSize; /*0xffc16348*/
 else
 return 0; /*0xffc16336*/
}

int __thiscall DxeIplAllocateZeroPages(void *PeiServices)
{
 _BYTE Idtr[2]; // [esp+4h] [ebp-10h] BYREF
 int GdtBase; // [esp+6h] [ebp-Eh]
 _DWORD Memory[2]; // [esp+Ch] [ebp-8h] BYREF

 Memory[1] = Idtr; /*0xffc16359*/
 __sidt(Idtr); /*0xffc1635f*/
 if ( (*(int ( **)(_DWORD, void *, _DWORD *))(**(_DWORD **)(GdtBase - 4) + 76))( /*0xffc16379*/
 *(_DWORD *)(GdtBase - 4),
 PeiServices,
 Memory) >= 0 )
 return Memory[0]; /*0xffc1637f*/
 else
 return 0; /*0xffc1637b*/
}

void *__thiscall DxeIplGetPeiBootMode(void *this)
{
 void *this_1; // [esp+0h] [ebp-4h] BYREF

 this_1 = this; /*0xffc16389*/
 DxeIplLocatePpiByGuid((int)&unk_FFC18DE8, 0, (int)this, (int)&this_1); /*0xffc16396*/
 return this_1; /*0xffc163a2*/
}

int __thiscall DxeIplFvOpenDevice(_DWORD **p_this)
{
 _WORD *i_1; // eax
 _WORD *i; // eax
 _DWORD *v4; // ecx
 _WORD *i_2; // esi
 int v6; // eax
 int v8; // eax
 int v9; // eax

 i_1 = (_WORD *)DxeIplGetPeiServices(); /*0xffc163b0*/
 for ( i = DxeIplLocatePpi(4, i_1); ; i = DxeIplLocatePpi(4, (_WORD *)((char *)i_2 + (unsigned __int16)i_2[1])) ) /*0xffc163ba*/
 {
 i_2 = i; /*0xffc163ee*/
 if ( !i ) /*0xffc163f2*/
 {
 v6 = DxeIplAllocPages((int)dword_FFC18DB8, 404); /*0xffc163fb*/
 v4 = (_DWORD *)v6; /*0xffc16400*/
 if ( !v6 ) /*0xffc16404*/
 {
 *p_this = 0; /*0xffc16406*/
 return -2147483639; /*0xffc1640d*/
 }
 *(_DWORD *)(v6 + 4) = 0; /*0xffc16419*/
 v8 = v6 + 20; /*0xffc1641d*/
 *v4 = 1229473104; /*0xffc16420*/
 goto LABEL_11; /*0xffc16420*/
 }
 if ( DxeIplFvIsAddrValid((_DWORD *)i + 2, dword_FFC18DB8) ) /*0xffc163d0*/
 {
 v4 = i_2 + 12; /*0xffc163d9*/
 if ( *((_DWORD *)i_2 + 6) == 1229473104 ) /*0xffc163de*/
 break; /*0xffc163de*/
 }
 }
 v8 = (int)(i_2 + 22); /*0xffc1640f*/
 if ( *((_WORD **)i_2 + 8) == i_2 + 22 ) /*0xffc16415*/
 goto LABEL_12; /*0xffc16415*/
LABEL_11:
 v4[2] = v8; /*0xffc16422*/
 v9 = v8 + 256; /*0xffc16425*/
 v4[3] = v9; /*0xffc1642a*/
 v4[4] = v9 + 64; /*0xffc16430*/
LABEL_12:
 *p_this = v4; /*0xffc16433*/
 return 0; /*0xffc16437*/
}

int DxeIplInstallPpi(char *DxeIplPpi, int (*DxeIplPeiEndCallback)(), int (*DxeIplPpiNotifyCallback)())
{
 int Status; // eax
 _DWORD *FvDevice; // esi
 unsigned int Index; // edi
 unsigned int NumEntries; // ebx
 _DWORD *FvEntry; // ecx
 char *PpiData; // edx
 int v9; // ecx
 _DWORD *DeviceHandle; // [esp+14h] [ebp-4h] BYREF

 Status = DxeIplFvOpenDevice(&DeviceHandle); /*0xffc16457*/
 if ( Status >= 0 ) /*0xffc1645e*/
 {
 FvDevice = DeviceHandle; /*0xffc16464*/
 Index = 0; /*0xffc16468*/
 NumEntries = DeviceHandle[1]; /*0xffc1646a*/
 if ( NumEntries ) /*0xffc1646f*/
 {
 FvEntry = (_DWORD *)DeviceHandle[2]; /*0xffc16471*/
 PpiData = DxeIplPpi; /*0xffc16474*/
 while ( !DxeIplFvIsAddrValid(FvEntry, PpiData) ) /*0xffc1647f*/
 {
 ++Index; /*0xffc16481*/
 FvEntry = (_DWORD *)(v9 + 16); /*0xffc16482*/
 if ( Index >= NumEntries ) /*0xffc16487*/
 goto LABEL_6; /*0xffc16487*/
 }
 *(_DWORD *)(FvDevice[3] + 4 *Index) = DxeIplPpiNotifyCallback; /*0xffc1649f*/
 *(_DWORD *)(FvDevice[4] + 4 *Index) = DxeIplPeiEndCallback; /*0xffc164a5*/
 }
 else
 {
LABEL_6:
 if ( NumEntries >= 0x10 ) /*0xffc1648c*/
 return -2147483639; /*0xffc16493*/
 DxeIplFvSetError((_DWORD *)(FvDevice[2] + 16 *NumEntries), DxeIplPpi); /*0xffc164b8*/
 *(_DWORD *)(FvDevice[3] + 4 *FvDevice[1]) = DxeIplPpiNotifyCallback; /*0xffc164c8*/
 *(_DWORD *)(FvDevice[4] + 4 *FvDevice[1]++) = DxeIplPeiEndCallback; /*0xffc164d5*/
 DxeIplAllocPagesBelow4G(DxeIplPpi, DxeIplPpi, 16); /*0xffc164df*/
 }
 return 0; /*0xffc164e5*/
 }
 return Status; /*0xffc164e7*/
}

int DxeIplDecompress(_DWORD *a1, int a2, int a3, int a4)
{
 int result; // eax
 _DWORD *this_1; // ebx
 unsigned int v7; // esi
 _DWORD *v8; // edx
 _DWORD *v9; // ecx
 int v10; // ecx
 _DWORD *this; // [esp+10h] [ebp-8h] BYREF
 int v12; // [esp+14h] [ebp-4h]

 v12 = a2; /*0xffc164fc*/
 result = DxeIplFvOpenDevice(&this); /*0xffc16504*/
 if ( result >= 0 )
 {
 this_1 = this; /*0xffc16512*/
 v7 = 0; /*0xffc16523*/
 v8 = (_DWORD *)((char *)a1 + ((*a1 & 0xFFFFFF) != 0xFFFFFF ? 0xFFFFFFFC : 0) + 8);
 if ( this[1] ) /*0xffc1652b*/
 {
 v9 = (_DWORD *)this[2]; /*0xffc16530*/
 while ( !DxeIplFvIsAddrValid(v9, v8) ) /*0xffc1653a*/
 {
 ++v7; /*0xffc1653c*/
 v9 = (_DWORD *)(v10 + 16); /*0xffc1653d*/
 if ( v7 >= this_1[1] ) /*0xffc16543*/
 return -2147483645; /*0xffc16543*/
 }
 return (*(int ( **)(_DWORD *, int, int, int))(this_1[3] + 4 *v7))(a1, v12, a3, a4); /*0xffc1655f*/
 }
 else
 {
 return -2147483645; /*0xffc16545*/
 }
 }
 return result; /*0xffc1654a*/
}

int DxeIplDecompressLzma(int a1, unsigned __int16 n8_1)
{
 unsigned __int16 n8; // di
 char n8_2; // cl
 __int64 v5; // rax
 int v6; // eax
 int v7; // eax
 int v8; // ecx
 int result; // eax
 unsigned int v10; // [esp+Ch] [ebp-10h]

 n8 = n8_1; /*0xffc16574*/
 v10 = *(_DWORD *)(a1 + 20); /*0xffc16582*/
 n8_2 = n8_1; /*0xffc16585*/
 LODWORD(v5) = 0; /*0xffc16588*/
 HIDWORD(v5) = v10; /*0xffc1658a*/
 if ( (n8_2 & 0x20) == 0 ) /*0xffc16590*/
 v5 = v10; /*0xffc16592*/
 *(_DWORD *)(a1 + 20) = v5 << (n8_2 & 0x1F); /*0xffc1659f*/
 if ( n8 > *(_WORD *)(a1 + 16) ) /*0xffc165a6*/
 {
 do /*0xffc1660a*/
 {
 n8 -= *(_WORD *)(a1 + 16); /*0xffc165ab*/
 v6 = 0; /*0xffc165c2*/
 if ( (n8 & 0x20) == 0 ) /*0xffc165ca*/
 v6 = *(_DWORD *)(a1 + 24); /*0xffc165cc*/
 *(_DWORD *)(a1 + 20) |= v6 << n8; /*0xffc165d6*/
 v7 = *(_DWORD *)(a1 + 32); /*0xffc165d9*/
 if ( v7 ) /*0xffc165e1*/
 {
 v8 = *(_DWORD *)(a1 + 12); /*0xffc165e3*/
 *(_DWORD *)(a1 + 24) = 0; /*0xffc165e7*/
 *(_DWORD *)(a1 + 32) = v7 - 1; /*0xffc165eb*/
 *(_DWORD *)(a1 + 24) = *(unsigned __int8 *)(*(_DWORD *)a1 + v8); /*0xffc165f4*/
 *(_DWORD *)(a1 + 12) = v8 + 1; /*0xffc165fa*/
 }
 else
 {
 *(_DWORD *)(a1 + 24) = 0; /*0xffc165ff*/
 }
 *(_WORD *)(a1 + 16) = 8; /*0xffc16603*/
 }
 while ( n8 > 8u ); /*0xffc1660a*/
 }
 *(_WORD *)(a1 + 16) -= n8; /*0xffc1660c*/
 result = *(_DWORD *)(a1 + 24) >> *(_BYTE *)(a1 + 16); /*0xffc16616*/
 *(_DWORD *)(a1 + 20) |= result; /*0xffc16618*/
 return result; /*0xffc1661b*/
}

int DxeIplGetDecompressAlgo(int a1, unsigned __int16 n8)
{
 int v2; // esi

 v2 = *(_DWORD *)(a1 + 20) >> (32 - n8); /*0xffc1662d*/
 DxeIplDecompressLzma(a1, n8); /*0xffc16631*/
 return v2; /*0xffc16638*/
}

int DxeIplHuffmanBuildTable(
 int HuffCtx,
 unsigned __int16 NumSymbols,
 int CodeLen,
 unsigned __int16 MaxBits,
 int InitBits)
{
 unsigned __int16 v5; // si
 unsigned __int8 n0x10; // al
 int n15; // ecx
 int v8; // edx
 int n16; // esi
 __int16 v10; // ax
 __int16 v11; // ax
 unsigned __int16 MaxBits_1; // bp
 int MaxBits_3; // esi
 char v14; // bl
 char MaxBits_2; // al
 int MaxBits_6; // edx
 __int16 v17; // ax
 int MaxBits_4; // edx
 __int16 v19; // ax
 unsigned __int16 v20; // ax
 int v21; // edx
 int v22; // eax
 unsigned int v23; // eax
 int NumSymbols_3; // esi
 int InitBits_1; // edi
 int CodeLen_1; // ecx
 unsigned int MaxBits_5; // edx
 unsigned int v28; // ecx
 unsigned __int16 v29; // bx
 unsigned __int16 v30; // di
 unsigned __int16 v31; // dx
 int v32; // ebx
 _WORD *v33; // ecx
 int NumSymbols_2; // ebp
 unsigned __int16 v35; // si
 int n0x3FB; // edx
 int v37; // ecx
 int v39; // eax
 unsigned __int16 v42; // [esp+14h] [ebp-64h]
 int NumSymbols_1; // [esp+18h] [ebp-60h]
 int NumSymbols_4; // [esp+1Ch] [ebp-5Ch]
 unsigned __int16 v45; // [esp+20h] [ebp-58h]
 unsigned __int16 v46; // [esp+28h] [ebp-50h]
 int v47; // [esp+2Ch] [ebp-4Ch]
 _WORD buf[18]; // [esp+30h] [ebp-48h] BYREF
 _DWORD v49[8]; // [esp+54h] [ebp-24h]
 __int16 v50; // [esp+76h] [ebp-2h]

 memset(buf, 0, 34); /*0xffc16652*/
 v5 = 0; /*0xffc16656*/
 if ( NumSymbols ) /*0xffc1665f*/
 {
 do /*0xffc16668*/
 {
 n0x10 = *(_BYTE *)(v5 + CodeLen); /*0xffc16668*/
 if ( n0x10 > 0x10u ) /*0xffc1666d*/
 return 0xFFFF; /*0xffc1666d*/
 ++buf[n0x10]; /*0xffc16676*/
 }
 while ( ++v5 < NumSymbols ); /*0xffc16668*/
 }
 n15 = 15; /*0xffc16681*/
 v8 = 0; /*0xffc16686*/
 v49[0] = 0; /*0xffc1668b*/
 n16 = 16; /*0xffc1668f*/
 do /*0xffc166aa*/
 {
 v10 = buf[++v8]; /*0xffc16691*/
 v11 = *(_WORD *)((char *)v49 + v8 *2) + (v10 << n15--); /*0xffc1669c*/
 *(_WORD *)((char *)v49 + v8 *2 + 2) = v11; /*0xffc166a2*/
 --n16; /*0xffc166a7*/
 }
 while ( n16 ); /*0xffc166aa*/
 if ( v50 ) /*0xffc166b1*/
 return 0xFFFF; /*0xffc1687f*/
 MaxBits_1 = MaxBits; /*0xffc166bc*/
 MaxBits_3 = 1; /*0xffc166c6*/
 v14 = 16 - MaxBits; /*0xffc166c8*/
 buf[0] = 0; /*0xffc166cd*/
 if ( !MaxBits ) /*0xffc166d5*/
 goto LABEL_45; /*0xffc166d5*/
 MaxBits_2 = MaxBits; /*0xffc166d7*/
 do /*0xffc166ff*/
 {
 MaxBits_6 = (unsigned __int16)MaxBits_3; /*0xffc166de*/
 *((_WORD *)v49 + (unsigned __int16)MaxBits_3) >>= v14; /*0xffc166e4*/
 v17 = 1 << (MaxBits_2 - MaxBits_3++); /*0xffc166ef*/
 buf[MaxBits_6] = v17; /*0xffc166f3*/
 MaxBits_2 = MaxBits; /*0xffc166f8*/
 }
 while ( (unsigned __int16)MaxBits_3 <= MaxBits ); /*0xffc166ff*/
 if ( (unsigned __int16)MaxBits_3 <= 0x10u ) /*0xffc16707*/
 {
LABEL_45:
 do /*0xffc16721*/
 {
 MaxBits_4 = (unsigned __int16)MaxBits_3; /*0xffc1670c*/
 v19 = 1 << (16 - MaxBits_3++); /*0xffc16715*/
 buf[MaxBits_4] = v19; /*0xffc16719*/
 }
 while ( (unsigned __int16)MaxBits_3 <= 0x10u ); /*0xffc16721*/
 MaxBits_1 = MaxBits; /*0xffc16723*/
 }
 v20 = *((_WORD *)v49 + MaxBits_1 + 1) >> v14; /*0xffc16735*/
 v21 = v20; /*0xffc16738*/
 if ( v20 ) /*0xffc1673e*/
 {
 v22 = (unsigned __int16)(1 << MaxBits_1); /*0xffc16747*/
 if ( (unsigned __int16)v21 < (unsigned __int16)v22 ) /*0xffc1674d*/
 {
 v23 = 2 * (v22 - v21); /*0xffc16753*/
 if ( v23 ) /*0xffc16755*/
 DxeIplSetMem16((_WORD *)(InitBits + 2 *v21), v23 >> 1, 0); /*0xffc16767*/
 }
 }
 NumSymbols_1 = NumSymbols; /*0xffc16774*/
 NumSymbols_3 = 0; /*0xffc16787*/
 v42 = 1 << (15 - MaxBits_1); /*0xffc1678c*/
 v45 = 1 << MaxBits_1; /*0xffc16793*/
 NumSymbols_4 = 0; /*0xffc16799*/
 if ( NumSymbols ) /*0xffc167a2*/
 {
 InitBits_1 = InitBits; /*0xffc167a8*/
 CodeLen_1 = CodeLen; /*0xffc167b1*/
 do /*0xffc168e2*/
 {
 MaxBits_5 = *(unsigned __int8 *)((unsigned __int16)NumSymbols_3 + CodeLen_1); /*0xffc167bf*/
 if ( *(_BYTE *)((unsigned __int16)NumSymbols_3 + CodeLen_1) && MaxBits_5 < 0x11 ) /*0xffc167cf*/
 {
 v47 = 2 *MaxBits_5; /*0xffc167d9*/
 v28 = *((unsigned __int16 *)v49 + MaxBits_5); /*0xffc167dd*/
 v29 = v28 + buf[MaxBits_5]; /*0xffc167ea*/
 v46 = v29; /*0xffc167ed*/
 if ( (unsigned __int16)MaxBits_5 <= MaxBits_1 ) /*0xffc167f4*/
 {
 while ( (unsigned __int16)v28 < v29 ) /*0xffc16893*/
 {
 if ( (unsigned __int16)v28 >= v45 ) /*0xffc16886*/
 return 0xFFFF; /*0xffc168f2*/
 v39 = (unsigned __int16)v28; /*0xffc16888*/
 LOWORD(v28) = v28 + 1; /*0xffc1688b*/
 *(_WORD *)(InitBits_1 + 2 *v39) = NumSymbols_3; /*0xffc1688c*/
 }
 }
 else
 {
 v30 = *((_WORD *)v49 + MaxBits_5); /*0xffc167fa*/
 v31 = MaxBits_5 - MaxBits_1; /*0xffc167fc*/
 v32 = v31; /*0xffc1680d*/
 v33 = (_WORD *)(InitBits + 2 * (v28 >> (16 - MaxBits))); /*0xffc16810*/
 if ( v31 ) /*0xffc16816*/
 {
 NumSymbols_2 = NumSymbols_1; /*0xffc1681c*/
 v35 = v42; /*0xffc16820*/
 do /*0xffc168a5*/
 {
 if ( !*v33 && (unsigned __int16)NumSymbols_2 < 0x3FBu ) /*0xffc16833*/
 {
 *(_WORD *)(HuffCtx + 2 * (unsigned __int16)NumSymbols_2 + 42) = 0; /*0xffc1683e*/
 *(_WORD *)(HuffCtx + 2 * (unsigned __int16)NumSymbols_2 + 2080) = 0; /*0xffc16843*/
 v35 = v42; /*0xffc1684b*/
 *v33 = NumSymbols_2++; /*0xffc1684f*/
 }
 n0x3FB = (unsigned __int16)*v33; /*0xffc16853*/
 if ( (unsigned __int16)n0x3FB < 0x3FBu ) /*0xffc1685e*/
 {
 v37 = HuffCtx + 2 *n0x3FB; /*0xffc1686d*/
 if ( (v30 & v35) != 0 ) /*0xffc16870*/
 v33 = (_WORD *)(v37 + 2080); /*0xffc16872*/
 else
 v33 = (_WORD *)(v37 + 42); /*0xffc16897*/
 }
 v32 += 0xFFFF; /*0xffc1689a*/
 v30 *= 2; /*0xffc168a0*/
 }
 while ( (_WORD)v32 ); /*0xffc168a5*/
 NumSymbols_3 = NumSymbols_4; /*0xffc168ab*/
 NumSymbols_1 = NumSymbols_2; /*0xffc168af*/
 MaxBits_1 = MaxBits; /*0xffc168b3*/
 }
 v29 = v46; /*0xffc168ba*/
 InitBits_1 = InitBits; /*0xffc168be*/
 *v33 = NumSymbols_3; /*0xffc168c5*/
 }
 CodeLen_1 = CodeLen; /*0xffc168cc*/
 *(_WORD *)((char *)v49 + v47) = v29; /*0xffc168d3*/
 }
 NumSymbols_4 = ++NumSymbols_3; /*0xffc168d9*/
 }
 while ( (unsigned __int16)NumSymbols_3 < NumSymbols ); /*0xffc168e2*/
 }
 return 0; /*0xffc168eb*/
}

int DxeIplLzmaDecodeCore1(
 _DWORD *LzmaCtx,
 unsigned __int16 count,
 unsigned __int16 NumBits,
 __int16 ShiftBits)
{
 unsigned __int16 DecompressAlgo; // di
 unsigned __int16 v7; // ax
 int n0x1F; // esi
 int n7; // eax
 bool v11; // cf
 unsigned int n0x10000000; // ecx
 unsigned __int16 n3; // dx
 int v14; // eax
 __int16 i; // cx
 int v16; // eax
 int n0x1F_1; // eax
 char n7_1; // [esp+14h] [ebp-8h]

 DecompressAlgo = DxeIplGetDecompressAlgo((int)LzmaCtx, NumBits); /*0xffc16911*/
 if ( !DecompressAlgo ) /*0xffc16917*/
 {
 v7 = DxeIplGetDecompressAlgo((int)LzmaCtx, NumBits); /*0xffc1691f*/
 memset32(LzmaCtx + 3213, (v7 << 16) | v7, 0x80u); /*0xffc16939*/
 DxeIplSetMem64(LzmaCtx + 1157, count, 0); /*0xffc16948*/
 return 0; /*0xffc16952*/
 }
 n0x1F = 0; /*0xffc16959*/
 while ( (unsigned __int16)n0x1F < 0x1Fu ) /*0xffc1696f*/
 {
 n7 = LzmaCtx[5] >> 29; /*0xffc16978*/
 n7_1 = n7; /*0xffc1697b*/
 v11 = (unsigned __int16)n7 < 7u; /*0xffc1697f*/
 if ( (_WORD)n7 == 7 ) /*0xffc16982*/
 {
 n0x10000000 = 0x10000000; /*0xffc16984*/
 if ( (LzmaCtx[5] & 0x10000000) == 0 ) /*0xffc1698c*/
 goto LABEL_11; /*0xffc1698c*/
 do /*0xffc16994*/
 {
 n0x10000000 >>= 1; /*0xffc1698e*/
 LOWORD(n7) = n7 + 1; /*0xffc16990*/
 }
 while ( (n0x10000000 & LzmaCtx[5]) != 0 ); /*0xffc16994*/
 n7_1 = n7; /*0xffc16996*/
 v11 = (unsigned __int16)n7 < 7u; /*0xffc1699a*/
 }
 if ( !v11 ) /*0xffc1699d*/
 {
LABEL_11:
 n3 = n7 - 3; /*0xffc169a4*/
 goto LABEL_12; /*0xffc169a7*/
 }
 n3 = 3; /*0xffc169a1*/
LABEL_12:
 DxeIplDecompressLzma((int)LzmaCtx, n3); /*0xffc169aa*/
 v14 = (unsigned __int16)n0x1F++; /*0xffc169b5*/
 *((_BYTE *)LzmaCtx + v14 + 4628) = n7_1; /*0xffc169b9*/
 if ( (_WORD)n0x1F == ShiftBits ) /*0xffc169c5*/
 {
 for ( i = DxeIplGetDecompressAlgo((int)LzmaCtx, 2u) - 1; i >= 0 && (unsigned __int16)n0x1F < 0x1Fu; --i ) /*0xffc169d2*/
 {
 v16 = (unsigned __int16)n0x1F++; /*0xffc169dc*/
 *((_BYTE *)LzmaCtx + v16 + 4628) = 0; /*0xffc169e6*/
 }
 }
 if ( (unsigned __int16)n0x1F >= DecompressAlgo ) /*0xffc169f9*/
 break; /*0xffc169f9*/
 }
 while ( (unsigned __int16)n0x1F < count && (unsigned __int16)n0x1F < 0x1Fu ) /*0xffc16a0b*/
 {
 n0x1F_1 = (unsigned __int16)n0x1F; /*0xffc16a0d*/
 LOWORD(n0x1F) = n0x1F + 1; /*0xffc16a10*/
 *((_BYTE *)LzmaCtx + n0x1F_1 + 4628) = 0; /*0xffc16a11*/
 }
 return DxeIplHuffmanBuildTable((int)LzmaCtx, count, (int)(LzmaCtx + 1157), 8u, (int)(LzmaCtx + 3213)); /*0xffc16a3a*/
}

int __thiscall DxeIplLzmaDecodeCore2(_DWORD *LzmaCtx)
{
 unsigned __int16 DecompressAlgo; // bp
 unsigned __int16 v3; // si
 int value; // eax
 int n0x1FE; // esi
 unsigned __int16 n0x13; // bx
 unsigned int n0x800000; // ecx
 int v8; // ebx
 unsigned __int16 v9; // ax
 int i; // ebx
 int n0x1FE_1; // eax
 int v12; // eax

 DecompressAlgo = DxeIplGetDecompressAlgo((int)LzmaCtx, 9u); /*0xffc16a51*/
 if ( DecompressAlgo )
 {
 n0x1FE = 0; /*0xffc16a9c*/
 do
 {
 if ( (unsigned __int16)n0x1FE >= 0x1FEu ) /*0xffc16ab2*/
 break; /*0xffc16ab2*/
 n0x13 = *((_WORD *)LzmaCtx + HIBYTE(*(LzmaCtx + 5)) + 6426); /*0xffc16abe*/
 if ( n0x13 >= 0x13u ) /*0xffc16ac9*/
 {
 n0x800000 = 0x800000; /*0xffc16acb*/
 do /*0xffc16aec*/
 {
 if ( (n0x800000 & *(LzmaCtx + 5)) != 0 ) /*0xffc16ad6*/
 n0x13 = *((_WORD *)LzmaCtx + n0x13 + 1040); /*0xffc16ad8*/
 else
 n0x13 = *((_WORD *)LzmaCtx + n0x13 + 21); /*0xffc16ae2*/
 n0x800000 >>= 1; /*0xffc16ae7*/
 }
 while ( n0x13 >= 0x13u ); /*0xffc16aec*/
 }
 DxeIplDecompressLzma((int)LzmaCtx, *((unsigned __int8 *)LzmaCtx + n0x13 + 4628)); /*0xffc16afb*/
 if ( n0x13 > 2u )
 {
 v12 = (unsigned __int16)n0x1FE++; /*0xffc16b6c*/
 *((_BYTE *)LzmaCtx + v12 + 4118) = n0x13 - 2; /*0xffc16b73*/
 }
 else
 {
 if ( n0x13 )
 {
 v9 = n0x13 == 1
 ? DxeIplGetDecompressAlgo((int)LzmaCtx, 4u) + 3
 : DxeIplGetDecompressAlgo((int)LzmaCtx, 9u) + 20;
 v8 = v9; /*0xffc16b3b*/
 }
 else
 {
 v8 = 1; /*0xffc16b0f*/
 }
 for ( i = v8 + 0xFFFF; (i & 0x8000u) == 0; *((_BYTE *)LzmaCtx + n0x1FE_1 + 4118) = 0 ) /*0xffc16b47*/
 {
 if ( (unsigned __int16)n0x1FE >= 0x1FEu ) /*0xffc16b51*/
 break; /*0xffc16b51*/
 n0x1FE_1 = (unsigned __int16)n0x1FE; /*0xffc16b53*/
 i += 0xFFFF; /*0xffc16b56*/
 ++n0x1FE; /*0xffc16b5c*/
 }
 }
 }
 while ( (unsigned __int16)n0x1FE < DecompressAlgo );
 if ( (unsigned __int16)n0x1FE != 510 ) /*0xffc16b92*/
 DxeIplSetMem64((char *)LzmaCtx + (unsigned __int16)n0x1FE + 4118, 510 - (unsigned __int16)n0x1FE, 0); /*0xffc16ba0*/
 return DxeIplHuffmanBuildTable((int)LzmaCtx, 0x1FEu, (int)LzmaCtx + 4118, 0xCu, (int)(LzmaCtx + 1165)); /*0xffc16bbc*/
 }
 else
 {
 v3 = DxeIplGetDecompressAlgo((int)LzmaCtx, 9u); /*0xffc16a6b*/
 DxeIplSetMem64((char *)LzmaCtx + 4118, 0x1FEu, 0); /*0xffc16a74*/
 value = (v3 << 16) | v3; /*0xffc16a91*/
 memset32(LzmaCtx + 1165, value, 0x800u); /*0xffc16a93*/
 }
 return value; /*0xffc16bc4*/
}

unsigned __int16 __thiscall DxeIplLzmaRangeDecode(int this)
{
 __int16 v2; // ax
 __int16 v4; // ax
 unsigned int v5; // eax
 unsigned __int16 n0x1FE; // di
 unsigned int n0x80000; // ecx

 if ( !*(_WORD *)(this + 28) ) /*0xffc16bd4*/
 {
 *(_WORD *)(this + 28) = DxeIplGetDecompressAlgo(this, 0x10u); /*0xffc16bec*/
 v2 = DxeIplLzmaDecodeCore1((_DWORD *)this, 0x13u, 5u, 3); /*0xffc16bf0*/
 *(_WORD *)(this + 40) = v2; /*0xffc16bf5*/
 if ( v2 ) /*0xffc16bfe*/
 return 0; /*0xffc16bfe*/
 DxeIplLzmaDecodeCore2((_DWORD *)this); /*0xffc16c06*/
 v4 = DxeIplLzmaDecodeCore1((_DWORD *)this, 0x1Fu, *(unsigned __int8 *)(this + 13364), 0xFFFF); /*0xffc16c19*/
 *(_WORD *)(this + 40) = v4; /*0xffc16c1e*/
 if ( v4 ) /*0xffc16c27*/
 return 0; /*0xffc16c00*/
 }
 v5 = *(_DWORD *)(this + 20); /*0xffc16c29*/
 --*(_WORD *)(this + 28); /*0xffc16c31*/
 n0x1FE = *(_WORD *)(this + 2 * (v5 >> 20) + 4660); /*0xffc16c38*/
 if ( n0x1FE >= 0x1FEu ) /*0xffc16c43*/
 {
 n0x80000 = 0x80000; /*0xffc16c45*/
 do /*0xffc16c66*/
 {
 if ( (n0x80000 & *(_DWORD *)(this + 20)) != 0 ) /*0xffc16c50*/
 n0x1FE = *(_WORD *)(this + 2 *n0x1FE + 2080); /*0xffc16c52*/
 else
 n0x1FE = *(_WORD *)(this + 2 *n0x1FE + 42); /*0xffc16c5c*/
 n0x80000 >>= 1; /*0xffc16c61*/
 }
 while ( n0x1FE >= 0x1FEu ); /*0xffc16c66*/
 }
 DxeIplDecompressLzma(this, *(unsigned __int8 *)(n0x1FE + this + 4118)); /*0xffc16c75*/
 return n0x1FE; /*0xffc16c7d*/
}

char DxeIplLzmaBitDecode(int i)
{
 int j; // esi
 unsigned __int16 n0x100; // cx
 unsigned int DecompressAlgo; // eax
 unsigned int v4; // edx
 int v5; // ebx
 unsigned __int16 n0x1F; // di
 unsigned int n0x800000; // ecx
 unsigned int n0x1F_1; // ebp
 unsigned int k; // edx
 unsigned int v10; // edi
 int v11; // ecx

 for ( j = i; ; i = j ) /*0xffc16c8b*/
 {
 n0x100 = DxeIplLzmaRangeDecode(i); /*0xffc16c92*/
 LOBYTE(DecompressAlgo) = 0; /*0xffc16c95*/
 if ( *(_WORD *)(j + 40) ) /*0xffc16c97*/
 break; /*0xffc16c97*/
 LOBYTE(DecompressAlgo) = 0; /*0xffc16ca1*/
 if ( n0x100 >= 0x100u ) /*0xffc16cac*/
 {
 v5 = (unsigned __int16)(n0x100 - 253); /*0xffc16cce*/
 n0x1F = *(_WORD *)(j + 2 *HIBYTE(*(_DWORD *)(j + 20)) + 12852); /*0xffc16cd7*/
 if ( n0x1F >= 0x1Fu ) /*0xffc16ce2*/
 {
 n0x800000 = 0x800000; /*0xffc16ce4*/
 do /*0xffc16d05*/
 {
 if ( (n0x800000 & *(_DWORD *)(j + 20)) != 0 ) /*0xffc16cef*/
 n0x1F = *(_WORD *)(j + 2 *n0x1F + 2080); /*0xffc16cf1*/
 else
 n0x1F = *(_WORD *)(j + 2 *n0x1F + 42); /*0xffc16cfb*/
 n0x800000 >>= 1; /*0xffc16d00*/
 }
 while ( n0x1F >= 0x1Fu ); /*0xffc16d05*/
 }
 n0x1F_1 = n0x1F; /*0xffc16d07*/
 DxeIplDecompressLzma(j, *(unsigned __int8 *)(j + n0x1F + 4628)); /*0xffc16d14*/
 LOBYTE(DecompressAlgo) = 1; /*0xffc16d1b*/
 if ( n0x1F > 1u ) /*0xffc16d1f*/
 {
 DecompressAlgo = DxeIplGetDecompressAlgo(j, n0x1F - 1); /*0xffc16d26*/
 n0x1F_1 = DecompressAlgo + (1 << (n0x1F - 1)); /*0xffc16d35*/
 }
 for ( k = *(_DWORD *)(j + 8) - n0x1F_1 - 1; ; ++k ) /*0xffc16d41*/
 {
 v5 += 0xFFFF; /*0xffc16d5e*/
 if ( (v5 & 0x8000u) != 0 ) /*0xffc16d63*/
 break; /*0xffc16d63*/
 v10 = *(_DWORD *)(j + 8); /*0xffc16d44*/
 if ( v10 >= *(_DWORD *)(j + 36) ) /*0xffc16d4a*/
 return DecompressAlgo; /*0xffc16d4a*/
 if ( k >= *(_DWORD *)(j + 36) ) /*0xffc16d4f*/
 {
 *(_WORD *)(j + 40) = -1; /*0xffc16d74*/
 return DecompressAlgo; /*0xffc16d74*/
 }
 v11 = *(_DWORD *)(j + 4); /*0xffc16d51*/
 LOBYTE(DecompressAlgo) = *(_BYTE *)(v11 + k); /*0xffc16d54*/
 *(_BYTE *)(v11 + v10) = DecompressAlgo; /*0xffc16d57*/
 ++*(_DWORD *)(j + 8); /*0xffc16d5a*/
 }
 DecompressAlgo = *(_DWORD *)(j + 8); /*0xffc16d65*/
 if ( DecompressAlgo >= *(_DWORD *)(j + 36) ) /*0xffc16d6b*/
 return DecompressAlgo; /*0xffc16d6b*/
 }
 else
 {
 v4 = *(_DWORD *)(j + 8); /*0xffc16cae*/
 if ( v4 >= *(_DWORD *)(j + 36) ) /*0xffc16cb4*/
 return DecompressAlgo; /*0xffc16cb4*/
 *(_BYTE *)(v4 + *(_DWORD *)(j + 4)) = n0x100; /*0xffc16cbd*/
 ++*(_DWORD *)(j + 8); /*0xffc16cc0*/
 }
 }
 return DecompressAlgo; /*0xffc16d78*/
}

int DxeIplLzmaGetProp(_DWORD *src, unsigned int n8, _DWORD *DestSize, _DWORD *SrcSize)
{
 unsigned int n8_1; // eax

 if ( n8 < 8 ) /*0xffc16d83*/
 return -2147483646; /*0xffc16d83*/
 n8_1 = *src + 8; /*0xffc16d87*/
 if ( n8 < n8_1 || n8_1 < 8 ) /*0xffc16d91*/
 return -2147483646; /*0xffc16da9*/
 *SrcSize = 13368; /*0xffc16d97*/
 *DestSize = src[1]; /*0xffc16da4*/
 return 0; /*0xffc16da8*/
}

unsigned int DxeIplLzmaDecodeProp(unsigned __int8 *src, unsigned __int8 *a2, unsigned __int8 **buf, int n2)
{
 unsigned __int8 *v4; // edi
 unsigned __int8 *v5; // ebx
 unsigned __int8 *v7; // ebp

 v4 = (unsigned __int8 *)(*src + ((src[1] + ((src[2] + (src[3] << 8)) << 8)) << 8)); /*0xffc16ddb*/
 v5 = (unsigned __int8 *)(src[4] + ((src[5] + ((src[6] + (src[7] << 8)) << 8)) << 8)); /*0xffc16df3*/
 if ( !v5 ) /*0xffc16df5*/
 return 0; /*0xffc16df7*/
 v7 = src + 8; /*0xffc16dff*/
 DxeIplSetMem64(buf, 0x3438u, 0); /*0xffc16e0a*/
 if ( n2 == 1 ) /*0xffc16e19*/
 {
 *((_BYTE *)buf + 13364) = 4; /*0xffc16e29*/
 }
 else if ( n2 == 2 ) /*0xffc16e1e*/
 {
 *((_BYTE *)buf + 13364) = 5; /*0xffc16e20*/
 }
 *buf = v7; /*0xffc16e39*/
 buf[1] = a2; /*0xffc16e3b*/
 buf[8] = v4; /*0xffc16e3e*/
 buf[9] = v5; /*0xffc16e41*/
 DxeIplDecompressLzma((int)buf, 0x20u); /*0xffc16e44*/
 DxeIplLzmaBitDecode((int)buf); /*0xffc16e4b*/
 return *((_WORD *)buf + 20) != 0 ? 0x80000002 : 0;
}

int DxeIplPpiNotifyCallback(int FfsHeader, _DWORD *DestSize, _DWORD *SrcSize, _WORD *PropFlags)
{
 int DataOffset; // eax
 int DataSize; // edx

 if ( !FfsHeader ) /*0xffc16e70*/
 return -2147483646; /*0xffc16e70*/
 if ( (*(_DWORD *)FfsHeader & 0xFFFFFF) != 0xFFFFFF ) /*0xffc16e89*/
 {
 if ( DxeIplFvIsAddrValid(dword_FFC18D18, (_DWORD *)(FfsHeader + 4)) ) /*0xffc16ead*/
 {
 *PropFlags = *(_WORD *)(FfsHeader + 22); /*0xffc16ebd*/
 DataOffset = *(unsigned __int16 *)(FfsHeader + 20); /*0xffc16ec2*/
 DataSize = *(_DWORD *)FfsHeader & 0xFFFFFF; /*0xffc16ec6*/
 return DxeIplLzmaGetProp((_DWORD *)(DataOffset + FfsHeader), DataSize - DataOffset, DestSize, SrcSize); /*0xffc16ec6*/
 }
 return -2147483646; /*0xffc16e77*/
 }
 if ( !DxeIplFvIsAddrValid(dword_FFC18D18, (_DWORD *)(FfsHeader + 8)) ) /*0xffc16e95*/
 return -2147483646; /*0xffc16e95*/
 *PropFlags = *(_WORD *)(FfsHeader + 26); /*0xffc16e9e*/
 DataOffset = *(unsigned __int16 *)(FfsHeader + 24); /*0xffc16ea1*/
 DataSize = *(_DWORD *)(FfsHeader + 4); /*0xffc16ea5*/
 return DxeIplLzmaGetProp((_DWORD *)(DataOffset + FfsHeader), DataSize - DataOffset, DestSize, SrcSize); /*0xffc16eda*/
}

unsigned int DxeIplPeiEndCallback(
 int FfsHeader,
 unsigned __int8 **SrcData,
 unsigned __int8 **DestData,
 _DWORD *DestSize)
{
 int DataOffset; // ecx

 if ( (*(_DWORD *)FfsHeader & 0xFFFFFF) == 0xFFFFFF ) /*0xffc16efb*/
 {
 if ( !DxeIplFvIsAddrValid(dword_FFC18D18, (_DWORD *)(FfsHeader + 8)) ) /*0xffc16f00*/
 return -2147483646; /*0xffc16f0e*/
 *DestSize = 0; /*0xffc16f13*/
 DataOffset = *(unsigned __int16 *)(FfsHeader + 24); /*0xffc16f16*/
 }
 else
 {
 if ( !DxeIplFvIsAddrValid(dword_FFC18D18, (_DWORD *)(FfsHeader + 4)) ) /*0xffc16f26*/
 return -2147483646; /*0xffc16f26*/
 *DestSize = 0; /*0xffc16f2b*/
 DataOffset = *(unsigned __int16 *)(FfsHeader + 20); /*0xffc16f2e*/
 }
 return DxeIplLzmaDecodeProp((unsigned __int8 *)(FfsHeader + DataOffset), *SrcData, DestData, 2); /*0xffc16f45*/
}

int DxeIplReportStatusCode(char n2, int n50532357)
{
 int v3; // eax
 _BYTE v4[2]; // [esp+4h] [ebp-Ch] BYREF
 int v5; // [esp+6h] [ebp-Ah]
 _BYTE *v6; // [esp+Ch] [ebp-4h]

 if ( n2 != 2 && n2 != 3 ) /*0xffc16f60*/
 return -2147483645; /*0xffc16f62*/
 v6 = v4; /*0xffc16f6c*/
 __sidt(v4); /*0xffc16f72*/
 v3 = (*(int ( **)(_DWORD, char, int, _DWORD, _DWORD *, _DWORD))(**(_DWORD **)(v5 - 4) + 88))( /*0xffc16f89*/
 *(_DWORD *)(v5 - 4),
 n2,
 n50532357,
 0,
 dword_FFC18DB8,
 0);
 return v3 != -1610612734 ? v3 : 0;
}

_WORD *DxeIplGetFvFromHob(_DWORD *a1, _DWORD *a2)
{
 _WORD *i; // eax
 _WORD *v5; // eax
 _WORD *i_1; // eax
 _WORD *result; // eax
 void *buf; // eax
 void *buf_1; // eax

 i = (_WORD *)DxeIplGetPeiServices(); /*0xffc16fab*/
 v5 = DxeIplGetBootModeGuid((int)&unk_FFC18DA8, i); /*0xffc16fb9*/
 if ( v5 ) /*0xffc16fc0*/
 {
 *a1 = v5 + 12; /*0xffc16fc5*/
 i_1 = (_WORD *)DxeIplGetPeiServices(); /*0xffc16fc7*/
 result = DxeIplGetBootModeGuid((int)&unk_FFC18CF8, i_1) + 12; /*0xffc16fd8*/
 }
 else
 {
 buf = (void *)DxeIplAllocPages((int)&unk_FFC18DA8, 40008); /*0xffc16fe6*/
 *a1 = buf; /*0xffc16fed*/
 *a1 = DxeIplSetMem32(buf, 0x9C48u); /*0xffc16ff4*/
 buf_1 = (void *)DxeIplAllocPages((int)&unk_FFC18CF8, 4000); /*0xffc17002*/
 *a2 = buf_1; /*0xffc17009*/
 result = DxeIplSetMem32(buf_1, 0xFA0u); /*0xffc1700b*/
 }
 *a2 = result; /*0xffc17014*/
 return result; /*0xffc17013*/
}

int __thiscall DxeIplGetPeiProtocol(_DWORD *this)
{
 int v2; // esi
 int v3; // ebx

 v2 = 0; /*0xffc17030*/
 if ( *this ) /*0xffc17032*/
 {
 while ( 1 ) /*0xffc1703c*/
 {
 v3 = *this - v2 - 1; /*0xffc1703c*/
 if ( !*((_QWORD *)this + 5 *v3 + 5) && !*((_QWORD *)this + 5 *v3 + 1) && !DxeIplLzmaGetBit(7) && !DxeIplLzmaGetBit(7) ) /*0xffc17071*/
 break; /*0xffc17071*/
 if ( (unsigned int)++v2 >= *this ) /*0xffc1707e*/
 return v2; /*0xffc1707e*/
 }
 return v3; /*0xffc17086*/
 }
 return v2; /*0xffc1708a*/
}

int DxeIplDebugPrintGuid(int Guid, char *DxeIpl)
{
 _DWORD *v2; // esi
 int v3; // ebp
 int v4; // edi
 int v5; // ebx
 char *DxeIpl_2; // eax
 int v7; // eax
 _DWORD *v9; // [esp+14h] [ebp-Ch] BYREF
 char *DxeIpl_1; // [esp+18h] [ebp-8h]
 int v11; // [esp+1Ch] [ebp-4h] BYREF

 DxeIpl_1 = DxeIpl; /*0xffc17095*/
 DxeIplGetFvFromHob(&v9, &v11); /*0xffc170a2*/
 v2 = v9; /*0xffc170a7*/
 v3 = *v9; /*0xffc170ab*/
 if ( *v9 >= 0x3E8u ) /*0xffc170b3*/
 return -2147483639; /*0xffc170b5*/
 v5 = 10 *v3; /*0xffc170bc*/
 *v9 = v3 + 1; /*0xffc170c2*/
 v4 = 0; /*0xffc170c4*/
 DxeIpl_2 = DxeIpl_1; /*0xffc170c6*/
 v2[v5 + 2] = 0; /*0xffc170ca*/
 v2[v5 + 3] = 0; /*0xffc170ce*/
 if ( DxeIpl_2 ) /*0xffc170d4*/
 DxeIplLzmaDecodeSymbol(DxeIpl_2); /*0xffc170dd*/
 v7 = v11; /*0xffc170e4*/
 v2[v5 + 10] = 0; /*0xffc170e8*/
 v2[v5 + 11] = 0; /*0xffc170ec*/
 *(_DWORD *)(v7 + 4 *v3) = 0; /*0xffc170f0*/
 *(_QWORD *)&v2[v5 + 8] = __rdtsc(); /*0xffc170f5*/
 return v4; /*0xffc170ff*/
}

int DxeIplGetBootModeFromHob()
{
 unsigned __int64 v2; // rax
 unsigned int v3; // ebx
 unsigned int v4; // edi
 unsigned int *v5; // esi
 unsigned int v6; // eax
 int v8; // eax
 int v9; // [esp+Ch] [ebp-8h] BYREF
 unsigned int *v10; // [esp+10h] [ebp-4h] BYREF

 v2 = __rdtsc(); /*0xffc17111*/
 v3 = HIDWORD(v2); /*0xffc17113*/
 v4 = v2; /*0xffc1711b*/
 DxeIplGetFvFromHob(&v10, &v9); /*0xffc1711d*/
 v5 = v10; /*0xffc17125*/
 v6 = DxeIplGetPeiProtocol(v10); /*0xffc1712b*/
 if ( v6 >= *v5 ) /*0xffc17135*/
 return -2147483634; /*0xffc17137*/
 v8 = 10 * (v6 + 1); /*0xffc1713f*/
 v5[v8] = v4; /*0xffc17142*/
 v5[v8 + 1] = v3; /*0xffc17145*/
 return 0; /*0xffc1714b*/
}

int DxeIplDxeIplPpiNotify(int a1, _DWORD *a2, _DWORD *a3, _WORD *a4)
{
 int v5; // ecx

 if ( (*(_DWORD *)a1 & 0xFFFFFF) == 0xFFFFFF ) /*0xffc1716d*/
 {
 if ( !DxeIplFvIsAddrValid(dword_FFC18D58, (_DWORD *)(a1 + 8)) ) /*0xffc17172*/
 return -2147483646; /*0xffc17180*/
 *a4 = *(_WORD *)(a1 + 26); /*0xffc17189*/
 v5 = *(unsigned __int16 *)(a1 + 24); /*0xffc1718c*/
 }
 else
 {
 if ( !DxeIplFvIsAddrValid(dword_FFC18D58, (_DWORD *)(a1 + 4)) ) /*0xffc1719c*/
 return -2147483646; /*0xffc1719c*/
 *a4 = *(_WORD *)(a1 + 22); /*0xffc171a5*/
 v5 = *(unsigned __int16 *)(a1 + 20); /*0xffc171a8*/
 }
 *a2 = DxeIplLzmaInitState(a1 + v5); /*0xffc171b6*/
 *a3 = 0x10000; /*0xffc171bb*/
 return 0; /*0xffc171c3*/
}

int DxeIplEndOfPeiNotify(_DWORD *a1, _DWORD *a2, int a3, _DWORD *a4)
{
 if ( (*a1 & 0xFFFFFF) == 0xFFFFFF ) /*0xffc171e3*/
 {
 if ( !DxeIplFvIsAddrValid(dword_FFC18D58, a1 + 2) ) /*0xffc171e8*/
 return -2147483646; /*0xffc171f6*/
 *a4 = 0; /*0xffc171fb*/
 }
 else
 {
 if ( !DxeIplFvIsAddrValid(dword_FFC18D58, a1 + 1) ) /*0xffc17211*/
 return -2147483646; /*0xffc17211*/
 *a4 = 0; /*0xffc17216*/
 }
 return DxeIplLzmaInitRange(*a2, a3); /*0xffc17234*/
}

int DxeIplGetPpiPtr(int a1, unsigned int a2)
{
 unsigned int v2; // esi
 int result; // eax

 v2 = *(_DWORD *)(a1 + 12); /*0xffc17244*/
 if ( v2 < a2 ) /*0xffc17249*/
 return 0; /*0xffc1725b*/
 result = *(_DWORD *)(a1 + 8); /*0xffc1724b*/
 *(_DWORD *)(a1 + 12) = v2 - a2; /*0xffc17250*/
 *(_DWORD *)(a1 + 8) = result + a2; /*0xffc17256*/
 return result; /*0xffc1725d*/
}

void nullsub_2()
{
 ; /*0xffc17260*/
}

int __thiscall DxeIplLzmaInitState(unsigned __int8 *this)
{
 int i; // edi
 __int64 v2; // rax
 __int64 v4; // [esp+Ch] [ebp-8h]

 v4 = 0; /*0xffc17266*/
 for ( i = 12; i >= 5; --i ) /*0xffc17275*/
 {
 v2 = (v4 << 8) + *(this + i); /*0xffc17295*/
 v4 = v2; /*0xffc1729a*/
 }
 return v2; /*0xffc172a5*/
}

unsigned int DxeIplLzmaInitRange(unsigned __int8 *a1, int a2, int a3, int a4)
{
 int v6; // ecx
 _DWORD v8[4]; // [esp+8h] [ebp-18h] BYREF
 int v9; // [esp+18h] [ebp-8h] BYREF
 int v10; // [esp+1Ch] [ebp-4h] BYREF

 v8[0] = DxeIplGetPpiPtr; /*0xffc172b9*/
 v8[1] = nullsub_2; /*0xffc172c2*/
 v8[2] = a4; /*0xffc172c9*/
 v8[3] = 0x10000; /*0xffc172cc*/
 v10 = DxeIplLzmaInitState(a1); /*0xffc172d8*/
 a4 = a2 - 13; /*0xffc172e1*/
 return DxeIplDecodeData(a3, (unsigned int *)&v10, a1 + 13, (unsigned int *)&a4, (int)a1, v6, v6, &v9, (int)v8) != 0
 ? 0x80000002
 : 0;
}

char DxeIplLzmaDecodeLiteral(_DWORD *StreamCtx, unsigned int n0x112)
{
 unsigned int n0x112_2; // edi
 unsigned int v4; // edx
 int v5; // ebp
 unsigned int n0x112_1; // esi
 unsigned int v7; // ebx
 int v9; // [esp+8h] [ebp-4h]

 n0x112_2 = StreamCtx[18]; /*0xffc17e2c*/
 if ( n0x112_2 && n0x112_2 < 0x112 )
 {
 v4 = StreamCtx[9]; /*0xffc17e3d*/
 n0x112 -= v4; /*0xffc17e40*/
 v5 = StreamCtx[5]; /*0xffc17e47*/
 n0x112_1 = StreamCtx[18]; /*0xffc17e4b*/
 v9 = StreamCtx[10]; /*0xffc17e4d*/
 v7 = StreamCtx[14]; /*0xffc17e51*/
 if ( n0x112 < n0x112_2 ) /*0xffc17e5a*/
 n0x112_1 = n0x112; /*0xffc17e5c*/
 if ( !StreamCtx[12] ) /*0xffc17e5e*/
 {
 n0x112 = StreamCtx[3] - StreamCtx[11]; /*0xffc17e69*/
 if ( n0x112 <= n0x112_1 ) /*0xffc17e6e*/
 StreamCtx[12] = StreamCtx[3]; /*0xffc17e70*/
 }
 StreamCtx[11] += n0x112_1; /*0xffc17e77*/
 for ( StreamCtx[18] = n0x112_2 - n0x112_1; n0x112_1; --n0x112_1 )
 {
 LOBYTE(n0x112) = *(_BYTE *)(v4 + (v4 < v7 ? v9 : 0) - v7 + v5);
 *(_BYTE *)(v4 + v5) = n0x112; /*0xffc17e94*/
 ++v4; /*0xffc17e97*/
 }
 StreamCtx[9] = v4; /*0xffc17e9f*/
 }
 return n0x112; /*0xffc17ea3*/
}

int DxeIplLzmaDecodeMatch(int *StreamCtx, unsigned int n0x112, unsigned int src)
{
 unsigned int n0x112_1; // edx
 int v6; // ebx
 unsigned int v7; // ecx
 int result; // eax
 unsigned int v9; // eax

 while ( 1 ) /*0xffc17eb7*/
 {
 n0x112_1 = n0x112; /*0xffc17eb7*/
 if ( !StreamCtx[12] ) /*0xffc17eb3*/
 {
 v6 = StreamCtx[9]; /*0xffc17ec0*/
 v7 = StreamCtx[3] - StreamCtx[11]; /*0xffc17ec5*/
 if ( n0x112 - v6 > v7 ) /*0xffc17eca*/
 n0x112_1 = v6 + v7; /*0xffc17ecc*/
 }
 result = DxeIplLzmaDecodeRange(StreamCtx, n0x112_1, src); /*0xffc17ed2*/
 if ( result ) /*0xffc17ed9*/
 break; /*0xffc17ed9*/
 if ( !StreamCtx[12] ) /*0xffc17edb*/
 {
 v9 = StreamCtx[3]; /*0xffc17ee0*/
 if ( StreamCtx[11] >= v9 ) /*0xffc17ee6*/
 StreamCtx[12] = v9; /*0xffc17ee8*/
 }
 DxeIplLzmaDecodeLiteral(StreamCtx, n0x112); /*0xffc17eef*/
 if ( StreamCtx[9] >= n0x112 || StreamCtx[6] >= src || (unsigned int)StreamCtx[18] >= 0x112 ) /*0xffc17f05*/
 {
 if ( (unsigned int)StreamCtx[18] > 0x112 ) /*0xffc17f0e*/
 StreamCtx[18] = 274; /*0xffc17f10*/
 return 0; /*0xffc17f17*/
 }
 }
 return result; /*0xffc17f19*/
}

int DxeIplLzmaDecodeStream(
 int StreamCtx,
 unsigned int NumBits,
 unsigned __int8 *src,
 unsigned int *DstData,
 int DstSize,
 _DWORD *a6)
{
 unsigned int *DstData_1; // edi
 unsigned int n0x14; // ebx
 unsigned __int8 *src_1; // edx
 unsigned int n5; // ecx
 int v12; // ecx
 int v13; // eax
 unsigned int n0x14_2; // edi
 unsigned __int8 *src_2; // edi
 unsigned __int8 *src_3; // eax
 int n2; // eax
 int v18; // eax
 unsigned int n0x14_1; // ecx
 int n2_1; // eax
 unsigned int n0x14_4; // eax
 unsigned int n0x14_5; // edi
 unsigned int v23; // eax
 int v25; // ecx
 unsigned int n0x14_3; // [esp+14h] [ebp-4h]
 int v28; // [esp+28h] [ebp+10h]

 DstData_1 = DstData; /*0xffc1849c*/
 n0x14 = *DstData; /*0xffc184a8*/
 *DstData = 0; /*0xffc184aa*/
 DxeIplLzmaDecodeLiteral((_DWORD *)StreamCtx, NumBits); /*0xffc184ad*/
 *a6 = 0; /*0xffc184b9*/
 if ( *(_DWORD *)(StreamCtx + 72) == 274 ) /*0xffc184c4*/
 {
LABEL_52:
 v25 = *(_DWORD *)(StreamCtx + 32); /*0xffc1870f*/
 if ( !v25 ) /*0xffc18714*/
 *a6 = 1; /*0xffc18716*/
 return v25 != 0; /*0xffc18721*/
 }
 src_1 = src; /*0xffc184ca*/
 while ( 1 ) /*0xffc184ce*/
 {
 if ( *(_DWORD *)(StreamCtx + 76) ) /*0xffc184ce*/
 {
 if ( n0x14 ) /*0xffc184d6*/
 {
 do /*0xffc184ef*/
 {
 n5 = *(_DWORD *)(StreamCtx + 88); /*0xffc184d8*/
 if ( n5 >= 5 ) /*0xffc184de*/
 break; /*0xffc184de*/
 *(_BYTE *)(n5 + StreamCtx + 92) = *src_1; /*0xffc184e2*/
 ++*(_DWORD *)(StreamCtx + 88); /*0xffc184e6*/
 ++src_1; /*0xffc184e9*/
 ++*DstData_1; /*0xffc184ea*/
 --n0x14; /*0xffc184ec*/
 }
 while ( n0x14 ); /*0xffc184ef*/
 src = src_1; /*0xffc184f3*/
 }
 if ( *(_DWORD *)(StreamCtx + 88) < 5u ) /*0xffc184fc*/
 goto LABEL_42; /*0xffc184fc*/
 if ( *(_BYTE *)(StreamCtx + 92) ) /*0xffc18502*/
 return 1; /*0xffc18506*/
 v12 = *(unsigned __int8 *)(StreamCtx + 95) /*0xffc18522*/
 | ((*(unsigned __int8 *)(StreamCtx + 94) | (*(unsigned __int8 *)(StreamCtx + 93) << 8)) << 8);
 v13 = *(unsigned __int8 *)(StreamCtx + 96); /*0xffc18524*/
 *(_DWORD *)(StreamCtx + 28) = -1; /*0xffc18528*/
 *(_DWORD *)(StreamCtx + 76) = 0; /*0xffc18531*/
 *(_DWORD *)(StreamCtx + 32) = v13 | (v12 << 8); /*0xffc18534*/
 *(_DWORD *)(StreamCtx + 88) = 0; /*0xffc18539*/
 }
 v28 = 0; /*0xffc18545*/
 if ( *(_DWORD *)(StreamCtx + 36) >= NumBits ) /*0xffc1854c*/
 {
 if ( *(_DWORD *)(StreamCtx + 72) ) /*0xffc1854e*/
 {
 *a6 = 2; /*0xffc186d4*/
 return 1; /*0xffc186dd*/
 }
 if ( !*(_DWORD *)(StreamCtx + 32) ) /*0xffc1855a*/
 {
 *a6 = 4; /*0xffc186cb*/
 return 0; /*0xffc186d2*/
 }
 v28 = 1; /*0xffc18560*/
 }
 if ( *(_DWORD *)(StreamCtx + 80) ) /*0xffc18564*/
 {
 memset32( /*0xffc18585*/
 *(void **)(StreamCtx + 16),
 67109888,
 (unsigned int)((768 << (*(_BYTE *)StreamCtx + *(_BYTE *)(StreamCtx + 4))) + 1846) >> 1);
 *(_DWORD *)(StreamCtx + 68) = 1; /*0xffc1858f*/
 *(_DWORD *)(StreamCtx + 64) = 1; /*0xffc18592*/
 *(_DWORD *)(StreamCtx + 60) = 1; /*0xffc18595*/
 *(_DWORD *)(StreamCtx + 56) = 1; /*0xffc18598*/
 *(_DWORD *)(StreamCtx + 52) = 0; /*0xffc1859b*/
 *(_DWORD *)(StreamCtx + 80) = 0; /*0xffc1859f*/
 }
 n0x14_2 = *(_DWORD *)(StreamCtx + 88); /*0xffc185a3*/
 if ( !n0x14_2 ) /*0xffc185a8*/
 {
 if ( n0x14 >= 0x14 && !v28 ) /*0xffc185b3*/
 {
 src_2 = src; /*0xffc185b5*/
 src_3 = &src[n0x14 - 20]; /*0xffc185bc*/
LABEL_25:
 *(_DWORD *)(StreamCtx + 24) = src_2; /*0xffc185eb*/
 if ( DxeIplLzmaDecodeMatch((int *)StreamCtx, NumBits, (unsigned int)src_3) ) /*0xffc185f5*/
 return 1; /*0xffc185fc*/
 src_1 = *(unsigned __int8 **)(StreamCtx + 24); /*0xffc18605*/
 v18 = src_1 - src_2; /*0xffc18608*/
 DstData_1 = DstData; /*0xffc1860a*/
 src = src_1; /*0xffc1860e*/
 *DstData += v18; /*0xffc18612*/
 n0x14 -= v18; /*0xffc18614*/
 goto LABEL_40; /*0xffc18616*/
 }
 src_2 = src; /*0xffc185c0*/
 n2 = DxeIplLzmaDecodeBitTree((_DWORD *)StreamCtx, src, n0x14); /*0xffc185c9*/
 if ( n2 ) /*0xffc185d1*/
 {
 if ( v28 && n2 != 2 ) /*0xffc185e3*/
 break; /*0xffc185e3*/
 src_3 = src; /*0xffc185e9*/
 goto LABEL_25; /*0xffc185e9*/
 }
 DxeIplFvFreePages((char *)(StreamCtx + 92), (char *)src, n0x14); /*0xffc186ed*/
 *(_DWORD *)(StreamCtx + 88) = n0x14; /*0xffc186f7*/
 *DstData += n0x14; /*0xffc186fa*/
LABEL_42:
 *a6 = 3; /*0xffc186c0*/
 return 0; /*0xffc186c9*/
 }
 n0x14_1 = 0; /*0xffc1861b*/
 n0x14_3 = 0; /*0xffc1861d*/
 if ( n0x14_2 < 0x14 ) /*0xffc18624*/
 {
 do /*0xffc18636*/
 {
 if ( n0x14_1 >= n0x14 ) /*0xffc18628*/
 break; /*0xffc18628*/
 *(_BYTE *)(n0x14_2 + StreamCtx + 92) = src_1[n0x14_1]; /*0xffc1862d*/
 ++n0x14_2; /*0xffc18631*/
 ++n0x14_1; /*0xffc18632*/
 }
 while ( n0x14_2 < 0x14 ); /*0xffc18636*/
 n0x14_3 = n0x14_1; /*0xffc18638*/
 }
 *(_DWORD *)(StreamCtx + 88) = n0x14_2; /*0xffc1863c*/
 if ( n0x14_2 < 0x14 || v28 ) /*0xffc18649*/
 {
 n2_1 = DxeIplLzmaDecodeBitTree((_DWORD *)StreamCtx, (unsigned __int8 *)(StreamCtx + 92), n0x14_2); /*0xffc18651*/
 if ( !n2_1 ) /*0xffc18659*/
 {
 *DstData += n0x14_3; /*0xffc1870b*/
 goto LABEL_42; /*0xffc1870d*/
 }
 if ( v28 && n2_1 != 2 ) /*0xffc1866b*/
 break; /*0xffc1866b*/
 }
 *(_DWORD *)(StreamCtx + 24) = StreamCtx + 92; /*0xffc18677*/
 if ( DxeIplLzmaDecodeMatch((int *)StreamCtx, NumBits, StreamCtx + 92) ) /*0xffc1867a*/
 return 1; /*0xffc18681*/
 n0x14_4 = *(_DWORD *)(StreamCtx + 24) - StreamCtx - 92; /*0xffc18688*/
 if ( n0x14_2 < n0x14_4 ) /*0xffc1868d*/
 return 11; /*0xffc1868d*/
 n0x14_5 = n0x14_2 - n0x14_4; /*0xffc1868f*/
 if ( n0x14_3 < n0x14_5 ) /*0xffc18697*/
 return 11; /*0xffc18701*/
 v23 = n0x14_3 - n0x14_5; /*0xffc18699*/
 DstData_1 = DstData; /*0xffc1869b*/
 src += v23; /*0xffc1869f*/
 n0x14 -= v23; /*0xffc186a3*/
 src_1 = src; /*0xffc186a5*/
 *DstData += v23; /*0xffc186a9*/
 *(_DWORD *)(StreamCtx + 88) = 0; /*0xffc186ab*/
LABEL_40:
 if ( *(_DWORD *)(StreamCtx + 72) == 274 ) /*0xffc186b6*/
 goto LABEL_52; /*0xffc186b6*/
 }
 *a6 = 2; /*0xffc186df*/
 return 1; /*0xffc18724*/
}

int DxeIplDecodeSetup(int *a1, char *DstEnd)
{
 unsigned int n4096; // esi
 unsigned __int8 n0xE1; // al
 int v5; // edx

 n4096 = (unsigned __int8)DstEnd[1] | (((unsigned __int8)DstEnd[2] | (*(unsigned __int16 *)(DstEnd + 3) << 8)) << 8); /*0xffc18749*/
 if ( n4096 < 0x1000 ) /*0xffc18752*/
 n4096 = 4096; /*0xffc18754*/
 n0xE1 = *DstEnd; /*0xffc18756*/
 a1[3] = n4096; /*0xffc18758*/
 if ( n0xE1 >= 0xE1u ) /*0xffc1875d*/
 return 4; /*0xffc18761*/
 *a1 = n0xE1 % 9; /*0xffc18772*/
 v5 = n0xE1 / 9 % 5; /*0xffc18776*/
 a1[2] = n0xE1 / 9 / 5; /*0xffc18779*/
 a1[1] = v5; /*0xffc1877e*/
 return 0; /*0xffc18762*/
}

int DxeIplDecodeCleanup(int a1, _BYTE *a2, int a3)
{
 int v4; // edi
 int v5; // eax

 v4 = (768 << (*a2 + a2[4])) + 1846; /*0xffc18792*/
 if ( *(_DWORD *)(a1 + 16) && v4 == *(_DWORD *)(a1 + 84) ) /*0xffc187a1*/
 return 0; /*0xffc187a1*/
 (*(void ( **)(int, _DWORD))(a3 + 4))(a3, *(_DWORD *)(a1 + 16)); /*0xffc187ac*/
 *(_DWORD *)(a1 + 16) = 0; /*0xffc187af*/
 v5 = (*(int ( **)(int, int))a3)(a3, 2 *v4); /*0xffc187b8*/
 *(_DWORD *)(a1 + 16) = v5; /*0xffc187bd*/
 *(_DWORD *)(a1 + 84) = v4; /*0xffc187c0*/
 if ( v5 ) /*0xffc187c6*/
 return 0; /*0xffc187cd*/
 else
 return 2; /*0xffc187ca*/
}

int DxeIplDecodeData(
 int DecodeCtx,
 unsigned int *SrcData,
 unsigned __int8 *src,
 unsigned int *DstData,
 char *DstEnd,
 int Status,
 int a7,
 _DWORD *a8,
 int a9)
{
 int result; // eax
 _BYTE *v10; // ecx
 int n6; // esi
 unsigned int n5; // [esp+10h] [ebp-90h]
 unsigned int n0x112; // [esp+18h] [ebp-88h]
 int v16[4]; // [esp+20h] [ebp-80h] BYREF
 _DWORD v17[4]; // [esp+30h] [ebp-70h] BYREF
 int v18; // [esp+40h] [ebp-60h]
 int DecodeCtx_1; // [esp+44h] [ebp-5Ch]
 unsigned int v20; // [esp+54h] [ebp-4Ch]
 unsigned int n0x112_1; // [esp+58h] [ebp-48h]
 int v22; // [esp+5Ch] [ebp-44h]
 int v23; // [esp+60h] [ebp-40h]
 int v24; // [esp+78h] [ebp-28h]
 int v25; // [esp+7Ch] [ebp-24h]
 int v26; // [esp+80h] [ebp-20h]
 int v27; // [esp+88h] [ebp-18h]

 n0x112 = *SrcData; /*0xffc187fb*/
 n5 = *DstData; /*0xffc187ff*/
 *DstData = 0; /*0xffc18803*/
 *SrcData = 0; /*0xffc18806*/
 *a8 = 0; /*0xffc18808*/
 if ( n5 < 5 ) /*0xffc1880d*/
 return 6; /*0xffc18811*/
 DecodeCtx_1 = 0; /*0xffc1881e*/
 v18 = 0; /*0xffc18822*/
 result = DxeIplDecodeSetup(v16, DstEnd); /*0xffc1882a*/
 if ( !result ) /*0xffc18838*/
 {
 result = DxeIplDecodeCleanup((int)v17, v10, a9); /*0xffc18845*/
 if ( !result ) /*0xffc1884d*/
 {
 v17[0] = v16[0]; /*0xffc1885b*/
 v17[1] = v16[1]; /*0xffc1885c*/
 v17[2] = v16[2]; /*0xffc1885d*/
 v17[3] = v16[3]; /*0xffc1885e*/
 v20 = 0; /*0xffc18874*/
 v24 = 0; /*0xffc1887a*/
 v27 = 0; /*0xffc1887f*/
 v22 = 0; /*0xffc18887*/
 v23 = 0; /*0xffc1888c*/
 DecodeCtx_1 = DecodeCtx; /*0xffc18893*/
 v25 = 1; /*0xffc188a5*/
 v26 = 1; /*0xffc188ac*/
 n0x112_1 = n0x112; /*0xffc188b7*/
 *DstData = n5; /*0xffc188bb*/
 n6 = DxeIplLzmaDecodeStream((int)v17, n0x112, src, DstData, 1, a8); /*0xffc188c7*/
 *SrcData = v20; /*0xffc188d0*/
 if ( !n6 && *a8 == 3 ) /*0xffc188d9*/
 n6 = 6; /*0xffc188dd*/
 (*(void ( **)(int, int))(a9 + 4))(a9, v18); /*0xffc188e3*/
 return n6; /*0xffc188e8*/
 }
 }
 return result; /*0xffc188ea*/
}

int DxeIplLzmaGetBit(char *a1, _BYTE *a2, unsigned int n7)
{
 char i; // al

 for ( i = *a1; *a1; i = *a1 ) /*0xffc188f5*/
 {
 if ( !*a2 ) /*0xffc18901*/
 break; /*0xffc18905*/
 if ( i != *a2 ) /*0xffc18909*/
 break; /*0xffc18909*/
 if ( n7 <= 1 ) /*0xffc1890e*/
 break; /*0xffc1890e*/
 ++a1; /*0xffc18910*/
 ++a2; /*0xffc18911*/
 --n7; /*0xffc18912*/
 }
 return *a1 - (char)*a2; /*0xffc18923*/
}

char DxeIplLzmaGetNumBits(unsigned int DxeIpl, int a2)
{
 unsigned int DxeIpl_1; // ecx

 if ( DxeIpl > DxeIpl_1 ) /*0xffc1892a*/
 goto LABEL_4; /*0xffc1892a*/
 if ( DxeIpl_1 < DxeIpl + a2 ) /*0xffc18934*/
 return 1; /*0xffc18943*/
 if ( DxeIpl >= DxeIpl_1 ) /*0xffc18938*/
 {
LABEL_4:
 if ( DxeIpl < DxeIpl_1 + 8 ) /*0xffc1893f*/
 return 1; /*0xffc1893f*/
 }
 return 0; /*0xffc18943*/
}

unsigned int __thiscall DxeIplLzmaNormalize(_BYTE *this)
{
 unsigned int n7; // eax

 n7 = 0; /*0xffc18947*/
 if ( this && *this ) /*0xffc1894d*/
 {
 while ( n7 < 7 ) /*0xffc18954*/
 {
 if ( !*(this + ++n7) ) /*0xffc18957*/
 return n7; /*0xffc1895b*/
 }
 return 8; /*0xffc18960*/
 }
 return n7; /*0xffc1895d*/
}

int DxeIplLzmaDecodeSymbol(char *DxeIpl)
{
 _BYTE *v1; // ecx
 _BYTE *v2; // esi
 unsigned int n7; // ebx
 char v5; // al
 char *v6; // edi

 v2 = v1; /*0xffc18963*/
 if ( !v1 ) /*0xffc18967*/
 return -2147483646; /*0xffc18969*/
 if ( !DxeIpl ) /*0xffc18977*/
 return -2147483646; /*0xffc18979*/
 n7 = DxeIplLzmaNormalize(DxeIpl); /*0xffc18988*/
 if ( n7 > 7 ) /*0xffc1898d*/
 n7 = 7; /*0xffc18991*/
 if ( DxeIplLzmaGetNumBits((unsigned int)DxeIpl, n7 + 1) ) /*0xffc18999*/
 return -2147483633; /*0xffc189a5*/
 v5 = *DxeIpl; /*0xffc189ac*/
 if ( *DxeIpl ) /*0xffc189ac*/
 {
 v6 = (char *)(DxeIpl - v2); /*0xffc189b2*/
 do /*0xffc189c1*/
 {
 if ( !n7 ) /*0xffc189b6*/
 break; /*0xffc189b6*/
 *v2++ = v5; /*0xffc189b8*/
 --n7; /*0xffc189bb*/
 v5 = v2[(_DWORD)v6]; /*0xffc189bc*/
 }
 while ( v5 ); /*0xffc189c1*/
 }
 *v2 = 0; /*0xffc189c3*/
 return 0; /*0xffc1896e*/
}

int __thiscall DxeIplGetModuleBase(void *this)
{
 int ( **v1)(int); // eax

 v1 = (int ( **)(int))DxeIplGetPeiBootMode(this); /*0xffc189e9*/
 return v1[4](5); /*0xffc189f4*/
}

__int16 __thiscall DxeIplInitGlobalFlags(void *this)
{
 *(_WORD *)(DxeIplGetModuleBase(this) + 1024064) = 1280; /*0xffc189ff*/
 return 1280; /*0xffc18a09*/
}