// SetupIfrBuilder - decompiled from Platform.efi
unsigned __int64 __fastcall SetupIfrBuilder(const CHAR16 *ZeroPool, char n2, __int64 *a3)
{
unsigned __int64 i_2; // rbx
const CHAR16 *ZeroPool_1; // r12
unsigned __int64 i_1; // rdi
_BYTE *v8; // rsi
_WORD *v9; // r14
__int64 v10; // rdx
unsigned __int64 i; // rsi
__int16 v12; // ax
unsigned __int64 v13; // rcx
char v14; // al
unsigned __int64 v15; // rcx
unsigned __int16 Buffer[20]; // [rsp+20h] [rbp-28h] BYREF
i_2 = 0; /*0x9ab5*/
if ( !a3 ) /*0x9abd*/
return 0x8000000000000002uLL; /*0x9abd*/
ZeroPool_1 = ZeroPool; /*0x9ace*/
i_1 = 0; /*0x9ad1*/
while ( *ZeroPool && *ZeroPool != 38 ) /*0x9ada*/
{
++ZeroPool; /*0x9adc*/
++i_1; /*0x9ae0*/
}
if ( n2 ) /*0x9af0*/
{
if ( n2 == 1 ) /*0x9af5*/
{
v9 = AllocateZeroPool(2 * (i_1 >> 2) + 2); /*0x9b37*/
if ( !v9 ) /*0x9b3d*/
return 0x8000000000000009uLL; /*0x9b3d*/
ZeroMem(Buffer, 0xAu); /*0x9b49*/
for ( i = 0; i < i_1; v9[v13] = v12 ) /*0x9b54*/
{
SetupDisplayStrings(Buffer, v10, ZeroPool_1); /*0x9b5e*/
v12 = ProcessSetupConfig(Buffer); /*0x9b68*/
ZeroPool_1 += 4; /*0x9b70*/
v13 = i >> 2; /*0x9b74*/
i += 4LL; /*0x9b78*/
}
*a3 = (__int64)v9; /*0x9b8a*/
v9[i >> 2] = 0; /*0x9b8d*/
return 0; /*0x9b92*/
}
if ( n2 != 2 ) /*0x9afa*/
return 0x8000000000000002uLL; /*0x9ac9*/
}
v8 = AllocateZeroPool((i_1 + 1) >> 1); /*0x9b08*/
if ( !v8 ) /*0x9b0e*/
return 0x8000000000000009uLL; /*0x9b1e*/
ZeroMem(Buffer, 0xAu); /*0x9b9e*/
if ( i_1 ) /*0x9ba6*/
{
do /*0x9be0*/
{
Buffer[0] = ZeroPool_1[i_2]; /*0x9bb2*/
v14 = ProcessSetupConfig(Buffer); /*0x9bb7*/
v15 = i_2 >> 1; /*0x9bc2*/
if ( (i_2 & 1) != 0 ) /*0x9bc8*/
v8[v15] = v14 + 16 * v8[v15]; /*0x9bd7*/
else
v8[v15] = v14; /*0x9bca*/
++i_2; /*0x9bda*/
}
while ( i_2 < i_1 ); /*0x9be0*/
}
*a3 = (__int64)v8; /*0x9be2*/
return 0; /*0x9bf6*/
}