/* DxeIplEntry @ 0xffc15aa9 size=0x1ad */
int __cdecl DxeIplEntry(int a1, int a2, int a3)
{
int v3; // ecx
int v4; // esi
int v5; // edi
int n32; // eax
int n32_1; // ebx
int v8; // eax
int v9; // ecx
int v10; // eax
int v12; // ecx
int v13; // [esp-4h] [ebp-64h]
int v14; // [esp+Ch] [ebp-54h] BYREF
int v15; // [esp+10h] [ebp-50h] BYREF
_BYTE *v16; // [esp+14h] [ebp-4Ch]
int (__cdecl **v17)(_DWORD, int, _DWORD *, __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; // [esp+28h] [ebp-38h] BYREF
int v22; // [esp+2Ch] [ebp-34h]
__int64 v23; // [esp+30h] [ebp-30h] BYREF
_DWORD v24[2]; // [esp+38h] [ebp-28h] BYREF
_BYTE v25[32]; // [esp+40h] [ebp-20h] BYREF
v4 = 0; /*0xffc15abd*/
v5 = 0; /*0xffc15abf*/
sub_FFC1708F(v3, "DxeIpl"); /*0xffc15ac1*/
(*(void (__cdecl **)(int, int, int, _DWORD, _DWORD, _DWORD))(*(_DWORD *)a2 + 88))(a2, 1, 50466817, 0, 0, 0); /*0xffc15ad9*/
n32 = sub_FFC16085(); /*0xffc15adf*/
n32_1 = n32; /*0xffc15ae4*/
if ( n32 == 17 ) /*0xffc15ae9*/
{
if ( DxeIplCheckBootMode() < 0 ) /*0xffc15af2*/
{
sub_FFC16F4A(-2147483646, 50532357); /*0xffc15b01*/
v16 = v19; /*0xffc15b0d*/
__sidt(v19); /*0xffc15b15*/
(*(void (__cdecl **)(_DWORD))(**(_DWORD **)(v20 - 4) + 92))(*(_DWORD *)(v20 - 4)); /*0xffc15b22*/
}
}
else if ( n32 == 32 || n32 == 18 ) /*0xffc15b30*/
{
v5 = DxeIplGetNextFfsFile(); /*0xffc15b37*/
n32_1 = sub_FFC16085(); /*0xffc15b3e*/
}
sub_FFC16201(&unk_FFC18AC4); /*0xffc15b45*/
DxeIplDiscoverDxeCore(n32_1); /*0xffc15b4c*/
do /*0xffc15b68*/
{
v10 = sub_FFC16254(v5++, &v15); /*0xffc15b70*/
if ( v10 < 0 ) /*0xffc15b78*/
{
sub_FFC16F4A(-2147483646, 50466816); /*0xffc15b87*/
sub_FFC17107(); /*0xffc15b91*/
return -2147483634; /*0xffc15ba4*/
}
v14 = 0; /*0xffc15b5c*/
v8 = sub_FFC1627D(&v14); /*0xffc15b60*/
v9 = v13; /*0xffc15b65*/
}
while ( v8 < 0 ); /*0xffc15b68*/
do /*0xffc15bdc*/
{
sub_FFC16226(v9, &v17); /*0xffc15bb2*/
++v4; /*0xffc15bbb*/
}
while ( (*v17)(v17, v14, v24, &v23, &v21, v18) < 0 ); /*0xffc15bdc*/
v12 = v14; /*0xffc15bde*/
v16 = v19; /*0xffc15be6*/
__sidt(v19); /*0xffc15bee*/
(*(void (__cdecl **)(int, _BYTE *))(**(_DWORD **)(v20 - 4) + 108))(v12, v25); /*0xffc15c00*/
sub_FFC160EA( /*0xffc15c2f*/
v25,
v24[0],
v24[1],
v23 + (-(int)v23 & 0xFFF),
(v23 + (unsigned __int64)(-(int)v23 & 0xFFF)) >> 32,
v21,
v22);
sub_FFC15C56(v21, v22, a3); /*0xffc15c3f*/
sub_FFC15FB3(); /*0xffc15c47*/
return -2147483639; /*0xffc15b9e*/
}