RtlCompressBufferXpressLzStandard
VOID __fastcall RtlCompressBufferXpressLzStandard(
_BYTE *a1,
UINT64 a2,
_DWORD *a3,
UINT64 a4,
INT64 FinalCompressedSize,
INT64 Workspace,
INT64 Callback,
INT64 CallbackContext,
INT64 ProgressBytes){
char *v9;
unsigned __int8 *v10;
char *v11;
UINT64 v13;
unsigned __int64 v14;
int v15;
char *v16;
unsigned __int8 *v17;
unsigned __int8 *XpressCallback;
char v19;
int v20;
char *v21;
_BYTE *v22;
_DWORD *v23;
INT64 v24;
__int64 v25;
unsigned __int8 *v26;
__int64 v27;
char *v28;
__int64 v29;
unsigned __int8 *v30;
__int64 v31;
__int64 v32;
__int64 v33;
__int64 v34;
int v35;
int v36;
unsigned __int64 v37;
__int16 v38;
__int64 v39;
unsigned __int8 *v40;
unsigned __int64 v41;
__int64 v42;
unsigned __int8 *v43;
unsigned __int64 v44;
unsigned __int64 v45;
unsigned __int8 *v46;
char v47;
__int64 v48;
__int64 v49;
unsigned __int64 v50;
char v51;
unsigned int v52;
unsigned __int64 v53;
UINT64 v54;
char *v55;
char *v56;
char *v57;
UINT64 v58;
unsigned __int8 *v59;
char *v60;
INT64 v61[2];
int v62;
int v63;
unsigned __int8 *v64;
unsigned __int8 v65;
v9 = (char *)a3;
v10 = &a1[(unsigned int)a2];
v63 = 0;
v11 = &v9[(unsigned int)a4];
v59 = v10;
v60 = v11;
if( (unsigned int)a4 < 0x40 || (unsigned int)a2 < 8 )
return;
v13 = (UINT64)(v10 - 38);
v14 = (unsigned __int64)(v11 - 41);
v55 = v11 - 41;
v58 = (UINT64)(v10 - 38);
v56 = 0i64;
if( !Callback || (v15 = ProgressBytes, (unsigned int)ProgressBytes > (unsigned int)a2) )
v15 = a2;
v16 = v9 + 5;
v17 = a1 + 1;
XpressCallback = &a1[v15];
v61[1] = CallbackContext;
v19 = *a1;
v61[0] = Callback;
v20 = 2;
if( v13 < (unsigned __int64)XpressCallback )
XpressCallback = v10 - 38;
v62 = v15;
v64 = XpressCallback;
v21 = v9;
v9[4] = v19;
if( (unsigned int)a2 < 0x40 )
goto LABEL_84;
v22 = a1;
v23 = a3;
v57 = (char *)a3;
memset64((void *)Workspace, (unsigned __int64)v22, 0xAF6ui64);
memset64((void *)(Workspace + 22448), (unsigned __int64)v22, 0x12EEui64);
while( 1 )
{
while( 1 )
{
while( 1 )
{
v24 = Workspace + 8i64 * *v17;
v25 = v17[2] + 4i64 * v17[1];
v26 = *(unsigned __int8 **)(v24 + 16 * v25);
*(_QWORD *)(v24 + 16 * v25) = v17;
v27 = *v17;
if( *(_WORD *)v26 != *(_WORD *)v17 || v26[2] != v17[2] || v17 - v26 >= 0x2000 )
break;
v29 = v26[3];
v30 = v17;
v31 = v17[3];
if( (_BYTE)v31 != (_BYTE)v29 )
{
v39 = v27 + 2 * v25;
v40 = *(unsigned __int8 **)(Workspace + 8 * (v39 + v31) + 22448);
*(_QWORD *)(Workspace + 8 * (v39 + v29) + 22448) = v26;
if( v17 - v40 >= 0x2000 )
goto LABEL_35;
v41 = *(unsigned int *)v17;
if( (_DWORD)v41 != *(_DWORD *)v40 )
goto LABEL_35;
v26 = v40;
*(_QWORD *)(Workspace + 8 * (v39 + (v41 >> 24)) + 22448) = v17;
}
v32 = v26[4];
v33 = v17[4];
if( (_BYTE)v33 != (_BYTE)v32 )
{
v42 = 2
* ((unsigned __int8)__ROR1__(v17[1] ^ __ROL1__(*v17 + v17[3], 3), 1)
+ 4i64 * (unsigned __int8)__ROL1__(*v17 ^ __ROR1__(v17[1] + v17[2] + 97, 1), 3));
v43 = *(unsigned __int8 **)(Workspace + 8 * (v42 + v33) + 22448);
*(_QWORD *)(Workspace + 8 * (v42 + v32) + 22448) = v26;
if( v17 - v43 >= 0x2000
|| *(_DWORD *)v17 != *(_DWORD *)v43
|| (v48 = v17[4], (_BYTE)v48 != v43[4])
|| v17 == v43 )
{
v17 += 4;
LOWORD(v26) = (_WORD)v26 + 4;
goto LABEL_25;
}
v26 = v43;
*(_QWORD *)(Workspace + 8 * (v42 + v48) + 22448) = v17;
}
v34 = v26[5];
v65 = v17[5];
if( v65 != (_BYTE)v34 )
{
v45 = 2
* ((v17[2] ^ (unsigned __int64)(unsigned __int8)__ROL1__(*v17, v17[4]))
+ 4
* ((unsigned __int8)__ROL1__(v17[4] ^ (__ROR1__(*v17, 1) + 69), 3)
+ (unsigned __int64)(unsigned __int8)__ROR1__(v17[1] ^ __ROL1__(v17[3], 3), 1)));
v46 = *(unsigned __int8 **)(Workspace + 8 * (v45 + v65) + 22448);
*(_QWORD *)(Workspace + 8 * (v45 + v34) + 22448) = v26;
if( v17 - v46 >= 0x2000
|| *(_DWORD *)v17 != *(_DWORD *)v46
|| v17[4] != v46[4]
|| (v49 = v17[5], (_BYTE)v49 != v46[5])
|| v17 == v46 )
{
v17 += 5;
LOWORD(v26) = (_WORD)v26 + 5;
goto LABEL_25;
}
v26 = v46;
*(_QWORD *)(Workspace + 8 * (v45 + v49) + 22448) = v17;
}
v17 += 6;
v26 += 6;
if( (unsigned __int64)v17 >= v58 )
{
LABEL_44:
while( v17 < v59 )
{
if( *v17 != *v26 )
break;
++v17;
++v26;
}
goto LABEL_25;
}
while( 1 )
{
v35 = *(_DWORD *)v17;
v36 = *(_DWORD *)v26;
if( *(_DWORD *)v17 != *(_DWORD *)v26 )
break;
v36 = *((_DWORD *)v26 + 1);
v35 = *((_DWORD *)v17 + 1);
if( v35 != v36 )
{
v17 += 4;
v26 += 4;
break;
}
v36 = *((_DWORD *)v26 + 2);
v35 = *((_DWORD *)v17 + 2);
if( v35 != v36 )
{
v17 += 8;
v26 += 8;
break;
}
v36 = *((_DWORD *)v26 + 3);
v35 = *((_DWORD *)v17 + 3);
if( v35 != v36 )
{
v17 += 12;
v26 += 12;
break;
}
v36 = *((_DWORD *)v26 + 4);
v35 = *((_DWORD *)v17 + 4);
if( v35 != v36 )
{
v17 += 16;
v26 += 16;
break;
}
v36 = *((_DWORD *)v26 + 5);
v35 = *((_DWORD *)v17 + 5);
if( v35 != v36 )
{
v17 += 20;
v26 += 20;
break;
}
v36 = *((_DWORD *)v26 + 6);
v35 = *((_DWORD *)v17 + 6);
if( v35 != v36 )
{
v17 += 24;
v26 += 24;
break;
}
v36 = *((_DWORD *)v26 + 7);
v35 = *((_DWORD *)v17 + 7);
if( v35 != v36 )
{
v17 += 28;
v26 += 28;
break;
}
v17 += 32;
v26 += 32;
if( (unsigned __int64)v17 >= v58 )
goto LABEL_44;
}
if( (_BYTE)v35 != (_BYTE)v36 )
goto LABEL_25;
if( v17[1] != v26[1] )
{
++v17;
LOWORD(v26) = (_WORD)v26 + 1;
LABEL_25:
v14 = (unsigned __int64)v55;
XpressCallback = v64;
goto LABEL_26;
}
XpressCallback = v64;
v14 = (unsigned __int64)v55;
if( v17[2] != v26[2] )
{
v17 += 2;
LOWORD(v26) = (_WORD)v26 + 2;
goto LABEL_26;
}
LABEL_35:
v17 += 3;
LOWORD(v26) = (_WORD)v26 + 3;
LABEL_26:
v37 = v17 - v30 - 3;
v38 = 8 * ((_WORD)v17 - (_WORD)v26) - 8;
if( v37 < 7 )
{
*(_WORD *)v16 = v37 + v38;
v16 += 2;
goto LABEL_28;
}
*(_WORD *)v16 = v38 | 7;
v44 = v17 - v30 - 10;
v16 += 2;
if( !v56 )
{
v56 = v16;
if( v44 < 0xF )
{
*v16++ = v44;
goto LABEL_28;
}
*v16++ = 15;
LABEL_74:
v50 = v17 - v30 - 25;
if( v50 >= 0xFF )
{
v53 = v50 + 22;
*v16 = -1;
if( v53 >= 0x10000 )
{
*(_WORD *)(v16 + 1) = 0;
*(_DWORD *)(v16 + 3) = v53;
v16 += 7;
}
else
{
*(_WORD *)(v16 + 1) = v53;
v16 += 3;
}
}
else
{
*v16++ = v50;
}
goto LABEL_28;
}
v47 = *v56;
if( v44 >= 0xF )
{
*v56 = v47 | 0xF0;
v56 = 0i64;
goto LABEL_74;
}
*v56 = v47 | (16 * v44);
v56 = 0i64;
LABEL_28:
v21 = v57;
if( v20 <= 0 )
{
*(_DWORD *)v57 = 2 * v20 + 1;
v20 = 1;
v21 = v16;
v57 = v16;
v16 += 4;
}
else
{
v20 = 2 * v20 + 1;
}
if( v17 >= XpressCallback )
{
if( (unsigned __int64)v17 >= v58 )
goto LABEL_83;
XpressCallback = (unsigned __int8 *)RtlpMakeXpressCallback((INT64)v61, v58, (INT64)v17);
v64 = XpressCallback;
}
v13 = v58;
if( (unsigned __int64)v16 >= v14 )
goto LABEL_83;
v23 = v57;
}
*v16++ = v27;
++v17;
v28 = v16;
if( v20 <= 0 )
break;
v20 *= 2;
}
v16 += 4;
*v23 = 2 * v20;
v20 = 1;
if( v17 >= XpressCallback )
break;
LABEL_58:
v21 = v28;
if( (unsigned __int64)v16 >= v14 )
goto LABEL_83;
v23 = v28;
v57 = v28;
}
v21 = v28;
if( (unsigned __int64)v17 < v13 )
{
v54 = RtlpMakeXpressCallback((INT64)v61, v13, (INT64)v17);
v13 = v58;
XpressCallback = (unsigned __int8 *)v54;
v64 = (unsigned __int8 *)v54;
goto LABEL_58;
}
LABEL_83:
v10 = v59;
v11 = v60;
LODWORD(v9) = (_DWORD)a3;
LABEL_84:
if( v17 >= v10 )
{
LABEL_89:
if( v16 < v11 )
{
for( ; v20 > 0; v20 = 2 * v20 + 1 )
;
v52 = (_DWORD)v16 - (_DWORD)v9;
*(_DWORD *)v21 = 2 * v20 + 1;
*(_DWORD *)FinalCompressedSize = v52;
if( v52 < 8 )
*(_DWORD *)FinalCompressedSize = 8;
}
}
else
{
while( v16 < v11 )
{
v51 = *v17++;
*v16++ = v51;
if( v20 <= 0 )
{
*(_DWORD *)v21 = 2 * v20;
v20 = 1;
v21 = v16;
v16 += 4;
}
else
{
v20 *= 2;
}
if( v17 >= v10 )
goto LABEL_89;
}
}
}Referenced by:
RtlCompressBufferProgress
RtlCompressBufferXpressLz