MiVerifyImageHeader

INT64 __fastcall MiVerifyImageHeader(__int64 a1, __int64 a2, __int64 a3, unsigned __int64 a4){
  __int16 v6; 
  int v7; 
  unsigned int v8; 
  int v9; 
  int v10; 
  int v11; 
  __int16 v12; 
  unsigned int v13; 
  unsigned int v14; 
  unsigned int v15; 
  __int16 v16; 
  __int64 v17; 
  char v18; 
  unsigned __int16 v19; 
  __int16 v20; 
  int v22; 
  unsigned int v23; 
  int v24; 
  int v25; 
  __int16 v26; 
  if( (a2 & 3) != 0 )
  {
    dword_140C4C958 = 59;
    return 3221225776i64;
  }
  if( *(_DWORD *)a2 == 17744 )
  {
    if( !*(_WORD *)(a2 + 4) && !*(_WORD *)(a2 + 20) )
    {
      dword_140C4C958 = 70;
      return 3221225776i64;
    }
    if( (*(_BYTE *)(a2 + 22) & 2) == 0 )
    {
      dword_140C4C958 = 71;
      return 3221225595i64;
    }
    v6 = *(_WORD *)(a2 + 24);
    *(_WORD *)(a1 + 48) = v6;
    *(_DWORD *)(a1 + 8) = *(_DWORD *)(a2 + 60);
    *(_DWORD *)(a1 + 12) = *(_DWORD *)(a2 + 56);
    *(_DWORD *)(a1 + 16) = *(_DWORD *)(a2 + 80);
    if( v6 == 523 )
    {
      v7 = *(_DWORD *)(a2 + 128);
      *(_DWORD *)(a1 + 20) = v7;
      *(_QWORD *)a1 = *(_QWORD *)(a2 + 48);
      *(_DWORD *)(a1 + 24) = *(_DWORD *)(a2 + 84);
      *(_DWORD *)(a1 + 28) = *(_DWORD *)(a2 + 40);
      *(_QWORD *)(a1 + 32) = *(_QWORD *)(a2 + 96);
      *(_QWORD *)(a1 + 40) = *(_QWORD *)(a2 + 104);
      *(_WORD *)(a1 + 50) = *(_WORD *)(a2 + 92);
      *(_WORD *)(a1 + 52) = *(_WORD *)(a2 + 72);
      *(_WORD *)(a1 + 54) = *(_WORD *)(a2 + 74);
      *(_WORD *)(a1 + 56) = *(_WORD *)(a2 + 64);
      *(_WORD *)(a1 + 58) = *(_WORD *)(a2 + 66);
      *(_WORD *)(a1 + 60) = *(_WORD *)(a2 + 94);
      *(_DWORD *)(a1 + 64) = *(_DWORD *)(a2 + 88);
      *(_DWORD *)(a1 + 68) = *(_DWORD *)(a2 + 28);
      *(_QWORD *)(a1 + 104) = 0i64;
      v8 = *(_DWORD *)(a2 + 132);
      if( v8 > 6 )
      {
        v9 = *(_DWORD *)(a2 + 184);
        if( v9 )
        {
          *(_DWORD *)(a1 + 104) = v9;
          *(_DWORD *)(a1 + 108) = *(_DWORD *)(a2 + 188);
          v8 = *(_DWORD *)(a2 + 132);
        }
      }
      if( v8 > 0xC )
      {
        *(_DWORD *)(a1 + 72) = *(_DWORD *)(a2 + 232);
        *(_DWORD *)(a1 + 76) = *(_DWORD *)(a2 + 236);
        v8 = *(_DWORD *)(a2 + 132);
      }
      if( v8 <= 0xE )
      {
        *(_QWORD *)(a1 + 80) = 0i64;
      }
      else
      {
        *(_DWORD *)(a1 + 80) = *(_DWORD *)(a2 + 248);
        *(_DWORD *)(a1 + 84) = *(_DWORD *)(a2 + 252);
        if( *(_DWORD *)(a2 + 248) && *(_DWORD *)(a2 + 252) )
          *(_DWORD *)(a1 + 20) = v7 | 1;
      }
      if( *(_DWORD *)(a2 + 132) <= 5u )
      {
        *(_DWORD *)(a1 + 88) = 0;
        v10 = 0;
      }
      else
      {
        *(_DWORD *)(a1 + 88) = *(_DWORD *)(a2 + 176);
        v10 = *(_DWORD *)(a2 + 180);
      }
      *(_DWORD *)(a1 + 92) = v10;
      if( *(_DWORD *)(a2 + 132) > 0xAu )
      {
        *(_DWORD *)(a1 + 96) = *(_DWORD *)(a2 + 216);
        v11 = *(_DWORD *)(a2 + 220);
LABEL_17:
        *(_DWORD *)(a1 + 100) = v11;
        if( dword_140C4C9D0 && dword_140C4C9D4 == *(_DWORD *)(a1 + 64) && dword_140C4C9D8 == *(_DWORD *)(a1 + 16) )
          __debugbreak();
        v12 = *(_WORD *)(a1 + 48);
        if( ((v12 - 267) & 0xFEFF) != 0 )
        {
          dword_140C4C958 = 73;
        }
        else
        {
          v13 = *(_DWORD *)(a1 + 8);
          if( (v13 & 0x1FF) != 0 && v13 != *(_DWORD *)(a1 + 12) )
          {
            dword_140C4C958 = 76;
            return 3221225595i64;
          }
          if( !v13 )
          {
            dword_140C4C958 = 77;
            return 3221225595i64;
          }
          v14 = *(_DWORD *)(a1 + 12);
          if( ((v14 - 1) & v14) != 0 )
          {
            dword_140C4C958 = 78;
            return 3221225595i64;
          }
          if( ((v13 - 1) & v13) != 0 )
          {
            dword_140C4C958 = 79;
            return 3221225595i64;
          }
          if( v14 < v13 )
          {
            dword_140C4C958 = 80;
            return 3221225595i64;
          }
          v15 = *(_DWORD *)(a1 + 16);
          if( v15 > 0x77000000 )
          {
            dword_140C4C958 = 81;
            return 3221225595i64;
          }
          if( v12 == 267 )
          {
            v26 = *(_WORD *)(a2 + 4);
            if( v26 != 332 && v26 != 452 )
            {
              dword_140C4C958 = 82;
              return 3221225595i64;
            }
          }
          else if( v12 == 523 )
          {
            v16 = *(_WORD *)(a2 + 4);
            if( v16 != -31132 && v16 != -21916 )
            {
              dword_140C4C958 = 83;
              return 3221225595i64;
            }
          }
          if( *(_DWORD *)(a1 + 24) >= v15 )
          {
            dword_140C4C958 = 84;
            return 3221225595i64;
          }
          if( *(_WORD *)a1 )
          {
            dword_140C4C958 = 85;
            return 3221225595i64;
          }
          if( (*(_BYTE *)(a2 + 20) & 7) != 0 )
          {
            dword_140C4C958 = 86;
            return 3221225595i64;
          }
          if( !(unsigned int)MiLegacyImageArchitecture(*(_WORD *)(a2 + 4)) )
          {
            if( (v18 & 1) != 0 )
            {
              dword_140C4C958 = 88;
              return 3221225595i64;
            }
            if( (*(_WORD *)(v17 + 60) & 0x140) != 320 )
            {
              dword_140C4C958 = 89;
              return 3221225595i64;
            }
            return 0i64;
          }
          v20 = *(_WORD *)(v17 + 60);
          if( (_bittest16(&v20, v19) & ((v18 & 1) != 0)) == 0 )
            return 0i64;
          dword_140C4C958 = 87;
        }
        return 3221225595i64;
      }
    }
    else
    {
      v22 = *(_DWORD *)(a2 + 112);
      *(_DWORD *)(a1 + 20) = v22;
      *(_QWORD *)a1 = *(unsigned int *)(a2 + 52);
      *(_DWORD *)(a1 + 24) = *(_DWORD *)(a2 + 84);
      *(_DWORD *)(a1 + 28) = *(_DWORD *)(a2 + 40);
      *(_QWORD *)(a1 + 32) = *(unsigned int *)(a2 + 96);
      *(_QWORD *)(a1 + 40) = *(unsigned int *)(a2 + 100);
      *(_WORD *)(a1 + 50) = *(_WORD *)(a2 + 92);
      *(_WORD *)(a1 + 52) = *(_WORD *)(a2 + 72);
      *(_WORD *)(a1 + 54) = *(_WORD *)(a2 + 74);
      *(_WORD *)(a1 + 56) = *(_WORD *)(a2 + 64);
      *(_WORD *)(a1 + 58) = *(_WORD *)(a2 + 66);
      *(_WORD *)(a1 + 60) = *(_WORD *)(a2 + 94);
      *(_DWORD *)(a1 + 64) = *(_DWORD *)(a2 + 88);
      *(_DWORD *)(a1 + 68) = *(_DWORD *)(a2 + 28);
      *(_QWORD *)(a1 + 104) = 0i64;
      v23 = *(_DWORD *)(a2 + 116);
      if( v23 > 6 )
      {
        v24 = *(_DWORD *)(a2 + 168);
        if( v24 )
        {
          *(_DWORD *)(a1 + 104) = v24;
          *(_DWORD *)(a1 + 108) = *(_DWORD *)(a2 + 172);
          v23 = *(_DWORD *)(a2 + 116);
        }
      }
      if( v23 > 0xC )
      {
        *(_DWORD *)(a1 + 72) = *(_DWORD *)(a2 + 216);
        *(_DWORD *)(a1 + 76) = *(_DWORD *)(a2 + 220);
        v23 = *(_DWORD *)(a2 + 116);
      }
      if( v23 <= 0xE )
      {
        *(_QWORD *)(a1 + 80) = 0i64;
      }
      else
      {
        *(_DWORD *)(a1 + 80) = *(_DWORD *)(a2 + 232);
        *(_DWORD *)(a1 + 84) = *(_DWORD *)(a2 + 236);
        if( *(_DWORD *)(a2 + 232) && *(_DWORD *)(a2 + 236) )
          *(_DWORD *)(a1 + 20) = v22 | 1;
      }
      if( *(_DWORD *)(a2 + 116) <= 5u )
      {
        *(_DWORD *)(a1 + 88) = 0;
        v25 = 0;
      }
      else
      {
        *(_DWORD *)(a1 + 88) = *(_DWORD *)(a2 + 160);
        v25 = *(_DWORD *)(a2 + 164);
      }
      *(_DWORD *)(a1 + 92) = v25;
      if( *(_DWORD *)(a2 + 116) > 0xAu )
      {
        *(_DWORD *)(a1 + 96) = *(_DWORD *)(a2 + 200);
        v11 = *(_DWORD *)(a2 + 204);
        goto LABEL_17;
      }
    }
    v11 = 0;
    *(_DWORD *)(a1 + 96) = 0;
    goto LABEL_17;
  }
  return MiComputeBadImageHeaderType((IMAGE_OS2_HEADER *)a2, a3, a4);
}

Referenced by:

MiCreateImageFileMap