RtlCompressBufferXpressLzStandard

VOID __fastcall RtlCompressBufferXpressLzStandard(
        _BYTE *a1,
        UINT64 a2,
        _DWORD *a3,
        UINT64 a4,
        INT64 FinalCompressedSize,
        INT64 Workspace,
        INT64 Callback,
        INT64 CallbackContext,
        INT64 ProgressBytes){
  char *v9; 
  unsigned __int8 *v10; 
  char *v11; 
  UINT64 v13; 
  unsigned __int64 v14; 
  int v15; 
  char *v16; 
  unsigned __int8 *v17; 
  unsigned __int8 *XpressCallback; 
  char v19; 
  int v20; 
  char *v21; 
  _BYTE *v22; 
  _DWORD *v23; 
  INT64 v24; 
  __int64 v25; 
  unsigned __int8 *v26; 
  __int64 v27; 
  char *v28; 
  __int64 v29; 
  unsigned __int8 *v30; 
  __int64 v31; 
  __int64 v32; 
  __int64 v33; 
  __int64 v34; 
  int v35; 
  int v36; 
  unsigned __int64 v37; 
  __int16 v38; 
  __int64 v39; 
  unsigned __int8 *v40; 
  unsigned __int64 v41; 
  __int64 v42; 
  unsigned __int8 *v43; 
  unsigned __int64 v44; 
  unsigned __int64 v45; 
  unsigned __int8 *v46; 
  char v47; 
  __int64 v48; 
  __int64 v49; 
  unsigned __int64 v50; 
  char v51; 
  unsigned int v52; 
  unsigned __int64 v53; 
  UINT64 v54; 
  char *v55; 
  char *v56; 
  char *v57; 
  UINT64 v58; 
  unsigned __int8 *v59; 
  char *v60; 
  INT64 v61[2]; 
  int v62; 
  int v63; 
  unsigned __int8 *v64; 
  unsigned __int8 v65; 
  v9 = (char *)a3;
  v10 = &a1[(unsigned int)a2];
  v63 = 0;
  v11 = &v9[(unsigned int)a4];
  v59 = v10;
  v60 = v11;
  if( (unsigned int)a4 < 0x40 || (unsigned int)a2 < 8 )
    return;
  v13 = (UINT64)(v10 - 38);
  v14 = (unsigned __int64)(v11 - 41);
  v55 = v11 - 41;
  v58 = (UINT64)(v10 - 38);
  v56 = 0i64;
  if( !Callback || (v15 = ProgressBytes, (unsigned int)ProgressBytes > (unsigned int)a2) )
    v15 = a2;
  v16 = v9 + 5;
  v17 = a1 + 1;
  XpressCallback = &a1[v15];
  v61[1] = CallbackContext;
  v19 = *a1;
  v61[0] = Callback;
  v20 = 2;
  if( v13 < (unsigned __int64)XpressCallback )
    XpressCallback = v10 - 38;
  v62 = v15;
  v64 = XpressCallback;
  v21 = v9;
  v9[4] = v19;
  if( (unsigned int)a2 < 0x40 )
    goto LABEL_84;
  v22 = a1;
  v23 = a3;
  v57 = (char *)a3;
  memset64((void *)Workspace, (unsigned __int64)v22, 0xAF6ui64);
  memset64((void *)(Workspace + 22448), (unsigned __int64)v22, 0x12EEui64);
  while( 1 )
  {
    while( 1 )
    {
      while( 1 )
      {
        v24 = Workspace + 8i64 * *v17;
        v25 = v17[2] + 4i64 * v17[1];
        v26 = *(unsigned __int8 **)(v24 + 16 * v25);
        *(_QWORD *)(v24 + 16 * v25) = v17;
        v27 = *v17;
        if( *(_WORD *)v26 != *(_WORD *)v17 || v26[2] != v17[2] || v17 - v26 >= 0x2000 )
          break;
        v29 = v26[3];
        v30 = v17;
        v31 = v17[3];
        if( (_BYTE)v31 != (_BYTE)v29 )
        {
          v39 = v27 + 2 * v25;
          v40 = *(unsigned __int8 **)(Workspace + 8 * (v39 + v31) + 22448);
          *(_QWORD *)(Workspace + 8 * (v39 + v29) + 22448) = v26;
          if( v17 - v40 >= 0x2000 )
            goto LABEL_35;
          v41 = *(unsigned int *)v17;
          if( (_DWORD)v41 != *(_DWORD *)v40 )
            goto LABEL_35;
          v26 = v40;
          *(_QWORD *)(Workspace + 8 * (v39 + (v41 >> 24)) + 22448) = v17;
        }
        v32 = v26[4];
        v33 = v17[4];
        if( (_BYTE)v33 != (_BYTE)v32 )
        {
          v42 = 2
              * ((unsigned __int8)__ROR1__(v17[1] ^ __ROL1__(*v17 + v17[3], 3), 1)
               + 4i64 * (unsigned __int8)__ROL1__(*v17 ^ __ROR1__(v17[1] + v17[2] + 97, 1), 3));
          v43 = *(unsigned __int8 **)(Workspace + 8 * (v42 + v33) + 22448);
          *(_QWORD *)(Workspace + 8 * (v42 + v32) + 22448) = v26;
          if( v17 - v43 >= 0x2000
            || *(_DWORD *)v17 != *(_DWORD *)v43
            || (v48 = v17[4], (_BYTE)v48 != v43[4])
            || v17 == v43 )
          {
            v17 += 4;
            LOWORD(v26) = (_WORD)v26 + 4;
            goto LABEL_25;
          }
          v26 = v43;
          *(_QWORD *)(Workspace + 8 * (v42 + v48) + 22448) = v17;
        }
        v34 = v26[5];
        v65 = v17[5];
        if( v65 != (_BYTE)v34 )
        {
          v45 = 2
              * ((v17[2] ^ (unsigned __int64)(unsigned __int8)__ROL1__(*v17, v17[4]))
               + 4
               * ((unsigned __int8)__ROL1__(v17[4] ^ (__ROR1__(*v17, 1) + 69), 3)
                + (unsigned __int64)(unsigned __int8)__ROR1__(v17[1] ^ __ROL1__(v17[3], 3), 1)));
          v46 = *(unsigned __int8 **)(Workspace + 8 * (v45 + v65) + 22448);
          *(_QWORD *)(Workspace + 8 * (v45 + v34) + 22448) = v26;
          if( v17 - v46 >= 0x2000
            || *(_DWORD *)v17 != *(_DWORD *)v46
            || v17[4] != v46[4]
            || (v49 = v17[5], (_BYTE)v49 != v46[5])
            || v17 == v46 )
          {
            v17 += 5;
            LOWORD(v26) = (_WORD)v26 + 5;
            goto LABEL_25;
          }
          v26 = v46;
          *(_QWORD *)(Workspace + 8 * (v45 + v49) + 22448) = v17;
        }
        v17 += 6;
        v26 += 6;
        if( (unsigned __int64)v17 >= v58 )
        {
LABEL_44:
          while( v17 < v59 )
          {
            if( *v17 != *v26 )
              break;
            ++v17;
            ++v26;
          }
          goto LABEL_25;
        }
        while( 1 )
        {
          v35 = *(_DWORD *)v17;
          v36 = *(_DWORD *)v26;
          if( *(_DWORD *)v17 != *(_DWORD *)v26 )
            break;
          v36 = *((_DWORD *)v26 + 1);
          v35 = *((_DWORD *)v17 + 1);
          if( v35 != v36 )
          {
            v17 += 4;
            v26 += 4;
            break;
          }
          v36 = *((_DWORD *)v26 + 2);
          v35 = *((_DWORD *)v17 + 2);
          if( v35 != v36 )
          {
            v17 += 8;
            v26 += 8;
            break;
          }
          v36 = *((_DWORD *)v26 + 3);
          v35 = *((_DWORD *)v17 + 3);
          if( v35 != v36 )
          {
            v17 += 12;
            v26 += 12;
            break;
          }
          v36 = *((_DWORD *)v26 + 4);
          v35 = *((_DWORD *)v17 + 4);
          if( v35 != v36 )
          {
            v17 += 16;
            v26 += 16;
            break;
          }
          v36 = *((_DWORD *)v26 + 5);
          v35 = *((_DWORD *)v17 + 5);
          if( v35 != v36 )
          {
            v17 += 20;
            v26 += 20;
            break;
          }
          v36 = *((_DWORD *)v26 + 6);
          v35 = *((_DWORD *)v17 + 6);
          if( v35 != v36 )
          {
            v17 += 24;
            v26 += 24;
            break;
          }
          v36 = *((_DWORD *)v26 + 7);
          v35 = *((_DWORD *)v17 + 7);
          if( v35 != v36 )
          {
            v17 += 28;
            v26 += 28;
            break;
          }
          v17 += 32;
          v26 += 32;
          if( (unsigned __int64)v17 >= v58 )
            goto LABEL_44;
        }
        if( (_BYTE)v35 != (_BYTE)v36 )
          goto LABEL_25;
        if( v17[1] != v26[1] )
        {
          ++v17;
          LOWORD(v26) = (_WORD)v26 + 1;
LABEL_25:
          v14 = (unsigned __int64)v55;
          XpressCallback = v64;
          goto LABEL_26;
        }
        XpressCallback = v64;
        v14 = (unsigned __int64)v55;
        if( v17[2] != v26[2] )
        {
          v17 += 2;
          LOWORD(v26) = (_WORD)v26 + 2;
          goto LABEL_26;
        }
LABEL_35:
        v17 += 3;
        LOWORD(v26) = (_WORD)v26 + 3;
LABEL_26:
        v37 = v17 - v30 - 3;
        v38 = 8 * ((_WORD)v17 - (_WORD)v26) - 8;
        if( v37 < 7 )
        {
          *(_WORD *)v16 = v37 + v38;
          v16 += 2;
          goto LABEL_28;
        }
        *(_WORD *)v16 = v38 | 7;
        v44 = v17 - v30 - 10;
        v16 += 2;
        if( !v56 )
        {
          v56 = v16;
          if( v44 < 0xF )
          {
            *v16++ = v44;
            goto LABEL_28;
          }
          *v16++ = 15;
LABEL_74:
          v50 = v17 - v30 - 25;
          if( v50 >= 0xFF )
          {
            v53 = v50 + 22;
            *v16 = -1;
            if( v53 >= 0x10000 )
            {
              *(_WORD *)(v16 + 1) = 0;
              *(_DWORD *)(v16 + 3) = v53;
              v16 += 7;
            }
            else
            {
              *(_WORD *)(v16 + 1) = v53;
              v16 += 3;
            }
          }
          else
          {
            *v16++ = v50;
          }
          goto LABEL_28;
        }
        v47 = *v56;
        if( v44 >= 0xF )
        {
          *v56 = v47 | 0xF0;
          v56 = 0i64;
          goto LABEL_74;
        }
        *v56 = v47 | (16 * v44);
        v56 = 0i64;
LABEL_28:
        v21 = v57;
        if( v20 <= 0 )
        {
          *(_DWORD *)v57 = 2 * v20 + 1;
          v20 = 1;
          v21 = v16;
          v57 = v16;
          v16 += 4;
        }
        else
        {
          v20 = 2 * v20 + 1;
        }
        if( v17 >= XpressCallback )
        {
          if( (unsigned __int64)v17 >= v58 )
            goto LABEL_83;
          XpressCallback = (unsigned __int8 *)RtlpMakeXpressCallback((INT64)v61, v58, (INT64)v17);
          v64 = XpressCallback;
        }
        v13 = v58;
        if( (unsigned __int64)v16 >= v14 )
          goto LABEL_83;
        v23 = v57;
      }
      *v16++ = v27;
      ++v17;
      v28 = v16;
      if( v20 <= 0 )
        break;
      v20 *= 2;
    }
    v16 += 4;
    *v23 = 2 * v20;
    v20 = 1;
    if( v17 >= XpressCallback )
      break;
LABEL_58:
    v21 = v28;
    if( (unsigned __int64)v16 >= v14 )
      goto LABEL_83;
    v23 = v28;
    v57 = v28;
  }
  v21 = v28;
  if( (unsigned __int64)v17 < v13 )
  {
    v54 = RtlpMakeXpressCallback((INT64)v61, v13, (INT64)v17);
    v13 = v58;
    XpressCallback = (unsigned __int8 *)v54;
    v64 = (unsigned __int8 *)v54;
    goto LABEL_58;
  }
LABEL_83:
  v10 = v59;
  v11 = v60;
  LODWORD(v9) = (_DWORD)a3;
LABEL_84:
  if( v17 >= v10 )
  {
LABEL_89:
    if( v16 < v11 )
    {
      for( ; v20 > 0; v20 = 2 * v20 + 1 )
        ;
      v52 = (_DWORD)v16 - (_DWORD)v9;
      *(_DWORD *)v21 = 2 * v20 + 1;
      *(_DWORD *)FinalCompressedSize = v52;
      if( v52 < 8 )
        *(_DWORD *)FinalCompressedSize = 8;
    }
  }
  else
  {
    while( v16 < v11 )
    {
      v51 = *v17++;
      *v16++ = v51;
      if( v20 <= 0 )
      {
        *(_DWORD *)v21 = 2 * v20;
        v20 = 1;
        v21 = v16;
        v16 += 4;
      }
      else
      {
        v20 *= 2;
      }
      if( v17 >= v10 )
        goto LABEL_89;
    }
  }
}

Referenced by:

RtlCompressBufferProgress
RtlCompressBufferXpressLz