RtlCompressBufferXpressHuffMax

VOID __stdcall RtlCompressBufferXpressHuffMax(
        UINT8 *UncompressedBuffer,
        UINT64 UncompressedBufferSize,
        UINT8 *CompressedBuffer,
        UINT64 CompressedBufferSize){
  unsigned int v5; 
  UINT8 *v7; 
  CHAR *v8; 
  unsigned __int8 *v9; 
  unsigned __int64 v10; 
  __int64 v11; 
  UINT8 *v12; 
  unsigned __int8 *v13; 
  int v14; 
  unsigned __int64 v15; 
  UINT64 v16; 
  unsigned __int8 v17; 
  UINT8 *v18; 
  __int64 v19; 
  unsigned __int64 v20; 
  __int64 v21; 
  UINT64 XpressCallback; 
  int v23; 
  char *v24; 
  int v25; 
  char *v26; 
  UINT8 *v27; 
  UINT8 *v28; 
  __int64 v29; 
  unsigned __int64 v30; 
  int v31; 
  int v32; 
  _DWORD *v33; 
  UINT8 *v34; 
  UINT8 *v35; 
  int v36; 
  int v37; 
  unsigned __int64 v38; 
  UINT8 *v39; 
  unsigned __int64 v40; 
  __int64 v41; 
  _BYTE *v42; 
  unsigned __int64 v43; 
  char v44; 
  unsigned __int8 v45; 
  unsigned __int64 v46; 
  _WORD *v47; 
  __int64 v48; 
  unsigned __int64 v49; 
  unsigned __int8 v50; 
  int v51; 
  CHAR *v52; 
  INT64 v53; 
  UINT8 *v54; 
  UINT64 v55; 
  unsigned __int64 v56; 
  __int64 v57; 
  __int64 v58; 
  UINT8 *v59; 
  UINT8 *v60; 
  UINT8 *v61; 
  INT64 v62[2]; 
  unsigned int v63; 
  int v64; 
  char *v65; 
  int v66; 
  _DWORD *v67; 
  INT64 result; 
  __int64 v69; 
  __int64 v70; 
  unsigned int v71; 
  v66 = (int)CompressedBuffer;
  v5 = UncompressedBufferSize;
  v64 = 0;
  v54 = &UncompressedBuffer[(unsigned int)UncompressedBufferSize];
  v61 = &CompressedBuffer[(unsigned int)CompressedBufferSize];
  if( (unsigned int)CompressedBufferSize >= 0x12C && (unsigned __int64)UncompressedBuffer > 0x10001 )
  {
    memset(result, 0i64);
    v7 = UncompressedBuffer;
    v59 = CompressedBuffer;
    v8 = (CHAR *)CompressedBuffer;
    *(_QWORD *)(result + 0x40000) = 0i64;
    if( v69 && v71 <= v5 )
      v5 = v71;
    else
      v71 = v5;
    v62[0] = v69;
    v9 = (unsigned __int8 *)(result + 1342240);
    v62[1] = v70;
    v63 = v5;
    v65 = 0i64;
    while( 1 )
    {
      v57 = 0i64;
      v58 = 0i64;
      memset(result + 1339936, 0i64);
      v10 = (unsigned __int64)v54;
      v11 = v5;
      v12 = v54;
      v13 = v9 + 4;
      if( v7 + 0x10000 <= v54 )
        v12 = v7 + 0x10000;
      v14 = 1;
      v15 = (unsigned __int64)&v7[v11];
      v60 = v12;
      v16 = (UINT64)(v12 - 5);
      v55 = (UINT64)(v12 - 5);
      if( (unsigned __int64)(v12 - 5) < v15 )
        v15 = (unsigned __int64)(v12 - 5);
      v56 = v15;
      if( v7 == UncompressedBuffer )
      {
        v14 = 2;
        ++*(_DWORD *)(result + 4i64 * *v7 + 1339936);
        v17 = *v7++;
        *v13 = v17;
        v13 = v9 + 5;
      }
      if( (unsigned __int64)v7 >= v16 )
        goto LABEL_90;
      v18 = v7;
      v19 = (v7 - UncompressedBuffer) % 0x20000;
      do
      {
        v20 = (unsigned __int16)XpressHashFunction[*v18] ^ (unsigned __int16)word_14003A320[v18[2]] ^ (unsigned __int64)(unsigned __int16)word_14003A120[v18[1]];
        v21 = *(_QWORD *)(result + 8 * v20);
        *(_QWORD *)(result + 8 * v20) = v18++;
        *(_QWORD *)(result + 8 * v19 + 0x40000) = v21;
        v19 = ((_DWORD)v19 + 1) & 0x1FFFF;
      }
      while( (unsigned __int64)v18 < v16 );
LABEL_17:
      v10 = (unsigned __int64)v54;
      while( (unsigned __int64)v7 < v15 )
      {
LABEL_21:
        v23 = *(_DWORD *)v7;
        v24 = *(char **)(result + 8 * ((v7 - UncompressedBuffer) % 0x20000) + 0x40000);
        if( v24 + 0x10000 > (char *)v7 )
        {
          v25 = *(_DWORD *)v24 ^ v23;
          if( !v25 )
            goto LABEL_23;
          if( (v25 & 0xFFFFFF) == 0 )
            goto LABEL_31;
          v24 = *(char **)(result + 8 * ((v24 - (char *)UncompressedBuffer) % 0x20000) + 0x40000);
          if( v24 + 0x10000 > (char *)v7 )
          {
            v31 = *(_DWORD *)v24 ^ v23;
            if( !v31 )
              goto LABEL_23;
            if( (v31 & 0xFFFFFF) == 0 )
              goto LABEL_31;
            v24 = *(char **)(result + 8 * ((v24 - (char *)UncompressedBuffer) % 0x20000) + 0x40000);
            if( v24 + 0x10000 > (char *)v7 )
            {
              v32 = *(_DWORD *)v24 ^ v23;
              if( !v32 )
              {
LABEL_23:
                v26 = v65;
                v27 = v7 - 0x10000;
                v28 = v7;
                v29 = 0i64;
                v30 = 3i64;
                goto LABEL_35;
              }
              if( (v32 & 0xFFFFFF) == 0 )
              {
LABEL_31:
                v65 = v24;
                v28 = v7;
                v27 = v7 - 0x10000;
                v26 = v24;
                v29 = 0i64;
                v30 = 3i64;
                while( 1 )
                {
                  v24 = *(char **)(result + 8 * ((v24 - (char *)UncompressedBuffer) % 0x20000) + 0x40000);
                  if( v24 <= (char *)v27 )
                  {
LABEL_69:
                    v7 = &v28[v30];
                    v40 = v28 - (UINT8 *)v26;
                    if( v30 == 3 && v40 > 0x1000 )
                    {
                      v16 = v55;
                      v7 = v28;
                      v15 = v56;
                      goto LABEL_72;
                    }
                    if( v40 < 0x100 )
                      v41 = *((unsigned __int8 *)XpressHighBitIndexTable + v40);
                    else
                      v41 = *((unsigned __int8 *)XpressHighBitIndexTable + (v40 >> 8)) + 8i64;
                    v57 += v41;
                    v42 = v13 + 1;
                    v43 = v40 - (1i64 << v41);
                    v44 = 16 * v41;
                    if( v30 - 3 < 0xF )
                    {
                      v45 = v30 - 3 + v44;
                      *v13 = v45;
                      v47 = v13 + 1;
                    }
                    else
                    {
                      v45 = v44 + 15;
                      v46 = v30 - 18;
                      *v13 = v45;
                      v47 = v13 + 2;
                      if( v30 - 18 >= 0xFF )
                      {
                        v49 = v46 + 15;
                        *v42 = -1;
                        if( v49 >= 0x10000 )
                        {
                          *(_DWORD *)(v42 + 3) = v49;
                          *v47 = 0;
                          v48 = 7i64;
                          v47 = v42 + 7;
                        }
                        else
                        {
                          *v47 = v49;
                          v47 = v42 + 3;
                          v48 = 3i64;
                        }
                      }
                      else
                      {
                        *v42 = v46;
                        v48 = 1i64;
                      }
                      v58 += v48;
                    }
                    v16 = v55;
                    v15 = v56;
                    ++*(_DWORD *)(result + 4i64 * v45 + 1340960);
                    *v47 = v43;
                    v13 = (unsigned __int8 *)(v47 + 1);
                    if( v14 <= 0 )
                    {
                      *(_DWORD *)v9 = 2 * v14 + 1;
                      v14 = 1;
                      v9 = v13;
                      v13 += 4;
                    }
                    else
                    {
                      v14 = 2 * v14 + 1;
                    }
                    goto LABEL_17;
                  }
                  if( v23 == *(_DWORD *)v24 )
                    break;
LABEL_68:
                  if( (unsigned __int64)++v29 >= 0xC )
                    goto LABEL_69;
                }
                v7 = v28;
LABEL_35:
                v33 = v24 + 4;
                v34 = v7 + 36;
                v35 = v7 + 4;
                if( (unsigned __int64)v34 >= v10 )
                {
LABEL_46:
                  while( (unsigned __int64)v35 < v10 )
                  {
                    if( *v35 != *(_BYTE *)v33 )
                      break;
                    ++v35;
                    v33 = (_DWORD *)((char *)v33 + 1);
                  }
                }
                else
                {
                  while( 1 )
                  {
                    v36 = *(_DWORD *)v35;
                    v37 = *v33;
                    if( *(_DWORD *)v35 != *v33 )
                      goto LABEL_57;
                    v36 = *((_DWORD *)v35 + 1);
                    v37 = v33[1];
                    if( v36 != v37 )
                      break;
                    v36 = *((_DWORD *)v35 + 2);
                    v37 = v33[2];
                    if( v36 != v37 )
                    {
                      v35 += 8;
                      v33 += 2;
                      goto LABEL_57;
                    }
                    v36 = *((_DWORD *)v35 + 3);
                    v37 = v33[3];
                    if( v36 != v37 )
                    {
                      v35 += 12;
                      v33 += 3;
                      goto LABEL_57;
                    }
                    v36 = *((_DWORD *)v35 + 4);
                    v37 = v33[4];
                    if( v36 != v37 )
                    {
                      v35 += 16;
                      v33 += 4;
                      goto LABEL_57;
                    }
                    v36 = *((_DWORD *)v35 + 5);
                    v37 = v33[5];
                    if( v36 != v37 )
                    {
                      v35 += 20;
                      v33 += 5;
                      goto LABEL_57;
                    }
                    v36 = *((_DWORD *)v35 + 6);
                    v37 = v33[6];
                    if( v36 != v37 )
                    {
                      v35 += 24;
                      v33 += 6;
                      goto LABEL_57;
                    }
                    v36 = *((_DWORD *)v35 + 7);
                    v37 = v33[7];
                    if( v36 != v37 )
                    {
                      v35 += 28;
                      v33 += 7;
                      goto LABEL_57;
                    }
                    v35 += 32;
                    v33 += 8;
                    if( (unsigned __int64)(v35 + 32) >= v10 )
                    {
                      v26 = v65;
                      goto LABEL_46;
                    }
                  }
                  v35 += 4;
                  ++v33;
LABEL_57:
                  if( (_BYTE)v36 == (_BYTE)v37 )
                  {
                    v10 = (unsigned __int64)v54;
                    if( v35[1] != *((_BYTE *)v33 + 1) )
                    {
                      ++v35;
                      v33 = (_DWORD *)((char *)v33 + 1);
                      goto LABEL_60;
                    }
                    v26 = v65;
                    if( v35[2] == *((_BYTE *)v33 + 2) )
                    {
                      v35 += 3;
                      v33 = (_DWORD *)((char *)v33 + 3);
                    }
                    else
                    {
                      v35 += 2;
                      v33 = (_DWORD *)((char *)v33 + 2);
                    }
                  }
                  else
                  {
LABEL_60:
                    v26 = v65;
                  }
                }
                v38 = v35 - v28;
                v39 = (UINT8 *)v33;
                v24 = (char *)v33 - v38;
                if( v38 <= v30 )
                {
                  v29 += v38;
                  goto LABEL_68;
                }
                v65 = v24;
                v30 = v38;
                v26 = v24;
                if( v39 > v28 )
                  goto LABEL_69;
                goto LABEL_68;
              }
            }
          }
        }
LABEL_72:
        ++v7;
        ++*(_DWORD *)(result + 4i64 * (unsigned __int8)v23 + 1339936);
        *v13++ = v23;
        if( v14 <= 0 )
        {
          *(_DWORD *)v9 = 2 * v14;
          v14 = 1;
          v9 = v13;
          v13 += 4;
        }
        else
        {
          v14 *= 2;
        }
      }
      if( (unsigned __int64)v7 < v16 )
        break;
      v8 = (CHAR *)v59;
      v12 = v60;
LABEL_90:
      while( v7 < v12 )
      {
        ++*(_DWORD *)(result + 4i64 * *v7 + 1339936);
        v50 = *v7++;
        *v13++ = v50;
        if( v14 <= 0 )
        {
          *(_DWORD *)v9 = 2 * v14;
          v14 = 1;
          v9 = v13;
          v13 += 4;
        }
        else
        {
          v14 *= 2;
        }
      }
      for( ; v14 > 0; v14 = 2 * v14 + 1 )
        ;
      *(_DWORD *)v9 = 2 * v14 + 1;
      if( (unsigned __int64)v7 < v10 )
      {
        v51 = 0;
      }
      else
      {
        ++*(_DWORD *)(result + 1340960);
        v51 = 1;
      }
      if( &v8[4 * ((unsigned __int64)(XpressBuildHuffmanEncodings((_QWORD *)(result + 1310720)) + v57 + 31) >> 5)
             + 258
             + v58] >= (CHAR *)v61 )
        return;
      v9 = (unsigned __int8 *)(result + 1342240);
      LODWORD(v53) = v51;
      v52 = XpressDoHuffmanPass(result + 1310720, (UINT8 *)(result + 1342240), (UINT64)v13, v8, v53);
      v5 = v71;
      v8 = v52;
      v59 = (UINT8 *)v52;
      if( v51 )
      {
        *v67 = (_DWORD)v52 - v66;
        return;
      }
    }
    XpressCallback = RtlpMakeXpressCallback((INT64)v62, v16, (INT64)v7);
    v16 = v55;
    v15 = XpressCallback;
    v10 = (unsigned __int64)v54;
    v56 = XpressCallback;
    goto LABEL_21;
  }
}

Referenced by:

RtlCompressBufferProgress
RtlCompressBufferXpressHuff