/* DxeIplFvReadSection @ 0xffc155c3 size=0x114 */
int __cdecl 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 = sub_FFC163A4(&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)sub_FFC16309(v8) ) /*0xffc15618*/
{
++v7; /*0xffc1561a*/
v8 = v9 + 16; /*0xffc1561b*/
if ( v7 >= v14 ) /*0xffc15622*/
goto LABEL_6; /*0xffc15622*/
}
result = (*(int (__cdecl **)(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 = sub_FFC1632D(v8, (v15 >> 12) + ((v15 & 0xFFF) != 0)); /*0xffc15651*/
if ( !v5 ) /*0xffc15655*/
return -2147483639; /*0xffc15655*/
}
if ( (v11[0] & 1) != 0 && v13 ) /*0xffc1568d*/
{
v10 = sub_FFC1632D(v8, (v13 >> 12) + ((v13 & 0xFFF) != 0) + 1); /*0xffc156a0*/
*a3 = v10; /*0xffc156a5*/
if ( !v10 ) /*0xffc156a9*/
return -2147483639; /*0xffc1565c*/
*a3 = v10 + 4092; /*0xffc156b0*/
}
result = sub_FFC164EE(v5, a5); /*0xffc156ba*/
if ( result >= 0 ) /*0xffc156c3*/
{
*a4 = v13; /*0xffc156cc*/
return 0; /*0xffc156ce*/
}
}
}
return result; /*0xffc156d0*/
}