RtlCompressBufferXpressHuffStandard

VOID __fastcall RtlCompressBufferXpressHuffStandard(
        UINT64 a1,
        UINT64 a2,
        CHAR *a3,
        UINT64 a4,
        _DWORD *a5,
        INT64 a6,
        INT64 a7,
        INT64 a8,
        UINT64 a9){
  UINT64 v9; 
  unsigned __int8 *v10; 
  unsigned int v11; 
  unsigned __int8 *v12; 
  INT64 v13; 
  __int64 v14; 
  __int64 v15; 
  __int64 v16; 
  unsigned __int8 *v17; 
  UINT64 XpressCallback; 
  bool v19; 
  unsigned __int8 *v20; 
  int v21; 
  unsigned __int8 v22; 
  unsigned __int8 *v23; 
  unsigned __int8 *v24; 
  INT64 v25; 
  __int64 v26; 
  unsigned __int8 *v27; 
  __int64 v28; 
  __int64 v29; 
  unsigned __int8 *v30; 
  __int64 v31; 
  __int64 v32; 
  __int64 v33; 
  int v34; 
  int v35; 
  __int64 v36; 
  unsigned __int8 *v37; 
  unsigned __int64 v38; 
  unsigned __int64 v39; 
  __int64 v40; 
  unsigned __int64 v41; 
  char v42; 
  unsigned __int64 v43; 
  _BYTE *v44; 
  unsigned __int8 v45; 
  _WORD *v46; 
  int v47; 
  unsigned __int8 v48; 
  int v49; 
  CHAR *v50; 
  bool v51; 
  __int64 v52; 
  unsigned __int8 *v53; 
  unsigned __int64 v54; 
  unsigned __int8 *v55; 
  unsigned __int64 v56; 
  __int64 v57; 
  __int64 v58; 
  int *v59; 
  __int64 v60; 
  unsigned __int64 v61; 
  INT64 v62; 
  unsigned __int8 *v63; 
  char *v64; 
  unsigned __int64 v65; 
  __int64 v66; 
  __int64 v67; 
  unsigned __int64 v68; 
  UINT64 v69; 
  unsigned __int8 *v70; 
  CHAR *v71; 
  CHAR *v72; 
  __int64 v73; 
  INT64 v74[2]; 
  unsigned int v75; 
  int v76; 
  unsigned __int8 v78; 
  int v79; 
  unsigned __int8 v80; 
  v79 = (int)a3;
  v9 = a1 + (unsigned int)a2;
  v68 = v9;
  v72 = &a3[(unsigned int)a4];
  v76 = 0;
  if( (unsigned int)a4 < 0x12C )
    return;
  v71 = a3;
  memset64((void *)a6, a1, 0xAF6ui64);
  memset64((void *)(a6 + 22448), a1, 0x12EEui64);
  v10 = (unsigned __int8 *)a1;
  if( !a7 || (v11 = a9, (unsigned int)a9 > (unsigned int)a2) )
    v11 = a2;
  v74[0] = a7;
  v12 = (unsigned __int8 *)(a6 + 92736);
  v13 = a6 + 90432;
  v14 = v11;
  v74[1] = a8;
  v75 = v11;
  v73 = v11;
  while( 2 )
  {
    v66 = 0i64;
    v67 = 0i64;
    v15 = 0i64;
    v16 = 0i64;
    memset(v13, 0i64);
    v17 = v10 + 0x10000;
    v70 = v10 + 0x10000;
    if( (unsigned __int64)(v10 + 0x10000) > v9 )
    {
      v17 = (unsigned __int8 *)v9;
      v70 = (unsigned __int8 *)v9;
    }
    v63 = v12;
    XpressCallback = (UINT64)&v10[v14];
    v69 = (UINT64)(v17 - 40);
    v19 = v17 - 40 < &v10[v14];
    v20 = (unsigned __int8 *)(a6 + 92740);
    v21 = 1;
    if( v19 )
      XpressCallback = (UINT64)(v17 - 40);
    v65 = XpressCallback;
    if( v10 == (unsigned __int8 *)a1 )
    {
      v21 = 2;
      ++*(_DWORD *)(a6 + 4i64 * *v10 + 90432);
      v22 = *v10++;
      *v20 = v22;
      v20 = (unsigned __int8 *)(a6 + 92741);
    }
    if( v10 >= v17 - 40 )
      goto LABEL_40;
    while( 1 )
    {
      do
      {
        while( 1 )
        {
          while( 1 )
          {
            v23 = v10 + 1;
            v24 = v10;
            v25 = a6 + 8i64 * *v10;
            v26 = v10[2] + 4i64 * v10[1];
            v27 = *(unsigned __int8 **)(v25 + 16 * v26);
            *(_QWORD *)(v25 + 16 * v26) = v10;
            v28 = *v10;
            if( *v27 != (_BYTE)v28 || v27[1] != *v23 || v27[2] != v10[2] || v10 - v27 >= 0x10000 )
              break;
            v29 = v27[3];
            v30 = v10;
            v31 = v10[3];
            if( (_BYTE)v31 != (_BYTE)v29 )
            {
              v36 = v28 + 2 * v26;
              v37 = *(unsigned __int8 **)(a6 + 8 * (v36 + v31) + 22448);
              *(_QWORD *)(a6 + 8 * (v36 + v29) + 22448) = v27;
              if( v10 - v37 >= 0x10000 )
                goto LABEL_29;
              v38 = *(unsigned int *)v10;
              if( (_DWORD)v38 != *(_DWORD *)v37 )
                goto LABEL_29;
              v27 = v37;
              *(_QWORD *)(a6 + 8 * (v36 + (v38 >> 24)) + 22448) = v10;
            }
            v32 = v27[4];
            v33 = v10[4];
            v64 = (char *)(v10 + 4);
            if( (_BYTE)v33 != (_BYTE)v32 )
            {
              v52 = 2
                  * ((unsigned __int8)__ROR1__(*v23 ^ __ROL1__(*v10 + v10[3], 3), 1)
                   + 4i64 * (unsigned __int8)__ROL1__(*v10 ^ __ROR1__(v10[2] + *v23 + 97, 1), 3));
              v53 = *(unsigned __int8 **)(a6 + 8 * (v52 + v33) + 22448);
              *(_QWORD *)(a6 + 8 * (v52 + v32) + 22448) = v27;
              if( v10 - v53 >= 0x10000
                || *(_DWORD *)v10 != *(_DWORD *)v53
                || (v58 = (unsigned __int8)*v64, (_BYTE)v58 != v53[4])
                || v10 == v53 )
              {
                v27 += 4;
                v10 += 4;
                goto LABEL_30;
              }
              v27 = v53;
              *(_QWORD *)(a6 + 8 * (v52 + v58) + 22448) = v10;
            }
            v80 = v27[5];
            v78 = v10[5];
            if( v78 != v80 )
            {
              v54 = 2
                  * ((v10[2] ^ (unsigned __int64)(unsigned __int8)__ROL1__(*v10, *v64))
                   + 4
                   * ((unsigned __int8)__ROR1__(*v23 ^ __ROL1__(v10[3], 3), 1)
                    + (unsigned __int64)(unsigned __int8)__ROL1__(*v64 ^ (__ROR1__(*v10, 1) + 69), 3)));
              v55 = *(unsigned __int8 **)(a6 + 8 * (v54 + v78) + 22448);
              *(_QWORD *)(a6 + 8 * (v54 + v80) + 22448) = v27;
              if( v10 - v55 >= 0x10000
                || *(_DWORD *)v10 != *(_DWORD *)v55
                || *v64 != v55[4]
                || (v60 = v10[5], (_BYTE)v60 != v55[5])
                || v10 == v55 )
              {
                v10 += 5;
                v27 += 5;
                goto LABEL_30;
              }
              v27 = v55;
              *(_QWORD *)(a6 + 8 * (v54 + v60) + 22448) = v10;
            }
            v10 += 6;
            v27 += 6;
            if( (unsigned __int64)v10 >= v68 - 40 )
            {
LABEL_65:
              while( (unsigned __int64)v10 < v68 )
              {
                if( *v10 != *v27 )
                  break;
                ++v10;
                ++v27;
              }
            }
            else
            {
              while( 1 )
              {
                v34 = *(_DWORD *)v27;
                v35 = *(_DWORD *)v10;
                if( *(_DWORD *)v10 != *(_DWORD *)v27 )
                  break;
                v34 = *((_DWORD *)v27 + 1);
                v35 = *((_DWORD *)v10 + 1);
                if( v35 != v34 )
                {
                  v10 += 4;
                  v27 += 4;
                  break;
                }
                v34 = *((_DWORD *)v27 + 2);
                v35 = *((_DWORD *)v10 + 2);
                if( v35 != v34 )
                {
                  v10 += 8;
                  v27 += 8;
                  break;
                }
                v34 = *((_DWORD *)v27 + 3);
                v35 = *((_DWORD *)v10 + 3);
                if( v35 != v34 )
                {
                  v10 += 12;
                  v27 += 12;
                  break;
                }
                v34 = *((_DWORD *)v27 + 4);
                v35 = *((_DWORD *)v10 + 4);
                if( v35 != v34 )
                {
                  v10 += 16;
                  v27 += 16;
                  break;
                }
                v34 = *((_DWORD *)v27 + 5);
                v35 = *((_DWORD *)v10 + 5);
                if( v35 != v34 )
                {
                  v10 += 20;
                  v27 += 20;
                  break;
                }
                v34 = *((_DWORD *)v27 + 6);
                v35 = *((_DWORD *)v10 + 6);
                if( v35 != v34 )
                {
                  v10 += 24;
                  v27 += 24;
                  break;
                }
                v34 = *((_DWORD *)v27 + 7);
                v35 = *((_DWORD *)v10 + 7);
                if( v35 != v34 )
                {
                  v10 += 28;
                  v27 += 28;
                  break;
                }
                v10 += 32;
                v27 += 32;
                if( (unsigned __int64)v10 >= v68 - 40 )
                  goto LABEL_65;
              }
              if( (_BYTE)v35 == (_BYTE)v34 )
              {
                if( v10[1] != v27[1] )
                {
                  ++v10;
                  ++v27;
                  goto LABEL_30;
                }
                if( v10[2] == v27[2] )
                {
LABEL_29:
                  v10 += 3;
                  v27 += 3;
                  goto LABEL_30;
                }
                v10 += 2;
                v27 += 2;
              }
            }
LABEL_30:
            v39 = v10 - v27;
            if( v10 - v30 == 3 && v39 > 0x1000 )
            {
              XpressCallback = v65;
              v12 = v63;
              break;
            }
            if( v39 >= 0x100 )
              v40 = *((unsigned __int8 *)XpressHighBitIndexTable + (v39 >> 8)) + 8i64;
            else
              v40 = *((unsigned __int8 *)XpressHighBitIndexTable + v39);
            v15 = v40 + v66;
            v41 = v39 - (1i64 << v40);
            v42 = 16 * v40;
            v43 = v10 - v30 - 3;
            v66 = v15;
            v44 = v20 + 1;
            if( v43 >= 0xF )
            {
              v45 = v42 + 15;
              v56 = v10 - v30 - 18;
              *v20 = v45;
              v46 = v20 + 2;
              if( v56 >= 0xFF )
              {
                v61 = v56 + 15;
                *v44 = -1;
                if( v61 < 0x10000 )
                {
                  *v46 = v61;
                  v46 = v44 + 3;
                  v67 += 3i64;
                  goto LABEL_35;
                }
                *(_DWORD *)(v44 + 3) = v61;
                *v46 = 0;
                v46 = v44 + 7;
                v57 = 7i64;
              }
              else
              {
                *v44 = v56;
                v57 = 1i64;
              }
              v67 += v57;
            }
            else
            {
              v45 = v43 + v42;
              *v20 = v45;
              v46 = v20 + 1;
            }
LABEL_35:
            ++*(_DWORD *)(a6 + 4i64 * v45 + 91456);
            v47 = 2 * v21 + 1;
            *v46 = v41;
            v20 = (unsigned __int8 *)(v46 + 1);
            if( v21 <= 0 )
            {
              v59 = (int *)v63;
              v21 = 1;
              v63 = v20;
              v20 += 4;
              *v59 = v47;
            }
            else
            {
              v21 = 2 * v21 + 1;
            }
            XpressCallback = v65;
            v12 = v63;
            if( (unsigned __int64)v10 >= v65 )
            {
              if( (unsigned __int64)v10 >= v69 )
                goto LABEL_39;
              XpressCallback = RtlpMakeXpressCallback((INT64)v74, v69, (INT64)v10);
              v65 = XpressCallback;
            }
          }
          v10 = v23;
          ++*(_DWORD *)(a6 + 4i64 * *v24 + 90432);
          *v20++ = *v24;
          if( v21 <= 0 )
            break;
          v21 *= 2;
        }
        *(_DWORD *)v12 = 2 * v21;
        v21 = 1;
        v12 = v20;
        v63 = v20;
        v20 += 4;
      }
      while( (unsigned __int64)v23 < XpressCallback );
      if( (unsigned __int64)v23 >= v69 )
        break;
      XpressCallback = RtlpMakeXpressCallback((INT64)v74, v69, (INT64)v23);
      v65 = XpressCallback;
    }
    v15 = v66;
LABEL_39:
    v16 = v67;
    v17 = v70;
LABEL_40:
    while( v10 < v17 )
    {
      ++*(_DWORD *)(a6 + 4i64 * *v10 + 90432);
      v48 = *v10++;
      *v20++ = v48;
      if( v21 <= 0 )
      {
        *(_DWORD *)v12 = 2 * v21;
        v21 = 1;
        v12 = v20;
        v20 += 4;
      }
      else
      {
        v21 *= 2;
      }
    }
    for( ; v21 > 0; v21 = 2 * v21 + 1 )
      ;
    *(_DWORD *)v12 = 2 * v21 + 1;
    if( (unsigned __int64)v10 < v68 )
    {
      v49 = 0;
    }
    else
    {
      ++*(_DWORD *)(a6 + 91456);
      v49 = 1;
    }
    if( &v71[4 * ((unsigned __int64)(v15 + XpressBuildHuffmanEncodings((_QWORD *)(a6 + 61216)) + 31) >> 5) + 258 + v16] < v72 )
    {
      v12 = (unsigned __int8 *)(a6 + 92736);
      LODWORD(v62) = v49;
      v50 = XpressDoHuffmanPass(a6 + 61216, (UINT8 *)(a6 + 92736), (UINT64)v20, v71, v62);
      v9 = v68;
      v13 = a6 + 90432;
      v51 = v49 == 0;
      v71 = v50;
      v14 = v73;
      if( !v51 )
      {
        *a5 = (_DWORD)v50 - v79;
        return;
      }
      continue;
    }
    break;
  }
}

Referenced by:

RtlCompressBufferProgress
RtlCompressBufferXpressHuff