Newer
Older
AMI-Aptio-BIOS-Reversed / DxeCore / Mem / Mem.c
@Ajax Dong Ajax Dong 2 days ago 9 KB Init
/** @file
  Page and Pool Memory Services for DxeCore

  Source: DxeCore.efi (HR650X BIOS)
  Decompiled from MdeModulePkg\Core\Dxe\Mem\Page.c
*/

#include "../uefi_headers/Uefi.h"

//
// Function: CoreAllocatePages @ 0x2698
//
__int64 __fastcall CoreAllocatePages(
        __int64 n36,
        __int64 n3,
        __int64 a3,
        unsigned __int64 __ImageBase,
        __int64 a5,
        __int64 a6,
        __int64 a7)
{
  double v7; // xmm2_8
  double v8; // xmm3_8
  __int64 v11; // rbx
  __int64 *p_ia; // rbx
  __int64 v13; // r8
  _QWORD *i_1; // r12
  _QWORD *i_2; // r15
  _QWORD *j; // rbx
  _QWORD *j_1; // rcx
  bool v18; // zf
  bool v19; // zf
  bool v20; // zf
  __int64 v21; // rdx
  __int64 v22; // r8
  char *dst_1; // rbp
  char *i_3; // rsi
  __int64 v25; // r9
  __int64 v26; // rdx
  __int64 v27; // r8
  __int64 *i_4; // rdi
  __int64 *i_5; // rbx
  __int64 v30; // rax
  unsigned __int64 v31; // rcx
  __int64 v32; // rdx
  __int64 v33; // r8
  __int64 v34; // rdx
  __int64 v35; // rdx
  __int64 *p_ia_1; // [rsp+30h] [rbp-68h]
  unsigned int p_i[2]; // [rsp+38h] [rbp-60h] BYREF
  _QWORD *i; // [rsp+40h] [rbp-58h] BYREF
  char *dst; // [rsp+48h] [rbp-50h] BYREF
  __int64 v41; // [rsp+50h] [rbp-48h]
  int n3_1; // [rsp+A8h] [rbp+10h]
  int v43; // [rsp+B0h] [rbp+18h]

  v43 = a3;
  n3_1 = n3;
  if ( !a5 )
  {
    v11 = 0x8000000000000002uLL;
    Assert_3(0x100000, "  Status = %r\n", 0x8000000000000002uLL);
    return v11;
  }
  p_ia = 0;
  p_ia_1 = 0;
  v41 = n36 & 0x20;
  if ( (n36 & 0x20) != 0 )
  {
    DxeGetInfo_8((__int64)&unk_22B60, n3, a3, v8);
    p_ia = &i_3;
  }
  else
  {
    if ( (n36 & 0x40) == 0 )
    {
      Assert_7((__int64)"e:\\hs\\MdeModulePkg\\Core\\Dxe\\Gcd\\Gcd.c", 749, (__int64)"((BOOLEAN)(0==1))", v8);
      goto LABEL_9;
    }
    DxeGetInfo_8((__int64)&unk_22BD0, n3, a3, v8);
    p_ia = &::p_ia;
  }
  p_ia_1 = p_ia;
LABEL_9:
  if ( DxeConfig_49(__ImageBase, a5, (__int64 **)p_i, &i, p_ia) < 0 )
  {
LABEL_10:
    v11 = 0x8000000000000003uLL;
    goto LABEL_94;
  }
  i_1 = *(_QWORD **)p_i;
  i_2 = i;
  if ( !*(_QWORD *)p_i || !i )
    Assert_7(
      (__int64)"e:\\hs\\MdeModulePkg\\Core\\Dxe\\Gcd\\Gcd.c",
      761,
      (__int64)"StartLink != ((void *) 0) && EndLink != ((void *) 0)",
      v8);
  for ( j = i_1; j != (_QWORD *)*i_2; j = (_QWORD *)*j )
  {
    j_1 = j - 1;
    if ( *(j - 1) != 1835295591 )
    {
      Assert_7((__int64)"e:\\hs\\MdeModulePkg\\Core\\Dxe\\Gcd\\Gcd.c", 768, (__int64)"CR has Bad Signature", v8);
      j_1 = j;
    }
    switch ( n36 )
    {
      case ' ':
        v19 = *((_DWORD *)j_1 + 14) == 0;
LABEL_41:
        if ( !v19 )
          goto LABEL_47;
        goto LABEL_42;
      case '"':
        goto LABEL_38;
      case '#':
        v18 = *((_DWORD *)j_1 + 14) == 0;
        goto LABEL_26;
      case '$':
        if ( a7 < 0 && ((a5 | __ImageBase) & 0xFFF) != 0 )
        {
LABEL_46:
          v11 = 0x8000000000000002uLL;
          goto LABEL_94;
        }
        v20 = (a7 & j_1[5]) == a7;
        goto LABEL_32;
      case '%':
        if ( (__ImageBase & 0xFFF) != 0 || (a5 & 0xFFF) != 0 )
          goto LABEL_46;
        v20 = (a6 & j_1[6]) == j_1[6];
LABEL_32:
        if ( !v20 )
          goto LABEL_10;
        continue;
      case '@':
        v19 = *((_DWORD *)j_1 + 15) == 0;
        goto LABEL_41;
      case 'B':
LABEL_38:
        if ( !j_1[8] )
        {
LABEL_27:
          v11 = 0x800000000000000EuLL;
          goto LABEL_94;
        }
        break;
      case 'C':
        v18 = *((_DWORD *)j_1 + 15) == 0;
LABEL_26:
        if ( v18 )
          goto LABEL_27;
LABEL_42:
        if ( j_1[8] )
        {
LABEL_47:
          v11 = 0x800000000000000FuLL;
          goto LABEL_94;
        }
        break;
    }
  }
  if ( (Assert_106((unsigned __int64 *)&dst, (char **)&i, v13, v8) & 0x8000000000000000uLL) != 0LL )
  {
    v11 = 0x8000000000000009uLL;
    goto LABEL_94;
  }
  dst_1 = dst;
  i_3 = (char *)i;
  if ( !dst || !i )
    Assert_7(
      (__int64)"e:\\hs\\MdeModulePkg\\Core\\Dxe\\Gcd\\Gcd.c",
      864,
      (__int64)"TopEntry != ((void *) 0) && BottomEntry != ((void *) 0)",
      v8);
  if ( n36 == 36 && (a7 & 0xFFFFFFFFFFFD8FE0uLL) == 0 )
  {
    v25 = (unsigned int)&unk_26000 & (unsigned int)a7;
    if ( (a7 & 1) != 0 )
    {
      v25 |= 1uLL;
    }
    else if ( (a7 & 2) != 0 )
    {
      v25 |= 2uLL;
    }
    else if ( (a7 & 4) != 0 )
    {
      v25 |= 4uLL;
    }
    else if ( (a7 & 8) != 0 )
    {
      v25 |= 8uLL;
    }
    else if ( (a7 & 0x10) != 0 )
    {
      v25 |= 0x10uLL;
    }
    else if ( (a7 & 0x1000) != 0 )
    {
      v25 |= 0x1000uLL;
    }
    if ( v25 != 0xFFFFFFFFLL )
    {
      if ( !qword_26400 )
      {
        v11 = 0xA000000000000002uLL;
LABEL_69:
        Assert_55((unsigned __int64)dst_1, v21, v22, v8);
        Assert_55((unsigned __int64)i_3, v26, v27, v8);
        goto LABEL_94;
      }
      v11 = (*(__int64 (__fastcall **)(__int64, unsigned __int64, __int64))(qword_26400 + 56))(
              qword_26400,
              __ImageBase,
              a5);
      if ( v11 < 0 )
        goto LABEL_69;
    }
  }
  i_4 = i_1;
  if ( i_1 == (_QWORD *)*i_2 )
    goto LABEL_93;
  do
  {
    i_5 = i_4 - 1;
    if ( *(i_4 - 1) != 1835295591 )
    {
      Assert_7((__int64)"e:\\hs\\MdeModulePkg\\Core\\Dxe\\Gcd\\Gcd.c", 895, (__int64)"CR has Bad Signature", v8);
      i_5 = i_4;
    }
    DxeDriverEntry_3(i_4, (char *)i_5, __ImageBase, a5, dst_1, i_3);
    switch ( n36 )
    {
      case ' ':
        v31 = 0xC000000000000000uLL;
        *((_DWORD *)i_5 + 14) = n3_1;
        if ( n3_1 != 3 )
          v31 = 0x8000000000000000uLL;
        v30 = v31 | a6;
        goto LABEL_90;
      case '"':
        goto LABEL_86;
      case '#':
        *((_DWORD *)i_5 + 14) = 0;
        i_5[5] = 0;
        break;
      case '$':
        i_5[6] = a7;
        break;
      case '%':
        v30 = a6;
LABEL_90:
        i_5[5] = v30;
        break;
      case '@':
        *((_DWORD *)i_5 + 15) = v43;
        break;
      case 'B':
LABEL_86:
        i_5[8] = 0;
        i_5[9] = 0;
        break;
      case 'C':
        *((_DWORD *)i_5 + 15) = 0;
        break;
    }
    i_4 = (__int64 *)*i_4;
  }
  while ( i_4 != (__int64 *)*i_2 );
  i_1 = *(_QWORD **)p_i;
LABEL_93:
  v11 = Assert_104(dst_1, i_3, i_1, i_2, p_ia_1);
LABEL_94:
  Assert_3(0x100000, "  Status = %r\n", v11);
  if ( v41 )
  {
    DxeGetInfo_10((__int64)&unk_22B60, v32, v33, v8);
    DxeInit_0(0, v34, v7, v8);
  }
  if ( (n36 & 0x40) != 0 )
  {
    DxeGetInfo_10((__int64)&unk_22BD0, v32, v33, v8);
    DxeInit_1(0, v35, v7, v8);
  }
  return v11;
}

