Newer
Older
AMI-Aptio-BIOS-Reversed / EarlyVideoPei / ImageDecodeMain.c
@Ajax Dong Ajax Dong 2 days ago 8 KB Init
/*
 * ImageDecodeMain at 0xffe723d9.
 * Central formatted-image decode routine; decompiler-generated identifier
 * artifacts are intentionally preserved for traceability.
 */
int __fastcall ImageDecodeMain(char *a1, int a2, char *%08x_%04x_%04x_%02x%02x_%02x%02x%02x%02x%02x%02x, char *va)
{
  char *v4; // ebx
  int v5; // edi
  char *%08x_%04x_%04x_%02x%02x_%02x%02x%02x%02x%02x%02x_1; // esi
  char *v7; // ecx
  char *i_1; // edx
  char n37; // al
  char *v10; // esi
  char *i_2; // edx
  char *v12; // ecx
  int m_2; // eax
  char n97; // ah
  char *k; // ecx
  unsigned __int8 *v16; // edi
  int v17; // ebx
  int v18; // esi
  int v19; // ecx
  int v20; // eax
  int v21; // eax
  char *v22; // eax
  char n105; // ah
  unsigned int n10_1; // eax
  char *v25; // ecx
  unsigned int n10_3; // edx
  char v27; // dl
  unsigned int m; // eax
  char *v29; // ecx
  char *j; // eax
  int v32; // [esp-1Ch] [ebp-6Ch]
  int v33; // [esp-18h] [ebp-68h]
  int v34; // [esp-14h] [ebp-64h]
  int v35; // [esp-10h] [ebp-60h]
  int v36; // [esp-Ch] [ebp-5Ch]
  __int64 n0xA; // [esp-Ch] [ebp-5Ch]
  int v38; // [esp-8h] [ebp-58h]
  int v39; // [esp-4h] [ebp-54h]
  int n10; // [esp-4h] [ebp-54h]
  char v41; // [esp-4h] [ebp-54h]
  char v42; // [esp+Eh] [ebp-42h]
  char n32; // [esp+Fh] [ebp-41h]
  char *v44; // [esp+10h] [ebp-40h]
  char *v45; // [esp+14h] [ebp-3Ch]
  char *i; // [esp+18h] [ebp-38h]
  int v47; // [esp+1Ch] [ebp-34h]
  int v49; // [esp+24h] [ebp-2Ch]
  unsigned int n10_2; // [esp+24h] [ebp-2Ch]
  unsigned int m_1; // [esp+28h] [ebp-28h]
  char *v52; // [esp+28h] [ebp-28h]
  unsigned int n2; // [esp+28h] [ebp-28h]
  char *%08x_%04x_%04x_%02x%02x_%02x%02x%02x%02x%02x%02x_2; // [esp+2Ch] [ebp-24h] BYREF
  char v55[32]; // [esp+30h] [ebp-20h] BYREF
  char *%08x_%04x_%04x_%02x%02x_%02x%02x%02x%02x%02x%02x_3; // [esp+58h] [ebp+8h]

  v4 = a1;
  v44 = a1;
  v5 = a2;
  v47 = a2;
  if ( !a1 )
    return -1;
  %08x_%04x_%04x_%02x%02x_%02x%02x%02x%02x%02x%02x_1 = %08x_%04x_%04x_%02x%02x_%02x%02x%02x%02x%02x%02x;
  if ( !%08x_%04x_%04x_%02x%02x_%02x%02x%02x%02x%02x%02x )
    return -1;
  if ( a2 != 1 )
  {
    v7 = va - 4;
    i_1 = va - 8;
    v45 = va - 4;
    for ( i = va - 8; ; i_1 = i )
    {
      n37 = *%08x_%04x_%04x_%02x%02x_%02x%02x%02x%02x%02x%02x_1;
      if ( !*%08x_%04x_%04x_%02x%02x_%02x%02x%02x%02x%02x%02x_1 )
        break;
      if ( n37 != 37 )
      {
        *v4++ = n37;
        ++%08x_%04x_%04x_%02x%02x_%02x%02x%02x%02x%02x%02x_1;
LABEL_8:
        --v5;
        v44 = v4;
        v47 = v5;
        goto LABEL_65;
      }
      v10 = %08x_%04x_%04x_%02x%02x_%02x%02x%02x%02x%02x%02x_1 + 1;
      if ( *v10 == 37 )
      {
        %08x_%04x_%04x_%02x%02x_%02x%02x%02x%02x%02x%02x_1 = v10 + 1;
        *v4++ = 37;
        goto LABEL_8;
      }
      n32 = 32;
      if ( *v10 == 48 )
      {
        n32 = 48;
        ++v10;
      }
      if ( *v10 == 42 )
      {
        i_2 = i_1 + 4;
        %08x_%04x_%04x_%02x%02x_%02x%02x%02x%02x%02x%02x_1 = v10 + 1;
        v12 = v7 + 4;
        i = i_2;
        v45 = v12;
        m_2 = *(_DWORD *)v12;
      }
      else
      {
        m_2 = ImageDecodeInit(v10, &%08x_%04x_%04x_%02x%02x_%02x%02x%02x%02x%02x%02x_2);
        %08x_%04x_%04x_%02x%02x_%02x%02x%02x%02x%02x%02x_1 = %08x_%04x_%04x_%02x%02x_%02x%02x%02x%02x%02x%02x_2;
        i_2 = i;
        v12 = v45;
      }
      m_1 = m_2;
      n97 = *%08x_%04x_%04x_%02x%02x_%02x%02x%02x%02x%02x%02x_1;
      %08x_%04x_%04x_%02x%02x_%02x%02x%02x%02x%02x%02x_3 = %08x_%04x_%04x_%02x%02x_%02x%02x%02x%02x%02x%02x_1;
      if ( *%08x_%04x_%04x_%02x%02x_%02x%02x%02x%02x%02x%02x_1 == 115 || n97 == 97 )
      {
        i = i_2 + 4;
        v45 = v12 + 4;
        for ( j = (char *)*((_DWORD *)v12 + 1); *j; ++j )
        {
          v47 = --v5;
          if ( !v5 )
            goto LABEL_67;
          *v4++ = *j;
          v44 = v4;
        }
        goto LABEL_64;
      }
      if ( n97 == 83 )
      {
        i = i_2 + 4;
        v45 = v12 + 4;
        for ( k = (char *)*((_DWORD *)v12 + 1); *(_WORD *)k; k += 2 )
        {
          v47 = --v5;
          if ( !v5 )
            goto LABEL_69;
          *v4++ = *k;
          v44 = v4;
        }
        ++%08x_%04x_%04x_%02x%02x_%02x%02x%02x%02x%02x%02x_1;
      }
      else
      {
        if ( n97 == 99 )
        {
          i = i_2 + 4;
          v45 = v12 + 4;
          *v4++ = v12[4];
          v44 = v4;
          goto LABEL_64;
        }
        if ( (n97 & 0xDF) == 0x47 )
        {
          v52 = v4;
          v45 = v12 + 4;
          i = i_2 + 4;
          v16 = (unsigned __int8 *)*((_DWORD *)v12 + 1);
          v17 = DebugAssertPrint2(v16);
          v18 = (unsigned __int16)DebugAssertPrint(v16 + 4);
          v19 = (unsigned __int16)DebugAssertPrint(v16 + 6);
          v39 = v16[15];
          v38 = v16[14];
          v36 = v16[13];
          v35 = v16[12];
          v34 = v16[11];
          v33 = v16[10];
          v32 = v16[9];
          v20 = v16[8];
          v5 = v47;
          v21 = ImageDecodeDone(
                  v44,
                  v47,
                  "%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x",
                  v17,
                  v18,
                  v19,
                  v20,
                  v32,
                  v33,
                  v34,
                  v35,
                  v36,
                  v38,
                  v39);
          %08x_%04x_%04x_%02x%02x_%02x%02x%02x%02x%02x%02x_1 = %08x_%04x_%04x_%02x%02x_%02x%02x%02x%02x%02x%02x_3;
          v4 = &v44[v21];
          v49 = v21;
          v44 += v21;
          if ( *%08x_%04x_%04x_%02x%02x_%02x%02x%02x%02x%02x%02x_3 == 71 )
          {
            ImageDecodeGetInfo(v52);
            v21 = v49;
          }
LABEL_29:
          v5 -= v21;
          v47 = v5;
          goto LABEL_64;
        }
        if ( n97 == 114 )
        {
          v45 = v12 + 4;
          i = i_2 + 4;
          n2 = *((_DWORD *)v12 + 1);
          v22 = ImageDecodePrintInfo(n2);
          if ( v22 )
            v21 = ImageDecodeDone(v4, v5, "%s", v22);
          else
            v21 = ImageDecodeDone(
                    v4,
                    v5,
                    "%s(%X)",
                    aStatusCode, // "Status Code"
                    n2);
          v4 += v21;
          v44 = v4;
          goto LABEL_29;
        }
        if ( n97 == 108 )
        {
          ++%08x_%04x_%04x_%02x%02x_%02x%02x%02x%02x%02x%02x_1;
          v42 = 1;
        }
        else
        {
          v42 = 0;
        }
        n105 = *%08x_%04x_%04x_%02x%02x_%02x%02x%02x%02x%02x%02x_1;
        if ( *%08x_%04x_%04x_%02x%02x_%02x%02x%02x%02x%02x%02x_1 == 100 || n105 == 105 )
        {
          n10 = 10;
LABEL_44:
          n10_1 = n10;
          n10_2 = n10;
          if ( v42 )
          {
            v25 = v12 + 8;
            v41 = 1;
            i = i_2 + 8;
            n0xA = *((_QWORD *)i_2 + 1);
            n10_3 = n10_1;
          }
          else
          {
            v25 = v12 + 4;
            i = i_2 + 4;
            v41 = 0;
            n0xA = *(int *)v25;
            n10_3 = n10_2;
          }
          v45 = v25;
          ZeroMem(v55, n10_3, n0xA, v41);
          if ( *%08x_%04x_%04x_%02x%02x_%02x%02x%02x%02x%02x%02x_1 == 88
            || *%08x_%04x_%04x_%02x%02x_%02x%02x%02x%02x%02x%02x_1 == 112 )
          {
            ImageDecodeGetInfo(v55);
          }
          v27 = v55[0];
          for ( m = 0; v55[m]; ++m )
            ;
          if ( m < m_1 )
          {
            while ( 1 )
            {
              ++m;
              v47 = --v5;
              if ( !v5 )
                goto LABEL_67;
              *v4++ = n32;
              v44 = v4;
              if ( m >= m_1 )
              {
                v27 = v55[0];
                break;
              }
            }
          }
          v29 = v55;
          if ( v27 )
          {
            while ( 1 )
            {
              v47 = --v5;
              if ( !v5 )
                break;
              *v4++ = *v29++;
              v44 = v4;
              if ( !*v29 )
                goto LABEL_64;
            }
LABEL_67:
            *v4 = 0;
            return v4 - a1;
          }
LABEL_64:
          ++%08x_%04x_%04x_%02x%02x_%02x%02x%02x%02x%02x%02x_1;
          goto LABEL_65;
        }
        if ( (n105 & 0xDF) == 0x58 || n105 == 112 )
        {
          n10 = 16;
          goto LABEL_44;
        }
      }
LABEL_65:
      if ( v5 == 1 )
        break;
      v7 = v45;
    }
  }
LABEL_69:
  *v4 = 0;
  return v4 - a1;
}