RtlCompressBufferXpressLzMax

INT64 __fastcall RtlCompressBufferXpressLzMax(
        UINT64 a1,
        UINT64 a2,
        INT64 a3,
        UINT64 a4,
        UINT64 *a5,
        INT64 result,
        INT64 a7,
        INT64 a8,
        UINT64 a9){
  UINT64 v9; 
  INT64 v10; 
  unsigned int v11; 
  unsigned __int8 *v13; 
  __int64 v14; 
  INT64 v16; 
  unsigned __int64 v17; 
  unsigned int v18; 
  _BYTE *v19; 
  char *v20; 
  _DWORD *v21; 
  int v22; 
  __int16 v23; 
  unsigned __int8 *v24; 
  UINT64 v25; 
  char *v26; 
  __int64 v27; 
  INT64 v28; 
  unsigned __int64 v29; 
  unsigned __int64 v30; 
  INT64 v31; 
  char *v32; 
  __int16 v33; 
  UINT64 XpressCallback; 
  int v35; 
  unsigned __int64 v36; 
  int v37; 
  bool v38; 
  __int16 v39; 
  int v40; 
  int v41; 
  _DWORD *v42; 
  INT64 v43; 
  __int64 v44; 
  unsigned __int64 v45; 
  char *v46; 
  _BYTE *v47; 
  _BYTE *v48; 
  int v49; 
  int v50; 
  __int64 v51; 
  __int64 v52; 
  unsigned __int64 v53; 
  char v54; 
  unsigned __int64 v55; 
  unsigned __int64 v56; 
  char v57; 
  unsigned int v58; 
  INT64 v59; 
  INT64 v60; 
  char *v61; 
  INT64 v62; 
  UINT64 v63; 
  UINT64 v64; 
  __int16 v65; 
  unsigned __int8 *v66; 
  unsigned __int64 v67; 
  INT64 v68[2]; 
  unsigned int v69; 
  int v70; 
  __int16 v71; 
  int v72; 
  v72 = a3;
  v71 = a1;
  v9 = a1 + (unsigned int)a2;
  v10 = a3 + (unsigned int)a4;
  v11 = a2;
  v70 = 0;
  v67 = v10;
  v13 = (unsigned __int8 *)a1;
  v14 = 0i64;
  if( (unsigned int)a4 < 0x40 || (unsigned int)a2 < 8 )
    return 3221225507i64;
  if( a1 <= 0x2001 )
    return 3221225659i64;
  v16 = result;
  memset(result, 0i64);
  v61 = 0i64;
  v59 = v10 - 41;
  v17 = v9 - 5;
  if( !a7 || (v18 = a9, (unsigned int)a9 > v11) )
  {
    v18 = v11;
    LODWORD(a9) = v11;
  }
  v68[0] = a7;
  v19 = (_BYTE *)(a3 + 5);
  v20 = (char *)(v13 + 1);
  v68[1] = a8;
  v21 = (_DWORD *)a3;
  v22 = 2;
  *(_BYTE *)(a3 + 4) = *v13;
  v23 = 0;
  v62 = a3;
  v24 = v13;
  v69 = v18;
  v66 = v13;
  while( 2 )
  {
    v25 = v17;
    if( (unsigned __int64)(v24 + 0x2000) <= v17 )
      v25 = (UINT64)(v24 + 0x2000);
    v26 = &v20[v18];
    v64 = v25;
    if( v25 < (unsigned __int64)v26 )
      v26 = (char *)v25;
    v27 = v23 & 0x3FFF;
    v63 = (UINT64)v26;
    v65 = v27;
    if( (unsigned __int64)v24 < v25 )
    {
      v28 = v16 + 8 * (v27 + 0x8000);
      do
      {
        v28 += 8i64;
        LOWORD(v27) = v27 + 1;
        v29 = (unsigned __int16)XpressHashFunction[v24[2] + 512] ^ (unsigned __int16)XpressHashFunction[*v24] ^ (unsigned __int64)(unsigned __int16)XpressHashFunction[v24[1] + 256];
        *(_QWORD *)(v28 - 8) = *(_QWORD *)(v16 + 8 * v29);
        *(_QWORD *)(v16 + 8 * v29) = v24++;
      }
      while( (unsigned __int64)v24 < v25 );
      v66 = v24;
      v65 = v27;
    }
    v30 = v59;
    v31 = v16 + 0x40000;
    v60 = v16 + 0x40000;
LABEL_18:
    v32 = v20 - 0x2000;
    v33 = 0x2000 - (_WORD)v13;
    while( 1 )
    {
      if( v20 < v26 )
        goto LABEL_22;
      if( (unsigned __int64)v20 >= v25 )
        break;
      XpressCallback = RtlpMakeXpressCallback((INT64)v68, v25, (INT64)v20);
      v21 = (_DWORD *)v62;
      v25 = v64;
      v31 = v60;
      v30 = v59;
      v63 = XpressCallback;
LABEL_22:
      v35 = *(_DWORD *)v20;
      v36 = *(_QWORD *)(v31 + 8i64 * ((v33 + (_WORD)v32) & 0x3FFF));
      if( v36 >= (unsigned __int64)v32 )
      {
        v37 = *(_DWORD *)v36 ^ v35;
        if( !v37 )
        {
          v39 = v71;
LABEL_37:
          v43 = v60;
          v44 = 0i64;
          v45 = 3i64;
LABEL_38:
          v46 = v20;
          v47 = v20 + 36;
          v48 = v20 + 4;
          v36 += 4i64;
          if( (unsigned __int64)v47 >= v9 )
          {
LABEL_49:
            while( (unsigned __int64)v48 < v9 )
            {
              if( *v48 != *(_BYTE *)v36 )
                break;
              ++v48;
              ++v36;
            }
          }
          else
          {
            while( 1 )
            {
              v49 = *(_DWORD *)v48;
              v50 = *(_DWORD *)v36;
              if( *(_DWORD *)v48 != *(_DWORD *)v36 )
                break;
              v49 = *((_DWORD *)v48 + 1);
              v50 = *(_DWORD *)(v36 + 4);
              if( v49 != v50 )
              {
                v48 += 4;
                v36 += 4i64;
                break;
              }
              v49 = *((_DWORD *)v48 + 2);
              v50 = *(_DWORD *)(v36 + 8);
              if( v49 != v50 )
              {
                v48 += 8;
                v36 += 8i64;
                break;
              }
              v49 = *((_DWORD *)v48 + 3);
              v50 = *(_DWORD *)(v36 + 12);
              if( v49 != v50 )
              {
                v48 += 12;
                v36 += 12i64;
                break;
              }
              v49 = *((_DWORD *)v48 + 4);
              v50 = *(_DWORD *)(v36 + 16);
              if( v49 != v50 )
              {
                v48 += 16;
                v36 += 16i64;
                break;
              }
              v49 = *((_DWORD *)v48 + 5);
              v50 = *(_DWORD *)(v36 + 20);
              if( v49 != v50 )
              {
                v48 += 20;
                v36 += 20i64;
                break;
              }
              v49 = *((_DWORD *)v48 + 6);
              v50 = *(_DWORD *)(v36 + 24);
              if( v49 != v50 )
              {
                v48 += 24;
                v36 += 24i64;
                break;
              }
              v49 = *((_DWORD *)v48 + 7);
              v50 = *(_DWORD *)(v36 + 28);
              if( v49 != v50 )
              {
                v48 += 28;
                v36 += 28i64;
                break;
              }
              v48 += 32;
              v36 += 32i64;
              if( (unsigned __int64)(v48 + 32) >= v9 )
              {
                v39 = v71;
                goto LABEL_49;
              }
            }
            if( (_BYTE)v49 == (_BYTE)v50 )
            {
              if( v48[1] != *(_BYTE *)(v36 + 1) )
              {
                ++v48;
                ++v36;
                goto LABEL_63;
              }
              v39 = v71;
              if( v48[2] == *(_BYTE *)(v36 + 2) )
              {
                v48 += 3;
                v36 += 3i64;
              }
              else
              {
                v48 += 2;
                v36 += 2i64;
              }
            }
            else
            {
LABEL_63:
              v39 = v71;
            }
          }
          v51 = v48 - v46;
          if( v48 - v46 <= v45 )
          {
            v44 += v51;
          }
          else
          {
            v45 = v48 - v46;
            v14 = (__int64)&v48[-v36];
            if( v36 > (unsigned __int64)v46 )
            {
              v21 = (_DWORD *)v62;
              v20 = v46;
              v30 = v59;
              goto LABEL_67;
            }
          }
          v21 = (_DWORD *)v62;
          v20 = v46;
          v30 = v59;
          LOWORD(v36) = v36 - v51;
          while( (unsigned __int64)++v44 < 0x18 )
          {
LABEL_75:
            v36 = *(_QWORD *)(v43 + 8i64 * (((_WORD)v36 - v39) & 0x3FFF));
            if( v36 < (unsigned __int64)v32 )
              break;
            if( v35 == *(_DWORD *)v36 )
              goto LABEL_38;
          }
LABEL_67:
          v20 += v45;
          v52 = 8 * v14 - 8;
          if( v45 - 3 < 7 )
          {
            v14 = v45 - 3 + v52;
            *(_WORD *)v19 = v14;
            v19 += 2;
            goto LABEL_91;
          }
          v14 = v52 | 7;
          *(_WORD *)v19 = v14;
          v53 = v45 - 10;
          v19 += 2;
          if( v61 )
          {
            v54 = *v61;
            if( v53 < 0xF )
            {
              *v61 = v54 | (16 * v53);
              v61 = 0i64;
              goto LABEL_90;
            }
            *v61 = v54 | 0xF0;
            v61 = 0i64;
          }
          else
          {
            v61 = v19;
            if( v53 < 0xF )
            {
              *v19++ = v53;
LABEL_90:
              v30 = v59;
LABEL_91:
              if( v22 <= 0 )
              {
                *v21 = 2 * v22 + 1;
                v22 = 1;
                v21 = v19;
                v62 = (INT64)v19;
                v19 += 4;
              }
              else
              {
                v22 = 2 * v22 + 1;
              }
              if( (unsigned __int64)v19 < v30 )
              {
                LOWORD(v13) = v71;
                v25 = v64;
                v31 = v60;
                v26 = (char *)v63;
                goto LABEL_18;
              }
              goto LABEL_97;
            }
            *v19++ = 15;
          }
          v55 = v45 - 25;
          if( v45 - 25 >= 0xFF )
          {
            v56 = v55 + 22;
            *v19 = -1;
            if( v56 >= 0x10000 )
            {
              *(_WORD *)(v19 + 1) = 0;
              *(_DWORD *)(v19 + 3) = v56;
              v19 += 7;
            }
            else
            {
              *(_WORD *)(v19 + 1) = v56;
              v19 += 3;
            }
          }
          else
          {
            *v19++ = v55;
          }
          goto LABEL_90;
        }
        v38 = (v37 & 0xFFFFFF) == 0;
        v39 = v71;
        if( v38 )
          goto LABEL_35;
        v36 = *(_QWORD *)(v31 + 8i64 * (((_WORD)v36 - v71) & 0x3FFF));
        if( v36 >= (unsigned __int64)v32 )
        {
          v40 = *(_DWORD *)v36 ^ v35;
          if( !v40 )
            goto LABEL_37;
          if( (v40 & 0xFFFFFF) == 0 )
            goto LABEL_35;
          v36 = *(_QWORD *)(v31 + 8i64 * (((_WORD)v36 - v71) & 0x3FFF));
          if( v36 >= (unsigned __int64)v32 )
          {
            v41 = *(_DWORD *)v36 ^ v35;
            if( !v41 )
              goto LABEL_37;
            if( (v41 & 0xFFFFFF) == 0 )
            {
LABEL_35:
              v43 = v60;
              v32 = v20 - 0x2000;
              v14 = (__int64)&v20[-v36];
              v44 = 0i64;
              v45 = 3i64;
              goto LABEL_75;
            }
          }
        }
      }
      *v19++ = v35;
      ++v20;
      ++v32;
      v42 = v19;
      if( v22 <= 0 )
      {
        v19 += 4;
        *v21 = 2 * v22;
        v22 = 1;
        v21 = v42;
        if( (unsigned __int64)v19 >= v30 )
          goto LABEL_97;
        v62 = (INT64)v42;
        v26 = (char *)v63;
      }
      else
      {
        v26 = (char *)v63;
        v22 *= 2;
      }
    }
    LOWORD(v13) = v71;
    v17 = v9 - 5;
    v18 = a9;
    v16 = result;
    v23 = v65;
    v24 = v66;
    if( (unsigned __int64)v20 < v9 - 5 )
      continue;
    break;
  }
LABEL_97:
  if( (unsigned __int64)v20 >= v9 )
  {
LABEL_103:
    if( (unsigned __int64)v19 >= v67 )
      return 3221225507i64;
    for( ; v22 > 0; v22 = 2 * v22 + 1 )
      ;
    v58 = (_DWORD)v19 - v72;
    *v21 = 2 * v22 + 1;
    if( v58 < 8 )
      v58 = 8;
    *(_DWORD *)a5 = v58;
    return 0i64;
  }
  else
  {
    while( (unsigned __int64)v19 < v67 )
    {
      v57 = *v20++;
      *v19++ = v57;
      if( v22 <= 0 )
      {
        *v21 = 2 * v22;
        v22 = 1;
        v21 = v19;
        v19 += 4;
      }
      else
      {
        v22 *= 2;
      }
      if( (unsigned __int64)v20 >= v9 )
        goto LABEL_103;
    }
    return 3221225507i64;
  }
}

Referenced by:

RtlCompressBufferProgress
RtlCompressBufferXpressLz