Newer
Older
AMI-Aptio-BIOS-Reversed / PurleyPlatPkg / Platform / Pei / EarlyVideoPei / VgaModeProgramMisc.c
@Ajax Dong Ajax Dong 2 days ago 6 KB Full restructure
char *__thiscall VgaModeProgramMisc(int *this)
{
  int v1; // eax
  int v2; // ebx
  char *result; // eax
  int v4; // ecx
  _DWORD *v5; // edi
  unsigned int v6; // esi
  int v7; // edi
  int Width; // eax
  int v9; // eax
  int n88_9; // eax
  int n88_10; // eax
  int n88_11; // eax
  int n88; // ecx
  unsigned int n68; // edx
  int n88_12; // eax
  int n88_13; // eax
  int BootMode; // eax
  char *BootMode_1; // esi
  int n88_14; // ecx
  char *BootMode_2; // ecx
  int n88_15; // eax
  char *dst; // eax
  int n88_16; // ecx
  int PeiServices; // eax
  int n88_2; // ecx
  int v26; // esi
  int v27; // eax
  int v28; // esi
  int v29; // eax
  int v30; // edi
  int v31; // esi
  int v32; // eax
  int v33; // esi
  int v34; // eax
  char *v35; // esi
  int n88_5; // ecx
  int n88_6; // ecx
  int n88_7; // eax
  char *v39; // esi
  int n88_8; // ecx
  int v41; // [esp+0h] [ebp-84h]
  int n88_1; // [esp+0h] [ebp-84h]
  int n88_3; // [esp+0h] [ebp-84h]
  int n88_4; // [esp+18h] [ebp-6Ch] BYREF
  int v45; // [esp+1Ch] [ebp-68h] BYREF
  int v46; // [esp+20h] [ebp-64h] BYREF
  _DWORD v47[4]; // [esp+24h] [ebp-60h] BYREF
  _DWORD v48[4]; // [esp+34h] [ebp-50h] BYREF
  _DWORD v49[4]; // [esp+44h] [ebp-40h] BYREF
  _DWORD v50[3]; // [esp+54h] [ebp-30h] BYREF
  __int16 n8616; // [esp+60h] [ebp-24h]
  char v52; // [esp+62h] [ebp-22h]
  char v53; // [esp+63h] [ebp-21h]
  char v54[24]; // [esp+64h] [ebp-20h] BYREF
  int v55; // [esp+7Ch] [ebp-8h]

  v1 = *this;
  v47[0] = -447900028;
  v2 = 1;
  v47[1] = 1139746613;
  v47[2] = -231704157;
  v47[3] = 280662773;
  v48[0] = 2075298713;
  v48[1] = 299196859;
  v48[2] = -1879024230;
  v48[3] = 1304510247;
  v49[0] = -624774889;
  v49[1] = 1231336955;
  v49[2] = -871558493;
  v49[3] = -1692727689;
  v50[0] = -1476496239;
  v50[1] = 1332882516;
  v50[2] = 1232473784;
  n8616 = 8616;
  v52 = 1;
  v53 = -109;
  result = (char *)(*(int (__cdecl **)(int *, int, int, int *))(v1 + 52))(this, 4, 152, &n88_4);
  if ( (int)result >= 0 )
  {
    v5 = (_DWORD *)(n88_4 + 8);
    *(_DWORD *)(n88_4 + 8) = unk_FFE774CC;
    *++v5 = unk_FFE774D0;
    *++v5 = unk_FFE774D4;
    v5[1] = unk_FFE774D8;
    v6 = -15663104;
    v7 = 0;
    while ( 1 )
    {
      v41 = v4;
      Width = ImageDecodeGetWidth((_BYTE *)v6, v47);
      v4 = v41;
      if ( !Width )
      {
        v9 = ImageDecodeGetWidth((_BYTE *)(v6 + 24), v48);
        v4 = v41;
        if ( !v9 )
          break;
      }
      v6 += 8;
      if ( v6 >= 0xFFBAF000 )
        goto LABEL_8;
    }
    v7 = (*(_DWORD *)(v6 + 48) & 0xFFFFFF) - 4;
    v6 += 52;
LABEL_8:
    *(_BYTE *)(n88_4 + 24) = 0;
    n88_9 = n88_4;
    *(_DWORD *)(n88_4 + 32) = 0;
    *(_DWORD *)(n88_9 + 36) = 0;
    n88_10 = n88_4;
    *(_DWORD *)(n88_4 + 48) = 0;
    *(_DWORD *)(n88_10 + 52) = 0;
    n88_11 = n88_4;
    *(_DWORD *)(n88_4 + 56) = 0;
    *(_DWORD *)(n88_11 + 60) = 0;
    *(_DWORD *)(n88_4 + 64) = 0;
    n88 = 88;
    n68 = 68;
    do
    {
      *(_WORD *)(n68 + n88_4) = 0;
      n68 += 2;
      n88_12 = n88_4;
      *(_DWORD *)(n88 + n88_4) = 0;
      n88 += 8;
      *(_DWORD *)(n88 + n88_12 - 4) = 0;
    }
    while ( n68 < 0x54 );
    if ( v7 )
    {
      n88_13 = n88_4;
      *(_DWORD *)(n88_4 + 32) = v6;
      *(_DWORD *)(n88_13 + 36) = 0;
    }
    BootMode = PeiServiceGetBootMode(n88, 768);
    BootMode_1 = (char *)BootMode;
    if ( BootMode )
    {
      *(_BYTE *)(n88_4 + 24) = 1;
      n88_14 = n88_4;
      *(_DWORD *)(n88_4 + 40) = -1879048192;
      *(_DWORD *)(n88_14 + 44) = 0;
      BootMode_2 = (char *)BootMode;
      *(_DWORD *)(n88_4 + 64) = 3145728;
      n88_15 = n88_4;
      *(_DWORD *)(n88_4 + 48) = BootMode_1;
      *(_DWORD *)(n88_15 + 52) = 0;
      CopyMem(BootMode_2, (char *)0x90000000, 0x300000u);
      dst = (char *)PeiServiceGetBootMode(n88_1, 768);
      if ( dst )
      {
        n88_16 = n88_4;
        *(_DWORD *)(n88_4 + 56) = dst;
        *(_DWORD *)(n88_16 + 60) = 0;
        CopyMem(dst, BootMode_1, 0x300000u);
      }
    }
    PeiServices = PeiGetPeiServices();
    if ( (*(int (__cdecl **)(int, _DWORD, int *))(*(_DWORD *)PeiServices + 56))(PeiServices, 0, &v45) >= 0 )
    {
      do
      {
        v26 = v45;
        v27 = PeiGetPeiServices();
        if ( (*(int (__cdecl **)(_DWORD *, int, int *))(*(_DWORD *)v27 + 104))(v49, v26, &v46) >= 0 )
        {
          v28 = v46;
          v29 = PeiGetPeiServices();
          if ( (*(int (__cdecl **)(int, char *))(*(_DWORD *)v29 + 108))(v28, v54) >= 0 )
          {
            v30 = v55 + 4;
            v31 = (*(_DWORD *)v55 & 0xFFFFFF) - 4;
            v32 = ImageDecodeGetWidth((_BYTE *)(v55 + 4), v50);
            n88_2 = n88_3;
            if ( v32 )
            {
              v31 = 0;
            }
            else
            {
              *(_WORD *)(n88_4 + 68) = 19;
              n88_2 = n88_4;
              *(_DWORD *)(n88_4 + 88) = v30 + 16;
              *(_DWORD *)(n88_2 + 92) = 0;
            }
            if ( v31 )
              break;
          }
        }
        v33 = v2;
        v34 = PeiGetPeiServices();
        ++v2;
      }
      while ( (*(int (__cdecl **)(int, int, int *))(*(_DWORD *)v34 + 56))(v34, v33, &v45) >= 0 );
    }
    result = (char *)PeiServiceGetBootMode(n88_2, 4);
    v35 = result;
    if ( result )
    {
      n88_5 = n88_4;
      *(_DWORD *)(n88_4 + 96) = result;
      *(_DWORD *)(n88_5 + 100) = 0;
      *(_WORD *)(n88_4 + 70) = 19;
      CopyMem(
        *(char **)(n88_4 + 96),
        asc_FFE7A69C, // " "
        0x900u);
      n88_6 = n88_4;
      *(_DWORD *)(n88_4 + 144) = v35 + 2304;
      *(_DWORD *)(n88_6 + 148) = 0;
      *(_WORD *)(n88_4 + 82) = 31;
      CopyMem(
        *(char **)(n88_4 + 144),
        asc_FFE79204, // " "
        0x1495u);
      n88_7 = n88_4;
      v39 = v35 + 7573;
      *(_DWORD *)(n88_4 + 120) = v39;
      *(_DWORD *)(n88_7 + 124) = 0;
      *(_WORD *)(n88_4 + 76) = 23;
      CopyMem(
        *(char **)(n88_4 + 120),
        asc_FFE7849C, // " "
        0xD61u);
      n88_8 = n88_4;
      *(_DWORD *)(n88_4 + 112) = v39 + 3425;
      *(_DWORD *)(n88_8 + 116) = 0;
      *(_WORD *)(n88_4 + 74) = 21;
      return CopyMem(
               *(char **)(n88_4 + 112),
               asc_FFE77844, // " "
               0xC51u);
    }
  }
  return result;
}