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