Newer
Older
AMI-Aptio-BIOS-Reversed / DxeIpl / DxeIplCreatePageTables.c
@Ajax Dong Ajax Dong 2 days ago 7 KB Init
/* DxeIplCreatePageTables @ 0xffc15d00 size=0x2b3 */
int DxeIplCreatePageTables()
{
  int v0; // eax
  int v1; // eax
  int v2; // eax
  int v3; // ecx
  unsigned __int8 n36; // bl
  int result; // eax
  int n0x200_1; // esi
  __int64 v7; // rax
  __int64 n512_1; // rax
  int n0x200_2; // edx
  int v10; // eax
  unsigned int v11; // edx
  _DWORD *v12; // edi
  int *v13; // eax
  int n0x200_5; // ecx
  int *v15; // esi
  bool v16; // zf
  int v17; // eax
  int v18; // edi
  int n512_6; // ecx
  unsigned int v20; // kr00_4
  _DWORD *v21; // edi
  unsigned int n512_5; // edx
  _DWORD *v23; // edi
  _DWORD *v24; // edx
  int v25; // eax
  unsigned int v26; // ecx
  int n512_4; // edi
  unsigned __int64 v28; // kr08_8
  unsigned int v29; // edi
  int v30; // ebx
  int v31; // [esp-4h] [ebp-54h]
  int v32; // [esp-4h] [ebp-54h]
  int v33; // [esp+14h] [ebp-3Ch]
  int n0x200_4; // [esp+18h] [ebp-38h]
  unsigned int n512_3; // [esp+1Ch] [ebp-34h]
  int v36; // [esp+20h] [ebp-30h] BYREF
  unsigned int n0x200; // [esp+24h] [ebp-2Ch]
  int n0x200_3; // [esp+28h] [ebp-28h]
  unsigned int n512_2; // [esp+2Ch] [ebp-24h]
  int *v40; // [esp+30h] [ebp-20h]
  unsigned int n512; // [esp+34h] [ebp-1Ch]
  _DWORD *v42; // [esp+38h] [ebp-18h]
  _DWORD *v43; // [esp+3Ch] [ebp-14h]
  int v44; // [esp+40h] [ebp-10h]
  int v45; // [esp+44h] [ebp-Ch]
  unsigned int v46; // [esp+48h] [ebp-8h]
  unsigned int n36_1; // [esp+4Ch] [ebp-4h] BYREF

  LOBYTE(v45) = 0; /*0xffc15d0b*/
  v0 = sub_FFC16386(); /*0xffc15d0e*/
  if ( (*(unsigned __int8 (__cdecl **)(int))(v0 + 24))(4) ) /*0xffc15d15*/
  {
    sub_FFC15FC8(0x80000000, &n36_1, v31, v31, 0); /*0xffc15d2a*/
    if ( n36_1 >= 0x80000001 ) /*0xffc15d38*/
    {
      sub_FFC15FC8(-2147483647, 0, -2147483647, -2147483647, &v36); /*0xffc15d42*/
      if ( (v36 & 0x4000000) != 0 ) /*0xffc15d51*/
        LOBYTE(v45) = 1; /*0xffc15d53*/
    }
  }
  v1 = sub_FFC16008(); /*0xffc15d57*/
  v2 = sub_FFC16033(6, v1); /*0xffc15d61*/
  if ( v2 ) /*0xffc15d68*/
  {
    n36 = *(_BYTE *)(v2 + 8); /*0xffc15d6a*/
  }
  else
  {
    sub_FFC15FC8(0x80000000, &n36_1, v3, v3, 0); /*0xffc15d77*/
    v3 = -2147483640; /*0xffc15d7c*/
    if ( n36_1 < 0x80000008 ) /*0xffc15d87*/
    {
      n36 = 36; /*0xffc15d9c*/
    }
    else
    {
      sub_FFC15FC8(-2147483640, &n36_1, -2147483640, -2147483640, 0); /*0xffc15d8f*/
      n36 = n36_1; /*0xffc15d94*/
    }
  }
  LOBYTE(v46) = n36; /*0xffc15d9e*/
  if ( n36 > 0x30u ) /*0xffc15da4*/
  {
    n36 = 48; /*0xffc15da6*/
    LOBYTE(v46) = 48; /*0xffc15da8*/
  }
  if ( dword_FFC18E48 ) /*0xffc15db2*/
  {
    result = dword_FFC18E48(v46, v45); /*0xffc15dba*/
    v3 = v32; /*0xffc15dbd*/
    if ( result ) /*0xffc15dc0*/
      return result; /*0xffc15dc0*/
  }
  if ( n36 > 0x27u ) /*0xffc15dcc*/
  {
    n0x200 = n36 - 39; /*0xffc15e12*/
    LOBYTE(v3) = n36 - 39; /*0xffc15e15*/
    n512_1 = 0x100000000LL; /*0xffc15e18*/
    if ( ((n36 - 39) & 0x20) == 0 ) /*0xffc15e20*/
      n512_1 = 1; /*0xffc15e22*/
    n0x200_1 = n512_1 << (v3 & 0x1F); /*0xffc15e2c*/
    n0x200 = n0x200_1; /*0xffc15e33*/
    LODWORD(n512_1) = 512; /*0xffc15e36*/
    n512 = 512; /*0xffc15e38*/
  }
  else
  {
    v3 = 1; /*0xffc15dd3*/
    n0x200_3 = n36 - 30; /*0xffc15dd4*/
    n0x200_1 = 1; /*0xffc15ddb*/
    n0x200 = 1; /*0xffc15ddd*/
    LOBYTE(v3) = n36 - 30; /*0xffc15de3*/
    v7 = 0x100000000LL; /*0xffc15de6*/
    if ( ((n36 - 30) & 0x20) == 0 ) /*0xffc15dee*/
      v7 = 1; /*0xffc15df0*/
    n512_1 = v7 << (v3 & 0x1F); /*0xffc15df8*/
    n512 = n512_1; /*0xffc15dfa*/
  }
  if ( (_BYTE)v45 ) /*0xffc15e42*/
    n0x200_2 = n0x200_1; /*0xffc15e4c*/
  else
    n0x200_2 = n0x200_1 * (n512_1 + 1); /*0xffc15e47*/
  v10 = sub_FFC1632D(v3, n0x200_2 + 1); /*0xffc15e4f*/
  v11 = 0; /*0xffc15e56*/
  v44 = 0; /*0xffc15e58*/
  v12 = (_DWORD *)v10; /*0xffc15e5b*/
  v33 = v10; /*0xffc15e5d*/
  v13 = (int *)(v10 + 4096); /*0xffc15e60*/
  n0x200_5 = 0; /*0xffc15e65*/
  v43 = (_DWORD *)v33; /*0xffc15e67*/
  v46 = 0; /*0xffc15e6a*/
  if ( !n0x200_1 ) /*0xffc15e6f*/
  {
LABEL_44:
    v30 = 512 - n0x200_5; /*0xffc15f95*/
    do /*0xffc15fa7*/
    {
      DxeIplSetMem32(v12, 8); /*0xffc15f9a*/
      v12 += 2; /*0xffc15fa0*/
      --v30; /*0xffc15fa4*/
    }
    while ( v30 ); /*0xffc15fa7*/
    return v33; /*0xffc15fa7*/
  }
  n0x200_3 = n0x200_1; /*0xffc15e75*/
  n0x200_4 = n0x200_1; /*0xffc15e78*/
  do /*0xffc15f87*/
  {
    v12[1] = 0; /*0xffc15e7b*/
    v15 = v13; /*0xffc15e7f*/
    *v12 = v13; /*0xffc15e86*/
    *v12 |= 2u; /*0xffc15e88*/
    *v12 |= 1u; /*0xffc15e8b*/
    v16 = (_BYTE)v45 == 0; /*0xffc15e8e*/
    v42 = v13 + 1024; /*0xffc15e92*/
    v17 = v12[1]; /*0xffc15e95*/
    v40 = v15; /*0xffc15e98*/
    v12[1] = v17; /*0xffc15e9b*/
    if ( v16 ) /*0xffc15e9e*/
    {
      n512_5 = 0; /*0xffc15edc*/
      if ( n512 ) /*0xffc15ee0*/
      {
        v23 = v42; /*0xffc15ee2*/
        n512_2 = n512; /*0xffc15ee5*/
        n512_3 = n512; /*0xffc15ee8*/
        do /*0xffc15f4c*/
        {
          v15[1] = 0; /*0xffc15eeb*/
          v24 = v23; /*0xffc15eef*/
          v25 = v15[1]; /*0xffc15ef1*/
          v26 = v46; /*0xffc15efa*/
          *v15 = (int)v23; /*0xffc15efd*/
          *v15 |= 2u; /*0xffc15eff*/
          *v15 |= 1u; /*0xffc15f02*/
          v42 = v23 + 1024; /*0xffc15f05*/
          n512_4 = 512; /*0xffc15f08*/
          v15[1] = v25; /*0xffc15f0a*/
          v28 = __PAIR64__(v44, v26); /*0xffc15f0d*/
          do /*0xffc15f34*/
          {
            *v24 = v28 | 2; /*0xffc15f15*/
            *v24 |= 1u; /*0xffc15f19*/
            *v24 |= 0x80u; /*0xffc15f1c*/
            v24[1] = HIDWORD(v28); /*0xffc15f28*/
            v24 += 2; /*0xffc15f2b*/
            v28 += 0x200000LL; /*0xffc15f2e*/
            --n512_4; /*0xffc15f31*/
          }
          while ( n512_4 ); /*0xffc15f34*/
          v23 = v42; /*0xffc15f36*/
          v44 = HIDWORD(v28); /*0xffc15f39*/
          v15 = v40 + 2; /*0xffc15f3f*/
          v46 = v28; /*0xffc15f42*/
          v16 = n512_2-- == 1; /*0xffc15f45*/
          v40 += 2; /*0xffc15f49*/
        }
        while ( !v16 ); /*0xffc15f4c*/
        v21 = v43; /*0xffc15f4e*/
        if ( n512 >= 0x200 ) /*0xffc15f54*/
          goto LABEL_40; /*0xffc15f54*/
        n512_5 = n512_3; /*0xffc15f56*/
      }
      v29 = 512 - n512_5; /*0xffc15f60*/
      do /*0xffc15f72*/
      {
        DxeIplSetMem32(v15, 8); /*0xffc15f65*/
        v15 += 2; /*0xffc15f6b*/
        --v29; /*0xffc15f6f*/
      }
      while ( v29 ); /*0xffc15f72*/
      v21 = v43; /*0xffc15f74*/
LABEL_40:
      v11 = v46; /*0xffc15f77*/
      goto LABEL_41; /*0xffc15f77*/
    }
    v18 = v44; /*0xffc15ea0*/
    n512_6 = 512; /*0xffc15ea3*/
    do /*0xffc15ec9*/
    {
      *v15 = v11 | 2; /*0xffc15eaa*/
      *v15 |= 1u; /*0xffc15eae*/
      *v15 |= 0x80u; /*0xffc15eb1*/
      v15[1] = v18; /*0xffc15ebd*/
      v15 += 2; /*0xffc15ec0*/
      v20 = v11 + 0x40000000; /*0xffc15ec3*/
      v18 = (__PAIR64__(v18, v11) + 0x40000000) >> 32; /*0xffc15ec3*/
      v11 += 0x40000000; /*0xffc15ec3*/
      --n512_6; /*0xffc15ec6*/
    }
    while ( n512_6 ); /*0xffc15ec9*/
    v44 = v18; /*0xffc15ecb*/
    v21 = v43; /*0xffc15ece*/
    v46 = v20; /*0xffc15ed1*/
LABEL_41:
    v13 = v42; /*0xffc15f7a*/
    v12 = v21 + 2; /*0xffc15f7d*/
    v16 = n0x200_3-- == 1; /*0xffc15f80*/
    v43 = v12; /*0xffc15f84*/
  }
  while ( !v16 ); /*0xffc15f87*/
  if ( n0x200 < 0x200 ) /*0xffc15f90*/
  {
    n0x200_5 = n0x200_4; /*0xffc15f92*/
    goto LABEL_44; /*0xffc15f92*/
  }
  return v33; /*0xffc15fac*/
}