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