RtlCompressBufferXpressLzStandard

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

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

Referenced by:

RtlCompressBufferProgress
RtlCompressBufferXpressLz