RtlCompressBufferXpressLzMax

NTSTATUS __stdcall RtlCompressBufferXpressLzMax(
        UINT8 *UncompressedBuffer,
        UINT64 UncompressedBufferSize,
        UINT8 *CompressedBuffer,
        UINT64 CompressedBufferSize,
        UINT64 *FinalCompressedSize,
        _XPRESS_LZ_WORKSPACE_MAX *Workspace,
        VOID *Callback,
        VOID *a8,
        VOID *CallbackContext,
        UINT64 ProgressBytes){
  UINT8 *v10; 
  UINT8 *v11; 
  unsigned int v12; 
  UINT8 *v14; 
  __int64 v15; 
  _XPRESS_LZ_WORKSPACE_MAX *v17; 
  unsigned __int64 v18; 
  unsigned int v19; 
  UINT8 *v20; 
  UINT8 *v21; 
  UINT8 *v22; 
  int v23; 
  __int16 v24; 
  UINT8 *v25; 
  unsigned __int64 v26; 
  UINT8 *v27; 
  __int64 v28; 
  _XPRESS_LZ_WORKSPACE_MAX *v29; 
  unsigned __int64 v30; 
  unsigned __int64 v31; 
  _XPRESS_LZ_WORKSPACE_MAX *v32; 
  UINT8 *v33; 
  __int16 v34; 
  unsigned __int64 XpressCallback; 
  int v36; 
  unsigned __int64 v37; 
  int v38; 
  bool v39; 
  __int16 v40; 
  int v41; 
  int v42; 
  UINT8 *v43; 
  _XPRESS_LZ_WORKSPACE_MAX *v44; 
  __int64 v45; 
  unsigned __int64 v46; 
  UINT8 *v47; 
  UINT8 *v48; 
  UINT8 *v49; 
  int v50; 
  int v51; 
  signed __int64 v52; 
  __int64 v53; 
  unsigned __int64 v54; 
  UINT8 v55; 
  unsigned __int64 v56; 
  unsigned __int64 v57; 
  UINT8 v58; 
  unsigned int v59; 
  UINT8 *v60; 
  _XPRESS_LZ_WORKSPACE_MAX *v61; 
  UINT8 *v62; 
  UINT8 *v63; 
  unsigned __int64 v64; 
  unsigned __int64 v65; 
  __int16 v66; 
  UINT8 *v67; 
  UINT8 *v68; 
  __int64 v69[2]; 
  unsigned int v70; 
  int v71; 
  __int16 v72; 
  int v73; 

  v73 = (int)CompressedBuffer;
  v72 = (__int16)UncompressedBuffer;
  v10 = &UncompressedBuffer[(unsigned int)UncompressedBufferSize];
  v11 = &CompressedBuffer[(unsigned int)CompressedBufferSize];
  v12 = UncompressedBufferSize;
  v71 = 0;
  v68 = v11;
  v14 = UncompressedBuffer;
  v15 = 0i64;
  if( (unsigned int)CompressedBufferSize < 0x40 || (unsigned int)UncompressedBufferSize < 8 )
    return -1073741789;
  if( (unsigned __int64)UncompressedBuffer <= 0x2001 )
    return -1073741637;
  v17 = Workspace;
  memset(Workspace, 0i64, 0x40000u);
  v62 = 0i64;
  v60 = v11 - 41;
  v18 = (unsigned __int64)(v10 - 5);
  if( !Callback || (v19 = (unsigned int)CallbackContext, (unsigned int)CallbackContext > v12) )
  {
    v19 = v12;
    LODWORD(CallbackContext) = v12;
  }
  v69[0] = (__int64)Callback;
  v20 = CompressedBuffer + 5;
  v21 = v14 + 1;
  v69[1] = (__int64)a8;
  v22 = CompressedBuffer;
  v23 = 2;
  CompressedBuffer[4] = *v14;
  v24 = 0;
  v63 = CompressedBuffer;
  v25 = v14;
  v70 = v19;
  v67 = v14;
  while( 2 )
  {
    v26 = v18;
    if( (unsigned __int64)(v25 + 0x2000) <= v18 )
      v26 = (unsigned __int64)(v25 + 0x2000);
    v27 = &v21[v19];
    v65 = v26;
    if( v26 < (unsigned __int64)v27 )
      v27 = (UINT8 *)v26;
    v28 = v24 & 0x3FFF;
    v64 = (unsigned __int64)v27;
    v66 = v28;
    if( (unsigned __int64)v25 < v26 )
    {
      v29 = &v17[2 * v28 + 0x10000];
      do
      {
        v29 += 2;
        LOWORD(v28) = v28 + 1;
        v30 = (unsigned __int16)XpressHashFunction[v25[2] + 512] ^ (unsigned __int16)XpressHashFunction[*v25] ^ (unsigned __int64)(unsigned __int16)XpressHashFunction[v25[1] + 256];
        *((_QWORD *)v29 - 1) = *(_QWORD *)&v17[2 * v30];
        *(_QWORD *)&v17[2 * v30] = v25++;
      }
      while( (unsigned __int64)v25 < v26 );
      v67 = v25;
      v66 = v28;
    }
    v31 = (unsigned __int64)v60;
    v32 = v17 + 0x10000;
    v61 = v17 + 0x10000;
LABEL_18:
    v33 = v21 - 0x2000;
    v34 = 0x2000 - (_WORD)v14;
    while( 1 )
    {
      if( v21 < v27 )
        goto LABEL_22;
      if( (unsigned __int64)v21 >= v26 )
        break;
      XpressCallback = RtlpMakeXpressCallback((__int64)v69, v26, (__int64)v21);
      v22 = v63;
      v26 = v65;
      v32 = v61;
      v31 = (unsigned __int64)v60;
      v64 = XpressCallback;
LABEL_22:
      v36 = *(_DWORD *)v21;
      v37 = *(_QWORD *)&v32[2 * ((v34 + (_WORD)v33) & 0x3FFF)];
      if( v37 >= (unsigned __int64)v33 )
      {
        v38 = *(_DWORD *)v37 ^ v36;
        if( !v38 )
        {
          v40 = v72;
LABEL_37:
          v44 = v61;
          v45 = 0i64;
          v46 = 3i64;
LABEL_38:
          v47 = v21;
          v48 = v21 + 36;
          v49 = v21 + 4;
          v37 += 4i64;
          if( v48 >= v10 )
          {
LABEL_49:
            while( v49 < v10 )
            {
              if( *v49 != *(_BYTE *)v37 )
                break;
              ++v49;
              ++v37;
            }
          }
          else
          {
            while( 1 )
            {
              v50 = *(_DWORD *)v49;
              v51 = *(_DWORD *)v37;
              if( *(_DWORD *)v49 != *(_DWORD *)v37 )
                break;
              v50 = *((_DWORD *)v49 + 1);
              v51 = *(_DWORD *)(v37 + 4);
              if( v50 != v51 )
              {
                v49 += 4;
                v37 += 4i64;
                break;
              }
              v50 = *((_DWORD *)v49 + 2);
              v51 = *(_DWORD *)(v37 + 8);
              if( v50 != v51 )
              {
                v49 += 8;
                v37 += 8i64;
                break;
              }
              v50 = *((_DWORD *)v49 + 3);
              v51 = *(_DWORD *)(v37 + 12);
              if( v50 != v51 )
              {
                v49 += 12;
                v37 += 12i64;
                break;
              }
              v50 = *((_DWORD *)v49 + 4);
              v51 = *(_DWORD *)(v37 + 16);
              if( v50 != v51 )
              {
                v49 += 16;
                v37 += 16i64;
                break;
              }
              v50 = *((_DWORD *)v49 + 5);
              v51 = *(_DWORD *)(v37 + 20);
              if( v50 != v51 )
              {
                v49 += 20;
                v37 += 20i64;
                break;
              }
              v50 = *((_DWORD *)v49 + 6);
              v51 = *(_DWORD *)(v37 + 24);
              if( v50 != v51 )
              {
                v49 += 24;
                v37 += 24i64;
                break;
              }
              v50 = *((_DWORD *)v49 + 7);
              v51 = *(_DWORD *)(v37 + 28);
              if( v50 != v51 )
              {
                v49 += 28;
                v37 += 28i64;
                break;
              }
              v49 += 32;
              v37 += 32i64;
              if( v49 + 32 >= v10 )
              {
                v40 = v72;
                goto LABEL_49;
              }
            }
            if( (_BYTE)v50 == (_BYTE)v51 )
            {
              if( v49[1] != *(_BYTE *)(v37 + 1) )
              {
                ++v49;
                ++v37;
                goto LABEL_63;
              }
              v40 = v72;
              if( v49[2] == *(_BYTE *)(v37 + 2) )
              {
                v49 += 3;
                v37 += 3i64;
              }
              else
              {
                v49 += 2;
                v37 += 2i64;
              }
            }
            else
            {
LABEL_63:
              v40 = v72;
            }
          }
          v52 = v49 - v47;
          if( v49 - v47 <= v46 )
          {
            v45 += v52;
          }
          else
          {
            v46 = v49 - v47;
            v15 = (__int64)&v49[-v37];
            if( v37 > (unsigned __int64)v47 )
            {
              v22 = v63;
              v21 = v47;
              v31 = (unsigned __int64)v60;
              goto LABEL_67;
            }
          }
          v22 = v63;
          v21 = v47;
          v31 = (unsigned __int64)v60;
          LOWORD(v37) = v37 - v52;
          while( (unsigned __int64)++v45 < 0x18 )
          {
LABEL_75:
            v37 = *(_QWORD *)&v44[2 * (((_WORD)v37 - v40) & 0x3FFF)];
            if( v37 < (unsigned __int64)v33 )
              break;
            if( v36 == *(_DWORD *)v37 )
              goto LABEL_38;
          }
LABEL_67:
          v21 += v46;
          v53 = 8 * v15 - 8;
          if( v46 - 3 < 7 )
          {
            v15 = v46 - 3 + v53;
            *(_WORD *)v20 = v15;
            v20 += 2;
            goto LABEL_91;
          }
          v15 = v53 | 7;
          *(_WORD *)v20 = v15;
          v54 = v46 - 10;
          v20 += 2;
          if( v62 )
          {
            v55 = *v62;
            if( v54 < 0xF )
            {
              *v62 = v55 | (16 * v54);
              v62 = 0i64;
              goto LABEL_90;
            }
            *v62 = v55 | 0xF0;
            v62 = 0i64;
          }
          else
          {
            v62 = v20;
            if( v54 < 0xF )
            {
              *v20++ = v54;
LABEL_90:
              v31 = (unsigned __int64)v60;
LABEL_91:
              if( v23 <= 0 )
              {
                *(_DWORD *)v22 = 2 * v23 + 1;
                v23 = 1;
                v22 = v20;
                v63 = v20;
                v20 += 4;
              }
              else
              {
                v23 = 2 * v23 + 1;
              }
              if( (unsigned __int64)v20 < v31 )
              {
                LOWORD(v14) = v72;
                v26 = v65;
                v32 = v61;
                v27 = (UINT8 *)v64;
                goto LABEL_18;
              }
              goto LABEL_97;
            }
            *v20++ = 15;
          }
          v56 = v46 - 25;
          if( v46 - 25 >= 0xFF )
          {
            v57 = v56 + 22;
            *v20 = -1;
            if( v57 >= 0x10000 )
            {
              *(_WORD *)(v20 + 1) = 0;
              *(_DWORD *)(v20 + 3) = v57;
              v20 += 7;
            }
            else
            {
              *(_WORD *)(v20 + 1) = v57;
              v20 += 3;
            }
          }
          else
          {
            *v20++ = v56;
          }
          goto LABEL_90;
        }
        v39 = (v38 & 0xFFFFFF) == 0;
        v40 = v72;
        if( v39 )
          goto LABEL_35;
        v37 = *(_QWORD *)&v32[2 * (((_WORD)v37 - v72) & 0x3FFF)];
        if( v37 >= (unsigned __int64)v33 )
        {
          v41 = *(_DWORD *)v37 ^ v36;
          if( !v41 )
            goto LABEL_37;
          if( (v41 & 0xFFFFFF) == 0 )
            goto LABEL_35;
          v37 = *(_QWORD *)&v32[2 * (((_WORD)v37 - v72) & 0x3FFF)];
          if( v37 >= (unsigned __int64)v33 )
          {
            v42 = *(_DWORD *)v37 ^ v36;
            if( !v42 )
              goto LABEL_37;
            if( (v42 & 0xFFFFFF) == 0 )
            {
LABEL_35:
              v44 = v61;
              v33 = v21 - 0x2000;
              v15 = (__int64)&v21[-v37];
              v45 = 0i64;
              v46 = 3i64;
              goto LABEL_75;
            }
          }
        }
      }
      *v20++ = v36;
      ++v21;
      ++v33;
      v43 = v20;
      if( v23 <= 0 )
      {
        v20 += 4;
        *(_DWORD *)v22 = 2 * v23;
        v23 = 1;
        v22 = v43;
        if( (unsigned __int64)v20 >= v31 )
          goto LABEL_97;
        v63 = v43;
        v27 = (UINT8 *)v64;
      }
      else
      {
        v27 = (UINT8 *)v64;
        v23 *= 2;
      }
    }
    LOWORD(v14) = v72;
    v18 = (unsigned __int64)(v10 - 5);
    v19 = (unsigned int)CallbackContext;
    v17 = Workspace;
    v24 = v66;
    v25 = v67;
    if( v21 < v10 - 5 )
      continue;
    break;
  }
LABEL_97:
  if( v21 >= v10 )
  {
LABEL_103:
    if( v20 >= v68 )
      return -1073741789;
    for( ; v23 > 0; v23 = 2 * v23 + 1 )
      ;
    v59 = (_DWORD)v20 - v73;
    *(_DWORD *)v22 = 2 * v23 + 1;
    if( v59 < 8 )
      v59 = 8;
    *(_DWORD *)FinalCompressedSize = v59;
    return 0;
  }
  else
  {
    while( v20 < v68 )
    {
      v58 = *v21++;
      *v20++ = v58;
      if( v23 <= 0 )
      {
        *(_DWORD *)v22 = 2 * v23;
        v23 = 1;
        v22 = v20;
        v20 += 4;
      }
      else
      {
        v23 *= 2;
      }
      if( v21 >= v10 )
        goto LABEL_103;
    }
    return -1073741789;
  }
}

Referenced by:

RtlCompressBufferProgress
RtlCompressBufferXpressLz