Newer
Older
AMI-Aptio-BIOS-Reversed / PurleyPlatPkg / Platform / Pei / EarlyVideoPei / VgaAttrProgramPalette.c
@Ajax Dong Ajax Dong 2 days ago 3 KB Full restructure
int __cdecl VgaAttrProgramPalette(
        int *a1,
        unsigned int *p_n3145728,
        unsigned int *p_n0x300,
        int *a4,
        unsigned int *p_n0x400)
{
  _BYTE *v5; // ecx
  int v6; // edi
  int v7; // ecx
  int v8; // esi
  int v9; // edx
  unsigned int n0x300_1; // ebx
  unsigned __int64 n0x40000000; // rax
  unsigned int v12; // kr00_4
  unsigned int v13; // eax
  unsigned int *p_n3145728_1; // esi
  char v15; // cl
  int Pool; // eax
  int v17; // ecx
  int v18; // edi
  unsigned __int64 n0x40000000_1; // [esp+18h] [ebp-9C8h]
  int v21; // [esp+18h] [ebp-9C8h]
  int v22; // [esp+24h] [ebp-9BCh]
  int n0x300; // [esp+24h] [ebp-9BCh]
  int v24; // [esp+28h] [ebp-9B8h]
  int v25; // [esp+28h] [ebp-9B8h]
  int v26; // [esp+2Ch] [ebp-9B4h]
  void *v27; // [esp+2Ch] [ebp-9B4h]
  unsigned int v28; // [esp+30h] [ebp-9B0h] BYREF
  int v29; // [esp+34h] [ebp-9ACh]
  _BYTE v30[6]; // [esp+40h] [ebp-9A0h] BYREF
  int v31; // [esp+46h] [ebp-99Ah]
  char *v32; // [esp+4Ah] [ebp-996h]
  char *v33; // [esp+4Eh] [ebp-992h]
  char *v34; // [esp+52h] [ebp-98Eh]
  char *v35; // [esp+56h] [ebp-98Ah]
  unsigned int *v36; // [esp+7Ah] [ebp-966h]
  char *v37; // [esp+7Eh] [ebp-962h]
  char *v38; // [esp+82h] [ebp-95Eh]
  char *v39; // [esp+86h] [ebp-95Ah]
  __int16 v40; // [esp+90h] [ebp-950h]
  char v41; // [esp+A0h] [ebp-940h] BYREF
  char v42; // [esp+C0h] [ebp-920h] BYREF
  char v43; // [esp+100h] [ebp-8E0h] BYREF
  char v44; // [esp+140h] [ebp-8A0h] BYREF
  char v45; // [esp+190h] [ebp-850h] BYREF
  char v46; // [esp+1E0h] [ebp-800h] BYREF
  char v47; // [esp+5E0h] [ebp-400h] BYREF

  v26 = (int)v5;
  v40 = 0;
  v32 = &v44;
  v33 = &v46;
  v34 = &v45;
  v35 = &v47;
  v36 = &v28;
  v37 = &v41;
  v38 = &v42;
  v39 = &v43;
  v6 = -2147483645;
  if ( !VgaDisplayProgramLarge(v5, (int)v30) )
    return v6;
  v7 = v31;
  v8 = *(unsigned __int8 *)(v31 + 6) | (unsigned __int16)(*(_WORD *)(v31 + 5) << 8);
  *a4 = v8;
  v9 = *(unsigned __int8 *)(v7 + 4) | (unsigned __int16)(*(_WORD *)(v7 + 3) << 8);
  *p_n0x300 = v9;
  v22 = (v8 & 0xF) != 0 ? 16 - (v8 & 0xF) : 0;
  v24 = (v9 & 0xF) != 0 ? 16 - (v9 & 0xF) : 0;
  v28 = v22 + v8;
  *p_n0x400 = v22 + v8;
  n0x300_1 = 0;
  v29 = 0;
  v12 = v9 + v24;
  n0x40000000 = v28 * (unsigned __int64)(unsigned int)(v9 + v24);
  n0x40000000_1 = n0x40000000;
  if ( !is_mul_ok(v28, v12) || (unsigned int)n0x40000000 >= 0x40000000 )
    return v6;
  v13 = 4 * n0x40000000;
  p_n3145728_1 = p_n3145728;
  v29 = n0x40000000_1 >> 30;
  if ( *a1 )
  {
    if ( *p_n3145728 >= v13 )
    {
      v15 = 1;
    }
    else
    {
      v15 = 0;
      v6 = -2147483643;
    }
    *p_n3145728 = v13;
LABEL_11:
    if ( v15 != 1 )
      return v6;
    goto LABEL_12;
  }
  *p_n3145728 = v13;
  Pool = PeiAllocatePool((void *)(4 * n0x40000000_1));
  *a1 = Pool;
  if ( !Pool )
  {
    v6 = -2147483639;
    v15 = 0;
    goto LABEL_11;
  }
LABEL_12:
  if ( VgaCrtcProgram(v26, *a1, *p_n0x400, v24 + *p_n0x300) )
  {
    v6 = 0;
    v25 = 0;
    if ( v22 )
    {
      v29 = 0;
      n0x300 = *p_n0x300;
      v28 = *a4;
      v27 = (void *)(4 * v28 * n0x300);
      v17 = PeiAllocatePool(v27);
      v21 = v17;
      if ( !v17 )
      {
        v6 = -2147483639;
        v25 = -2147483639;
      }
      if ( *p_n0x300 )
      {
        v18 = v17;
        do
        {
          if ( 4 * *a4 )
            CopyMem((char *)(v18 + 4 * n0x300_1 * *a4), (char *)(*a1 + 4 * n0x300_1 * *p_n0x400), 4 * *a4);
          ++n0x300_1;
        }
        while ( n0x300_1 < *p_n0x300 );
        v6 = v25;
        p_n3145728_1 = p_n3145728;
        v17 = v21;
      }
      *a1 = v17;
      *p_n0x400 = *a4;
      *p_n3145728_1 = (unsigned int)v27;
    }
  }
  return v6;
}