Newer
Older
AMI-Aptio-BIOS-Reversed / Platform / SetupIfrBuilder.c
@Ajax Dong Ajax Dong 2 days ago 2 KB Init
// 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*/
}