RtlCompressBufferXpressHuffMax

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

  v73 = (int)CompressedBuffer;
  v11 = UncompressedBufferSize;
  v71 = 0;
  v61 = &UncompressedBuffer[(unsigned int)UncompressedBufferSize];
  v68 = &CompressedBuffer[(unsigned int)CompressedBufferSize];
  if( (unsigned int)CompressedBufferSize >= 0x12C )
  {
    if( (unsigned __int64)UncompressedBuffer <= 0x10001 )
      return -1073741637;
    memset(Workspace, 0i64, 0x40000u);
    v14 = UncompressedBuffer;
    v66 = CompressedBuffer;
    v15 = CompressedBuffer;
    *((_QWORD *)Workspace + 0x8000) = 0i64;
    if( Callback && (unsigned int)CallbackContext <= v11 )
      v11 = (unsigned int)CallbackContext;
    else
      LODWORD(CallbackContext) = v11;
    v69[0] = (__int64)Callback;
    v16 = Workspace + 335560;
    v69[1] = (__int64)a8;
    v70 = v11;
    v72 = 0i64;
    while( 1 )
    {
      v64 = 0i64;
      v65 = 0i64;
      memset(Workspace + 334984, 0i64, 0x800u);
      v17 = (unsigned __int64)v61;
      v18 = v11;
      v19 = v61;
      v20 = (UINT8 *)(v16 + 1);
      if( v14 + 0x10000 <= v61 )
        v19 = v14 + 0x10000;
      v21 = 1;
      v22 = (unsigned __int64)&v14[v18];
      v67 = v19;
      v23 = (unsigned __int64)(v19 - 5);
      v62 = (unsigned __int64)(v19 - 5);
      if( (unsigned __int64)(v19 - 5) < v22 )
        v22 = (unsigned __int64)(v19 - 5);
      v63 = v22;
      if( v14 == UncompressedBuffer )
      {
        v21 = 2;
        ++Workspace[*v14 + 334984];
        v24 = *v14++;
        *v20 = v24;
        v20 = (UINT8 *)v16 + 5;
      }
      if( (unsigned __int64)v14 >= v23 )
        goto LABEL_91;
      v25 = v14;
      v26 = (v14 - UncompressedBuffer) % 0x20000;
      do
      {
        v27 = (unsigned __int16)XpressHashFunction[*v25] ^ (unsigned __int16)word_14003A320[v25[2]] ^ (unsigned __int64)(unsigned __int16)word_14003A120[v25[1]];
        v28 = *(_QWORD *)&Workspace[2 * v27];
        *(_QWORD *)&Workspace[2 * v27] = v25++;
        *(_QWORD *)&Workspace[2 * v26 + 0x10000] = v28;
        v26 = ((_DWORD)v26 + 1) & 0x1FFFF;
      }
      while( (unsigned __int64)v25 < v23 );
LABEL_18:
      v17 = (unsigned __int64)v61;
      while( (unsigned __int64)v14 < v22 )
      {
LABEL_22:
        v30 = *(_DWORD *)v14;
        v31 = *(char **)&Workspace[2 * ((v14 - UncompressedBuffer) % 0x20000) + 0x10000];
        if( v31 + 0x10000 > (char *)v14 )
        {
          v32 = *(_DWORD *)v31 ^ v30;
          if( !v32 )
            goto LABEL_24;
          if( (v32 & 0xFFFFFF) == 0 )
            goto LABEL_32;
          v31 = *(char **)&Workspace[2 * ((v31 - (char *)UncompressedBuffer) % 0x20000) + 0x10000];
          if( v31 + 0x10000 > (char *)v14 )
          {
            v38 = *(_DWORD *)v31 ^ v30;
            if( !v38 )
              goto LABEL_24;
            if( (v38 & 0xFFFFFF) == 0 )
              goto LABEL_32;
            v31 = *(char **)&Workspace[2 * ((v31 - (char *)UncompressedBuffer) % 0x20000) + 0x10000];
            if( v31 + 0x10000 > (char *)v14 )
            {
              v39 = *(_DWORD *)v31 ^ v30;
              if( !v39 )
              {
LABEL_24:
                v33 = v72;
                v34 = v14 - 0x10000;
                v35 = v14;
                v36 = 0i64;
                v37 = 3i64;
                goto LABEL_36;
              }
              if( (v39 & 0xFFFFFF) == 0 )
              {
LABEL_32:
                v72 = v31;
                v35 = v14;
                v34 = v14 - 0x10000;
                v33 = v31;
                v36 = 0i64;
                v37 = 3i64;
                while( 1 )
                {
                  v31 = *(char **)&Workspace[2 * ((v31 - (char *)UncompressedBuffer) % 0x20000) + 0x10000];
                  if( v31 <= (char *)v34 )
                  {
LABEL_70:
                    v14 = &v35[v37];
                    v47 = v35 - (UINT8 *)v33;
                    if( v37 == 3 && v47 > 0x1000 )
                    {
                      v23 = v62;
                      v14 = v35;
                      v22 = v63;
                      goto LABEL_73;
                    }
                    if( v47 < 0x100 )
                      v48 = *((unsigned __int8 *)XpressHighBitIndexTable + v47);
                    else
                      v48 = *((unsigned __int8 *)XpressHighBitIndexTable + (v47 >> 8)) + 8i64;
                    v64 += v48;
                    v49 = v20 + 1;
                    v50 = v47 - (1i64 << v48);
                    v51 = 16 * v48;
                    if( v37 - 3 < 0xF )
                    {
                      v52 = v37 - 3 + v51;
                      *v20 = v52;
                      v54 = v20 + 1;
                    }
                    else
                    {
                      v52 = v51 + 15;
                      v53 = v37 - 18;
                      *v20 = v52;
                      v54 = v20 + 2;
                      if( v37 - 18 >= 0xFF )
                      {
                        v56 = v53 + 15;
                        *v49 = -1;
                        if( v56 >= 0x10000 )
                        {
                          *(_DWORD *)(v49 + 3) = v56;
                          *v54 = 0;
                          v55 = 7i64;
                          v54 = v49 + 7;
                        }
                        else
                        {
                          *v54 = v56;
                          v54 = v49 + 3;
                          v55 = 3i64;
                        }
                      }
                      else
                      {
                        *v49 = v53;
                        v55 = 1i64;
                      }
                      v65 += v55;
                    }
                    v23 = v62;
                    v22 = v63;
                    ++Workspace[v52 + 335240];
                    *v54 = v50;
                    v20 = (UINT8 *)(v54 + 1);
                    if( v21 <= 0 )
                    {
                      *v16 = 2 * v21 + 1;
                      v21 = 1;
                      v16 = (_XPRESS_HUFF_WORKSPACE_MAX *)v20;
                      v20 += 4;
                    }
                    else
                    {
                      v21 = 2 * v21 + 1;
                    }
                    goto LABEL_18;
                  }
                  if( v30 == *(_DWORD *)v31 )
                    break;
LABEL_69:
                  if( (unsigned __int64)++v36 >= 0xC )
                    goto LABEL_70;
                }
                v14 = v35;
LABEL_36:
                v40 = v31 + 4;
                v41 = v14 + 36;
                v42 = v14 + 4;
                if( (unsigned __int64)v41 >= v17 )
                {
LABEL_47:
                  while( (unsigned __int64)v42 < v17 )
                  {
                    if( *v42 != *(_BYTE *)v40 )
                      break;
                    ++v42;
                    v40 = (_DWORD *)((char *)v40 + 1);
                  }
                }
                else
                {
                  while( 1 )
                  {
                    v43 = *(_DWORD *)v42;
                    v44 = *v40;
                    if( *(_DWORD *)v42 != *v40 )
                      goto LABEL_58;
                    v43 = *((_DWORD *)v42 + 1);
                    v44 = v40[1];
                    if( v43 != v44 )
                      break;
                    v43 = *((_DWORD *)v42 + 2);
                    v44 = v40[2];
                    if( v43 != v44 )
                    {
                      v42 += 8;
                      v40 += 2;
                      goto LABEL_58;
                    }
                    v43 = *((_DWORD *)v42 + 3);
                    v44 = v40[3];
                    if( v43 != v44 )
                    {
                      v42 += 12;
                      v40 += 3;
                      goto LABEL_58;
                    }
                    v43 = *((_DWORD *)v42 + 4);
                    v44 = v40[4];
                    if( v43 != v44 )
                    {
                      v42 += 16;
                      v40 += 4;
                      goto LABEL_58;
                    }
                    v43 = *((_DWORD *)v42 + 5);
                    v44 = v40[5];
                    if( v43 != v44 )
                    {
                      v42 += 20;
                      v40 += 5;
                      goto LABEL_58;
                    }
                    v43 = *((_DWORD *)v42 + 6);
                    v44 = v40[6];
                    if( v43 != v44 )
                    {
                      v42 += 24;
                      v40 += 6;
                      goto LABEL_58;
                    }
                    v43 = *((_DWORD *)v42 + 7);
                    v44 = v40[7];
                    if( v43 != v44 )
                    {
                      v42 += 28;
                      v40 += 7;
                      goto LABEL_58;
                    }
                    v42 += 32;
                    v40 += 8;
                    if( (unsigned __int64)(v42 + 32) >= v17 )
                    {
                      v33 = v72;
                      goto LABEL_47;
                    }
                  }
                  v42 += 4;
                  ++v40;
LABEL_58:
                  if( (_BYTE)v43 == (_BYTE)v44 )
                  {
                    v17 = (unsigned __int64)v61;
                    if( v42[1] != *((_BYTE *)v40 + 1) )
                    {
                      ++v42;
                      v40 = (_DWORD *)((char *)v40 + 1);
                      goto LABEL_61;
                    }
                    v33 = v72;
                    if( v42[2] == *((_BYTE *)v40 + 2) )
                    {
                      v42 += 3;
                      v40 = (_DWORD *)((char *)v40 + 3);
                    }
                    else
                    {
                      v42 += 2;
                      v40 = (_DWORD *)((char *)v40 + 2);
                    }
                  }
                  else
                  {
LABEL_61:
                    v33 = v72;
                  }
                }
                v45 = v42 - v35;
                v46 = (UINT8 *)v40;
                v31 = (char *)v40 - v45;
                if( v45 <= v37 )
                {
                  v36 += v45;
                  goto LABEL_69;
                }
                v72 = v31;
                v37 = v45;
                v33 = v31;
                if( v46 > v35 )
                  goto LABEL_70;
                goto LABEL_69;
              }
            }
          }
        }
LABEL_73:
        ++v14;
        ++Workspace[(unsigned __int8)v30 + 334984];
        *v20++ = v30;
        if( v21 <= 0 )
        {
          *v16 = 2 * v21;
          v21 = 1;
          v16 = (_XPRESS_HUFF_WORKSPACE_MAX *)v20;
          v20 += 4;
        }
        else
        {
          v21 *= 2;
        }
      }
      if( (unsigned __int64)v14 < v23 )
        break;
      v15 = v66;
      v19 = v67;
LABEL_91:
      while( v14 < v19 )
      {
        ++Workspace[*v14 + 334984];
        v57 = *v14++;
        *v20++ = v57;
        if( v21 <= 0 )
        {
          *v16 = 2 * v21;
          v21 = 1;
          v16 = (_XPRESS_HUFF_WORKSPACE_MAX *)v20;
          v20 += 4;
        }
        else
        {
          v21 *= 2;
        }
      }
      for( ; v21 > 0; v21 = 2 * v21 + 1 )
        ;
      *v16 = 2 * v21 + 1;
      if( (unsigned __int64)v14 < v17 )
      {
        v58 = 0;
      }
      else
      {
        ++Workspace[335240];
        v58 = 1;
      }
      if( &v15[4 * ((XpressBuildHuffmanEncodings(Workspace + 327680) + v64 + 31) >> 5) + 258 + v65] >= v68 )
        return -1073741789;
      v16 = Workspace + 335560;
      LODWORD(WriteEof) = v58;
      v59 = XpressDoHuffmanPass(Workspace + 327680, (UINT8 *)Workspace + 1342240, v20, v15, WriteEof);
      v11 = (unsigned int)CallbackContext;
      v15 = v59;
      v66 = v59;
      if( v58 )
      {
        *(_DWORD *)FinalCompressedSize = (_DWORD)v59 - v73;
        return 0;
      }
    }
    XpressCallback = RtlpMakeXpressCallback((__int64)v69, v23, (__int64)v14);
    v23 = v62;
    v22 = XpressCallback;
    v17 = (unsigned __int64)v61;
    v63 = XpressCallback;
    goto LABEL_22;
  }
  return -1073741789;
}

Referenced by:

RtlCompressBufferProgress
RtlCompressBufferXpressHuff