RtlCompressBufferXpressHuffStandard

NTSTATUS __stdcall RtlCompressBufferXpressHuffStandard(
        UINT8 *UncompressedBuffer,
        UINT64 UncompressedBufferSize,
        UINT8 *CompressedBuffer,
        UINT64 CompressedBufferSize,
        UINT64 *FinalCompressedSize,
        _XPRESS_HUFF_WORKSPACE *Workspace,
        VOID *Callback,
        VOID *a8,
        VOID *CallbackContext,
        UINT64 ProgressBytes){
  UINT8 *v10; 
  UINT8 *v11; 
  unsigned int v12; 
  _XPRESS_HUFF_WORKSPACE *v13; 
  _XPRESS_HUFF_WORKSPACE *v14; 
  __int64 v15; 
  __int64 v16; 
  __int64 v17; 
  UINT8 *v18; 
  unsigned __int64 XpressCallback; 
  bool v20; 
  UINT8 *v21; 
  int v22; 
  UINT8 v23; 
  UINT8 *v24; 
  UINT8 *v25; 
  _XPRESS_HUFF_WORKSPACE *v26; 
  __int64 v27; 
  UINT8 *v28; 
  __int64 v29; 
  __int64 v30; 
  UINT8 *v31; 
  __int64 v32; 
  __int64 v33; 
  __int64 v34; 
  int v35; 
  int v36; 
  __int64 v37; 
  UINT8 *v38; 
  unsigned __int64 v39; 
  unsigned __int64 v40; 
  __int64 v41; 
  unsigned __int64 v42; 
  char v43; 
  unsigned __int64 v44; 
  UINT8 *v45; 
  UINT8 v46; 
  _WORD *v47; 
  int v48; 
  UINT8 v49; 
  int v50; 
  UINT8 *v51; 
  bool v52; 
  __int64 v54; 
  UINT8 *v55; 
  unsigned __int64 v56; 
  UINT8 *v57; 
  unsigned __int64 v58; 
  __int64 v59; 
  __int64 v60; 
  int *v61; 
  __int64 v62; 
  unsigned __int64 v63; 
  UINT64 WriteEof; 
  _XPRESS_HUFF_WORKSPACE *v65; 
  char *v66; 
  unsigned __int64 v67; 
  __int64 v68; 
  __int64 v69; 
  UINT8 *v70; 
  unsigned __int64 v71; 
  UINT8 *v72; 
  UINT8 *HuffOutputPos; 
  UINT8 *v74; 
  __int64 v75; 
  __int64 v76[2]; 
  unsigned int v77; 
  int v78; 
  UINT8 v80; 
  int v81; 
  UINT8 v82; 

  v81 = (int)CompressedBuffer;
  v10 = &UncompressedBuffer[(unsigned int)UncompressedBufferSize];
  v70 = v10;
  v74 = &CompressedBuffer[(unsigned int)CompressedBufferSize];
  v78 = 0;
  if( (unsigned int)CompressedBufferSize < 0x12C )
    return -1073741789;
  HuffOutputPos = CompressedBuffer;
  memset64(Workspace, (unsigned __int64)UncompressedBuffer, 0xAF6ui64);
  memset64(Workspace + 5612, (unsigned __int64)UncompressedBuffer, 0x12EEui64);
  v11 = UncompressedBuffer;
  if( !Callback
    || (v12 = (unsigned int)CallbackContext, (unsigned int)CallbackContext > (unsigned int)UncompressedBufferSize) )
  {
    v12 = UncompressedBufferSize;
  }
  v76[0] = (__int64)Callback;
  v13 = Workspace + 23184;
  v14 = Workspace + 22608;
  v15 = v12;
  v76[1] = (__int64)a8;
  v77 = v12;
  v75 = v12;
  while( 2 )
  {
    v68 = 0i64;
    v69 = 0i64;
    v16 = 0i64;
    v17 = 0i64;
    memset(v14, 0i64, 0x800u);
    v18 = v11 + 0x10000;
    v72 = v11 + 0x10000;
    if( v11 + 0x10000 > v10 )
    {
      v18 = v10;
      v72 = v10;
    }
    v65 = v13;
    XpressCallback = (unsigned __int64)&v11[v15];
    v71 = (unsigned __int64)(v18 - 40);
    v20 = v18 - 40 < &v11[v15];
    v21 = (UINT8 *)(Workspace + 23185);
    v22 = 1;
    if( v20 )
      XpressCallback = (unsigned __int64)(v18 - 40);
    v67 = XpressCallback;
    if( v11 == UncompressedBuffer )
    {
      v22 = 2;
      ++Workspace[*v11 + 22608];
      v23 = *v11++;
      *v21 = v23;
      v21 = (UINT8 *)Workspace + 92741;
    }
    if( v11 >= v18 - 40 )
      goto LABEL_40;
    while( 1 )
    {
      do
      {
        while( 1 )
        {
          while( 1 )
          {
            v24 = v11 + 1;
            v25 = v11;
            v26 = &Workspace[2 * *v11];
            v27 = v11[2] + 4i64 * v11[1];
            v28 = *(UINT8 **)&v26[4 * v27];
            *(_QWORD *)&v26[4 * v27] = v11;
            v29 = *v11;
            if( *v28 != (_BYTE)v29 || v28[1] != *v24 || v28[2] != v11[2] || v11 - v28 >= 0x10000 )
              break;
            v30 = v28[3];
            v31 = v11;
            v32 = v11[3];
            if( (_BYTE)v32 != (_BYTE)v30 )
            {
              v37 = v29 + 2 * v27;
              v38 = *(UINT8 **)&Workspace[2 * v37 + 5612 + 2 * v32];
              *(_QWORD *)&Workspace[2 * v37 + 5612 + 2 * v30] = v28;
              if( v11 - v38 >= 0x10000 )
                goto LABEL_29;
              v39 = *(unsigned int *)v11;
              if( (_DWORD)v39 != *(_DWORD *)v38 )
                goto LABEL_29;
              v28 = v38;
              *(_QWORD *)&Workspace[2 * v37 + 5612 + 2 * (v39 >> 24)] = v11;
            }
            v33 = v28[4];
            v34 = v11[4];
            v66 = (char *)(v11 + 4);
            if( (_BYTE)v34 != (_BYTE)v33 )
            {
              v54 = 2
                  * ((unsigned __int8)__ROR1__(*v24 ^ __ROL1__(*v11 + v11[3], 3), 1)
                   + 4i64 * (unsigned __int8)__ROL1__(*v11 ^ __ROR1__(v11[2] + *v24 + 97, 1), 3));
              v55 = *(UINT8 **)&Workspace[2 * v54 + 5612 + 2 * v34];
              *(_QWORD *)&Workspace[2 * v54 + 5612 + 2 * v33] = v28;
              if( v11 - v55 >= 0x10000
                || *(_DWORD *)v11 != *(_DWORD *)v55
                || (v60 = (unsigned __int8)*v66, (_BYTE)v60 != v55[4])
                || v11 == v55 )
              {
                v28 += 4;
                v11 += 4;
                goto LABEL_30;
              }
              v28 = v55;
              *(_QWORD *)&Workspace[2 * v54 + 5612 + 2 * v60] = v11;
            }
            v82 = v28[5];
            v80 = v11[5];
            if( v80 != v82 )
            {
              v56 = 2
                  * ((v11[2] ^ (unsigned __int64)(unsigned __int8)__ROL1__(*v11, *v66))
                   + 4
                   * ((unsigned __int8)__ROR1__(*v24 ^ __ROL1__(v11[3], 3), 1)
                    + (unsigned __int64)(unsigned __int8)__ROL1__(*v66 ^ (__ROR1__(*v11, 1) + 69), 3)));
              v57 = *(UINT8 **)&Workspace[2 * v56 + 5612 + 2 * v80];
              *(_QWORD *)&Workspace[2 * v56 + 5612 + 2 * v82] = v28;
              if( v11 - v57 >= 0x10000
                || *(_DWORD *)v11 != *(_DWORD *)v57
                || *v66 != v57[4]
                || (v62 = v11[5], (_BYTE)v62 != v57[5])
                || v11 == v57 )
              {
                v11 += 5;
                v28 += 5;
                goto LABEL_30;
              }
              v28 = v57;
              *(_QWORD *)&Workspace[2 * v56 + 5612 + 2 * v62] = v11;
            }
            v11 += 6;
            v28 += 6;
            if( v11 >= v70 - 40 )
            {
LABEL_65:
              while( v11 < v70 )
              {
                if( *v11 != *v28 )
                  break;
                ++v11;
                ++v28;
              }
            }
            else
            {
              while( 1 )
              {
                v35 = *(_DWORD *)v28;
                v36 = *(_DWORD *)v11;
                if( *(_DWORD *)v11 != *(_DWORD *)v28 )
                  break;
                v35 = *((_DWORD *)v28 + 1);
                v36 = *((_DWORD *)v11 + 1);
                if( v36 != v35 )
                {
                  v11 += 4;
                  v28 += 4;
                  break;
                }
                v35 = *((_DWORD *)v28 + 2);
                v36 = *((_DWORD *)v11 + 2);
                if( v36 != v35 )
                {
                  v11 += 8;
                  v28 += 8;
                  break;
                }
                v35 = *((_DWORD *)v28 + 3);
                v36 = *((_DWORD *)v11 + 3);
                if( v36 != v35 )
                {
                  v11 += 12;
                  v28 += 12;
                  break;
                }
                v35 = *((_DWORD *)v28 + 4);
                v36 = *((_DWORD *)v11 + 4);
                if( v36 != v35 )
                {
                  v11 += 16;
                  v28 += 16;
                  break;
                }
                v35 = *((_DWORD *)v28 + 5);
                v36 = *((_DWORD *)v11 + 5);
                if( v36 != v35 )
                {
                  v11 += 20;
                  v28 += 20;
                  break;
                }
                v35 = *((_DWORD *)v28 + 6);
                v36 = *((_DWORD *)v11 + 6);
                if( v36 != v35 )
                {
                  v11 += 24;
                  v28 += 24;
                  break;
                }
                v35 = *((_DWORD *)v28 + 7);
                v36 = *((_DWORD *)v11 + 7);
                if( v36 != v35 )
                {
                  v11 += 28;
                  v28 += 28;
                  break;
                }
                v11 += 32;
                v28 += 32;
                if( v11 >= v70 - 40 )
                  goto LABEL_65;
              }
              if( (_BYTE)v36 == (_BYTE)v35 )
              {
                if( v11[1] != v28[1] )
                {
                  ++v11;
                  ++v28;
                  goto LABEL_30;
                }
                if( v11[2] == v28[2] )
                {
LABEL_29:
                  v11 += 3;
                  v28 += 3;
                  goto LABEL_30;
                }
                v11 += 2;
                v28 += 2;
              }
            }
LABEL_30:
            v40 = v11 - v28;
            if( v11 - v31 == 3 && v40 > 0x1000 )
            {
              XpressCallback = v67;
              v13 = v65;
              break;
            }
            if( v40 >= 0x100 )
              v41 = *((unsigned __int8 *)XpressHighBitIndexTable + (v40 >> 8)) + 8i64;
            else
              v41 = *((unsigned __int8 *)XpressHighBitIndexTable + v40);
            v16 = v41 + v68;
            v42 = v40 - (1i64 << v41);
            v43 = 16 * v41;
            v44 = v11 - v31 - 3;
            v68 = v16;
            v45 = v21 + 1;
            if( v44 >= 0xF )
            {
              v46 = v43 + 15;
              v58 = v11 - v31 - 18;
              *v21 = v46;
              v47 = v21 + 2;
              if( v58 >= 0xFF )
              {
                v63 = v58 + 15;
                *v45 = -1;
                if( v63 < 0x10000 )
                {
                  *v47 = v63;
                  v47 = v45 + 3;
                  v69 += 3i64;
                  goto LABEL_35;
                }
                *(_DWORD *)(v45 + 3) = v63;
                *v47 = 0;
                v47 = v45 + 7;
                v59 = 7i64;
              }
              else
              {
                *v45 = v58;
                v59 = 1i64;
              }
              v69 += v59;
            }
            else
            {
              v46 = v44 + v43;
              *v21 = v46;
              v47 = v21 + 1;
            }
LABEL_35:
            ++Workspace[v46 + 22864];
            v48 = 2 * v22 + 1;
            *v47 = v42;
            v21 = (UINT8 *)(v47 + 1);
            if( v22 <= 0 )
            {
              v61 = v65;
              v22 = 1;
              v65 = (_XPRESS_HUFF_WORKSPACE *)v21;
              v21 += 4;
              *v61 = v48;
            }
            else
            {
              v22 = 2 * v22 + 1;
            }
            XpressCallback = v67;
            v13 = v65;
            if( (unsigned __int64)v11 >= v67 )
            {
              if( (unsigned __int64)v11 >= v71 )
                goto LABEL_39;
              XpressCallback = RtlpMakeXpressCallback((__int64)v76, v71, (__int64)v11);
              v67 = XpressCallback;
            }
          }
          v11 = v24;
          ++Workspace[*v25 + 22608];
          *v21++ = *v25;
          if( v22 <= 0 )
            break;
          v22 *= 2;
        }
        *v13 = 2 * v22;
        v22 = 1;
        v13 = (_XPRESS_HUFF_WORKSPACE *)v21;
        v65 = (_XPRESS_HUFF_WORKSPACE *)v21;
        v21 += 4;
      }
      while( (unsigned __int64)v24 < XpressCallback );
      if( (unsigned __int64)v24 >= v71 )
        break;
      XpressCallback = RtlpMakeXpressCallback((__int64)v76, v71, (__int64)v24);
      v67 = XpressCallback;
    }
    v16 = v68;
LABEL_39:
    v17 = v69;
    v18 = v72;
LABEL_40:
    while( v11 < v18 )
    {
      ++Workspace[*v11 + 22608];
      v49 = *v11++;
      *v21++ = v49;
      if( v22 <= 0 )
      {
        *v13 = 2 * v22;
        v22 = 1;
        v13 = (_XPRESS_HUFF_WORKSPACE *)v21;
        v21 += 4;
      }
      else
      {
        v22 *= 2;
      }
    }
    for( ; v22 > 0; v22 = 2 * v22 + 1 )
      ;
    *v13 = 2 * v22 + 1;
    if( v11 < v70 )
    {
      v50 = 0;
    }
    else
    {
      ++Workspace[22864];
      v50 = 1;
    }
    if( &HuffOutputPos[4 * ((v16 + XpressBuildHuffmanEncodings(Workspace + 15304) + 31) >> 5) + 258 + v17] < v74 )
    {
      v13 = Workspace + 23184;
      LODWORD(WriteEof) = v50;
      v51 = XpressDoHuffmanPass(Workspace + 15304, (UINT8 *)Workspace + 92736, v21, HuffOutputPos, WriteEof);
      v10 = v70;
      v14 = Workspace + 22608;
      v52 = v50 == 0;
      HuffOutputPos = v51;
      v15 = v75;
      if( !v52 )
      {
        *(_DWORD *)FinalCompressedSize = (_DWORD)v51 - v81;
        return 0;
      }
      continue;
    }
    return -1073741789;
  }
}

Referenced by:

RtlCompressBufferProgress
RtlCompressBufferXpressHuff