//
// Function: CoreFreePages @ 0x2b60
//
__int64 __fastcall CoreFreePages(
        __int64 n65,
        __int64 n5,
        __int64 n6,
        unsigned int n3,
        unsigned __int64 n0x40,
        unsigned __int64 a6,
        unsigned __int64 *p___ImageBase,
        __int64 a8,
        __int64 a9)
{
  double v9; // xmm2_8
  double v10; // xmm3_8
  int n5_1; // edi
  __int64 n65_1; // r14
  __int64 v14; // rbx
  unsigned __int64 *p___ImageBase_1; // r12
  __int64 *p_ia; // rsi
  __int64 v17; // r8
  __int64 v18; // r15
  __int64 v19; // r8
  __int64 *i_1; // r12
  __int64 **i_2; // r14
  __int64 *i_3; // rbx
  __int64 *i_7; // rax
  bool v24; // zf
  __int64 *ia; // rbx
  __int64 *ia_3; // rax
  unsigned __int64 *p___ImageBase_2; // rax
  unsigned __int64 __ImageBase; // r13
  __int64 *ia_1; // rdx
  bool v30; // zf
  __int64 v31; // rcx
  unsigned __int64 v32; // rcx
  __int64 v33; // rdx
  __int64 v34; // r8
  __int64 v35; // rdx
  __int64 v36; // rdx
  unsigned __int64 __ImageBase_1; // rcx
  bool v39; // zf
  __int64 *... [8450 chars total]

//
// Function: CoreAllocatePool @ 0x7b64
//
unsigned __int64 __fastcall CoreAllocatePool(unsigned __int64 n0xFFF, __int64 n232, int n7, __int64 n4096)
{
  double v4; // xmm3_8
  __int64 n7_1; // rbp
  unsigned __int64 n0xFFF_1; // rcx
  unsigned __int64 result; // rax
  unsigned __int64 __ImageBase_1; // rcx
  __int64 v12; // rdx
  __int64 v13; // rcx
  __int64 v14; // r8
  __int64 __ImageBase; // rax

  n7_1 = n7;
  while ( 1 )
  {
    if ( (unsigned int)n7_1 < 0xF )
    {
      n0xFFF_1 = qword_25B90[6 * n7_1 + 1];
      if ( n0xFFF >= n0xFFF_1 )
      {
        result = DxeConfig_23(n0xFFF_1, qword_25B90[6 * n7_1], n232, v4, n4096);
        if ( result )
          break;
      }
    }
    if ( n0xFFF >= _ImageBase_1 )
    {
      __ImageBase_1 = DxeConfig_23(_ImageBase_1, 0, n232, v4, n4096);
      if ( __ImageBase_1 )
      {
        __ImageBase = _ImageBase_0;
        if ( __ImageBase_1 < _ImageBase_0 )
          __ImageBase = __ImageBase_1;
        _ImageBase_0 = __ImageBase;
        return __ImageBase_1;
      }
    }
    result = DxeConfig_23(n0xFFF, 0, n232, v4, n4096);
    if ( result )
      return result;
    if ( !DxeConfig_32(v13, v12, v14, v4) )
      return 0;
  }
  return result;
}

//
// Function: CoreFreePool @ 0xbf3c
//
__int64 __fastcall CoreFreePool(_BYTE *n, __int64 a2, __int64 a3, double a4)
{
  _BYTE **v4; // rdi
  __int64 v6; // rsi
  _BYTE *v7; // rdx
  __int64 v9; // [rsp+50h] [rbp+8h] BYREF

  v4 = (_BYTE **)(n + 80);
  LOBYTE(a3) = 19;
  v6 = (*(__int64 (__fastcall **)(_QWORD, _BYTE *, __int64, _QWORD, _BYTE *, _BYTE *, __int64 *))(*((_QWORD *)n + 9)
                                                                                                + 24LL))(
         *((_QWORD *)n + 9),
         n + 48,
         a3,
         0,
         n + 80,
         n + 88,
         &v9);
  if ( v6 >= 0 )
  {
    v7 = *v4;
    if ( **v4 == 9 )
      n[117] = 1;
    else
      n[116] = 1;
    if ( *v7 )
    {
      if ( *v7 == 1 )
        n[97] = 1;
    }
    else
    {
      n[96] = 1;
    }
    if ( n[96] || n[97] )
      CopyMemWrapper(n + 100, v7 + 1, 0x10u, a4);
    goto LABEL_15;
  }
  if ( v6 != 0x8000000000000018uLL )
  {
    *v4 = 0;
    n[116] = 1;
LABEL_15:
    n[121] = 0;
    return v6;
  }
  n[121] = 1;
  return v6;
}