XpressBuildHuffmanEncodings
UINT64 __stdcall XpressBuildHuffmanEncodings(_HUFFMAN_WORKSPACE *Workspace){
UINT64 *v2;
_HUFFMAN_WORKSPACE *v3;
_HUFFMAN_WORKSPACE *v4;
unsigned __int64 i;
unsigned __int64 v6;
_HUFFMAN_WORKSPACE *v7;
_WORD *v8;
__int64 v9;
_HUFFMAN_WORKSPACE *v10;
_HUFFMAN_WORKSPACE v11;
__int64 v12;
_HUFFMAN_WORKSPACE *v13;
__int64 v14;
unsigned __int64 v15;
char *v16;
__int64 v17;
_HUFFMAN_WORKSPACE *v18;
_HUFFMAN_WORKSPACE *v19;
_HUFFMAN_WORKSPACE *v20;
__int64 v21;
__int64 v22;
__int64 v23;
__int64 v24;
__int64 v25;
unsigned __int64 v26;
unsigned __int64 v27;
__int64 v28;
UINT64 j;
__int64 v30;
_HUFFMAN_WORKSPACE *v31;
unsigned __int64 v32;
_HUFFMAN_WORKSPACE *v33;
unsigned __int64 v34;
__int64 v36;
__int64 v37;
char v38;
_HUFFMAN_WORKSPACE *v39;
unsigned __int64 v40;
memset(Workspace + 6662, 0i64, 0x404u);
v2 = (UINT64 *)(Workspace + 512);
v3 = Workspace + 512;
memset(Workspace + 7176, 0i64, 0x200u);
v4 = Workspace + 7304;
for( i = 0i64; i < 0x200; ++i )
{
v6 = (unsigned int)*v4;
if( *v4 )
{
*(_QWORD *)v3 = v6;
++*((_WORD *)Workspace + (unsigned __int8)v6 + 13325);
++*((_WORD *)Workspace + (v6 >> 8) + 13582);
*((_QWORD *)v3 + 1) = 0i64;
*((_QWORD *)v3 + 2) = i;
v3 += 6;
}
++v4;
}
memset(Workspace + 7816, 0i64, 0x100u);
v7 = Workspace + 518;
if( v3 <= Workspace + 518 )
{
if( v3 == (_HUFFMAN_WORKSPACE *)v2 )
return 0i64;
v37 = *((_QWORD *)Workspace + 258);
v38 = 16;
if( (v37 & 1) == 0 )
v38 = 1;
*((_BYTE *)Workspace + (*((_QWORD *)Workspace + 258) >> 1) + 31264) = v38;
Workspace[v37] = 1;
return *v2;
}
v8 = (_WORD *)Workspace + 13325;
v9 = 255i64;
do
{
*v8 += *(v8 - 1);
v8[257] += v8[256];
++v8;
--v9;
}
while( v9 );
v10 = Workspace + 512;
if( v2 < (UINT64 *)v3 )
{
do
{
*((_WORD *)Workspace + *((unsigned __int16 *)Workspace + (unsigned __int8)*v10 + 13324) + 13838) = *((_WORD *)v10 + 8);
v11 = *v10;
v10 += 6;
++*((_WORD *)Workspace + (unsigned __int8)v11 + 13324);
}
while( v10 < v3 );
}
v12 = ((char *)v3 - (char *)Workspace - 2048) / 24;
if( v12 )
{
v13 = Workspace + 6919;
do
{
v14 = *(unsigned __int16 *)v13;
v13 = (_HUFFMAN_WORKSPACE *)((char *)v13 + 2);
v15 = (unsigned int)Workspace[v14 + 7304];
v16 = (char *)Workspace + 2 * (v15 >> 8);
v17 = *((unsigned __int16 *)v16 + 13581);
*((_WORD *)v16 + 13581) = v17 + 1;
*(_QWORD *)&Workspace[6 * v17 + 516] = v14;
*(_QWORD *)&Workspace[6 * v17 + 512] = v15;
--v12;
}
while( v12 );
}
while( 2 )
{
*((_QWORD *)v3 + 1) = v2;
v18 = Workspace + 524;
*((_QWORD *)v3 + 2) = v7;
v19 = v3;
v20 = v3;
*(_QWORD *)v3 = *v2 + *(_QWORD *)v7;
while( v18 != v3 || v20 != v19 )
{
v19 += 6;
if( v18 == v3 || v20 < v19 && *(_QWORD *)v20 < *(_QWORD *)v18 )
{
*((_QWORD *)v19 + 1) = v20;
v21 = *(_QWORD *)v20;
v20 += 6;
}
else
{
*((_QWORD *)v19 + 1) = v18;
v21 = *(_QWORD *)v18;
v18 += 6;
}
*(_QWORD *)v19 = v21;
if( v18 == v3 || v20 < v19 && *(_QWORD *)v20 < *(_QWORD *)v18 )
{
*((_QWORD *)v19 + 2) = v20;
*(_QWORD *)v19 += *(_QWORD *)v20;
v20 += 6;
}
else
{
*((_QWORD *)v19 + 2) = v18;
*(_QWORD *)v19 += *(_QWORD *)v18;
v18 += 6;
}
}
v22 = 0i64;
v23 = 0i64;
while( *((_QWORD *)v19 + 1) )
{
*(_QWORD *)&Workspace[4 * v23 + 6664] = ++v22;
*(_QWORD *)&Workspace[4 * v23 + 6662] = *((_QWORD *)v19 + 1);
v25 = 1i64;
v19 = (_HUFFMAN_WORKSPACE *)*((_QWORD *)v19 + 2);
LABEL_30:
v23 += v25;
}
v24 = *((_QWORD *)v19 + 2);
*((_QWORD *)v19 + 1) = v22;
*((_BYTE *)Workspace + v24 + 28704) = v22;
if( v23 )
{
v19 = *(_HUFFMAN_WORKSPACE **)&Workspace[4 * v23 + 6658];
v22 = *(_QWORD *)&Workspace[4 * v23 + 6660];
v25 = -1i64;
goto LABEL_30;
}
v26 = *((_QWORD *)Workspace + 257);
if( v26 > 0xF )
{
v39 = Workspace + 512;
if( v2 < (UINT64 *)v3 )
{
do
{
v40 = *(_QWORD *)v39 + 1i64;
*((_QWORD *)v39 + 1) = 0i64;
*(_QWORD *)v39 = v40 >> 1;
v39 += 6;
}
while( v39 < v3 );
}
continue;
}
break;
}
v27 = *((_QWORD *)v3 - 2);
v28 = 0i64;
for( j = 0i64; v27 <= v26; j += v34 )
{
v30 = 0i64;
v31 = Workspace + 7816;
v32 = 0i64;
v33 = Workspace + 7304;
do
{
if( *((unsigned __int8 *)Workspace + v32 + 28704) == v27 )
{
v36 = (unsigned int)*v33;
*(_BYTE *)v31 |= v27;
v30 += v36;
HIWORD(Workspace[v32]) = v28++;
LOWORD(Workspace[v32]) = v27;
}
if( *((unsigned __int8 *)Workspace + v32 + 28705) == v27 )
{
v30 += (unsigned int)v33[1];
*(_BYTE *)v31 |= 16 * (_BYTE)v27;
HIWORD(Workspace[v32 + 1]) = v28++;
LOWORD(Workspace[v32 + 1]) = v27;
}
v31 = (_HUFFMAN_WORKSPACE *)((char *)v31 + 1);
v32 += 2i64;
v33 += 2;
}
while( v32 < 0x200 );
v34 = v27 * v30;
v28 *= 2i64;
++v27;
}
return j;
}Referenced by:
RtlCompressBufferXpressHuffMax
RtlCompressBufferXpressHuffStandard