sub_140963C98

__int64 __fastcall sub_140963C98(INT64 *a1, INT64 a2, _DWORD *a3){
  int v4; 
  int v6; 
  void *v7; 
  _DWORD *v8; 
  int v9; 
  INT64 v11; 
  INT64 v12; 
  int v13; 
  PMDL Mdl; 
  char v15; 
  INT64 v16; 

  v16 = 0i64;
  Mdl = 0i64;
  v4 = a2;
  v15 = 0;
  if( (_DWORD)a2 && (*a3 & 1) != 0 )
  {
    v6 = 0;
  }
  else
  {
    v7 = (void *)(a1[4] + (a3[1] & 0xFFFFFFF));
    v6 = sub_14065E218(v7, a3[2] & 0xFFFFFFF, (*a3 & 2) == 0);
    if( v6 >= 0 )
    {
      v6 = sub_1405D28BC(v7, a3[2] & 0xFFFFFFF, (*a3 & 2) == 0, &Mdl, (UINT64 *)&v16);
      if( v6 >= 0 )
      {
        v8 = (_DWORD *)v16;
        if( !v4
          || (LODWORD(v11) = a3[2] & 0xFFFFFFF,
              v6 = ApplyRelocations(
                     a1[5],
                     *(unsigned int *)(a1[7] + 48),
                     a1[4],
                     *(_QWORD *)(a1[7] + 56) - a1[4],
                     (INT64)v7,
                     v16,
                     v11),
              v6 >= 0) )
        {
          memmove(v8, v7, a3[2] & 0xFFFFFFF);
          if( (*a3 & 2) != 0 || (a3[2] & 0xFFFFFFFu) >= 4 )
          {
            if( (*a3 & 2) == 0 )
              *v8 = a3[3];
            v6 = sub_14065F78C(
                   0,
                   v8,
                   (char *)v8,
                   a3[2] & 0xFFFFFFF,
                   (__int64 *)(a1[7] + 72),
                   a3[1] & 0xFFFFFFF,
                   (__int128 *)(a1[7] + 80),
                   v13,
                   &v15);
            if( v6 >= 0 )
            {
              if( !v4
                || (LODWORD(v12) = a3[2] & 0xFFFFFFF,
                    v6 = ApplyRelocations(
                           a1[5],
                           *(unsigned int *)(a1[7] + 48),
                           a1[4],
                           a1[4] - *(_QWORD *)(a1[7] + 56),
                           (INT64)v7,
                           (INT64)v8,
                           v12),
                    v6 >= 0) )
              {
                ZwFlushInstructionCache();
                v6 = v9;
              }
            }
          }
          else
          {
            v6 = -1073741811;
          }
        }
      }
    }
  }
  sub_14064F46C(Mdl, a2, (INT64)a3);
  return(unsigned int)v6;
}

Referenced by:

WbDecryptWarbirdEncryptionSegment