RtlCompressBufferXpressLzMax
INT64 __fastcall RtlCompressBufferXpressLzMax(
UINT64 a1,
UINT64 a2,
INT64 a3,
UINT64 a4,
UINT64 *a5,
INT64 result,
INT64 a7,
INT64 a8,
UINT64 a9){
UINT64 v9;
INT64 v10;
unsigned int v11;
unsigned __int8 *v13;
__int64 v14;
INT64 v16;
unsigned __int64 v17;
unsigned int v18;
_BYTE *v19;
char *v20;
_DWORD *v21;
int v22;
__int16 v23;
unsigned __int8 *v24;
UINT64 v25;
char *v26;
__int64 v27;
INT64 v28;
unsigned __int64 v29;
unsigned __int64 v30;
INT64 v31;
char *v32;
__int16 v33;
UINT64 XpressCallback;
int v35;
unsigned __int64 v36;
int v37;
bool v38;
__int16 v39;
int v40;
int v41;
_DWORD *v42;
INT64 v43;
__int64 v44;
unsigned __int64 v45;
char *v46;
_BYTE *v47;
_BYTE *v48;
int v49;
int v50;
__int64 v51;
__int64 v52;
unsigned __int64 v53;
char v54;
unsigned __int64 v55;
unsigned __int64 v56;
char v57;
unsigned int v58;
INT64 v59;
INT64 v60;
char *v61;
INT64 v62;
UINT64 v63;
UINT64 v64;
__int16 v65;
unsigned __int8 *v66;
unsigned __int64 v67;
INT64 v68[2];
unsigned int v69;
int v70;
__int16 v71;
int v72;
v72 = a3;
v71 = a1;
v9 = a1 + (unsigned int)a2;
v10 = a3 + (unsigned int)a4;
v11 = a2;
v70 = 0;
v67 = v10;
v13 = (unsigned __int8 *)a1;
v14 = 0i64;
if( (unsigned int)a4 < 0x40 || (unsigned int)a2 < 8 )
return 3221225507i64;
if( a1 <= 0x2001 )
return 3221225659i64;
v16 = result;
memset(result, 0i64);
v61 = 0i64;
v59 = v10 - 41;
v17 = v9 - 5;
if( !a7 || (v18 = a9, (unsigned int)a9 > v11) )
{
v18 = v11;
LODWORD(a9) = v11;
}
v68[0] = a7;
v19 = (_BYTE *)(a3 + 5);
v20 = (char *)(v13 + 1);
v68[1] = a8;
v21 = (_DWORD *)a3;
v22 = 2;
*(_BYTE *)(a3 + 4) = *v13;
v23 = 0;
v62 = a3;
v24 = v13;
v69 = v18;
v66 = v13;
while( 2 )
{
v25 = v17;
if( (unsigned __int64)(v24 + 0x2000) <= v17 )
v25 = (UINT64)(v24 + 0x2000);
v26 = &v20[v18];
v64 = v25;
if( v25 < (unsigned __int64)v26 )
v26 = (char *)v25;
v27 = v23 & 0x3FFF;
v63 = (UINT64)v26;
v65 = v27;
if( (unsigned __int64)v24 < v25 )
{
v28 = v16 + 8 * (v27 + 0x8000);
do
{
v28 += 8i64;
LOWORD(v27) = v27 + 1;
v29 = (unsigned __int16)XpressHashFunction[v24[2] + 512] ^ (unsigned __int16)XpressHashFunction[*v24] ^ (unsigned __int64)(unsigned __int16)XpressHashFunction[v24[1] + 256];
*(_QWORD *)(v28 - 8) = *(_QWORD *)(v16 + 8 * v29);
*(_QWORD *)(v16 + 8 * v29) = v24++;
}
while( (unsigned __int64)v24 < v25 );
v66 = v24;
v65 = v27;
}
v30 = v59;
v31 = v16 + 0x40000;
v60 = v16 + 0x40000;
LABEL_18:
v32 = v20 - 0x2000;
v33 = 0x2000 - (_WORD)v13;
while( 1 )
{
if( v20 < v26 )
goto LABEL_22;
if( (unsigned __int64)v20 >= v25 )
break;
XpressCallback = RtlpMakeXpressCallback((INT64)v68, v25, (INT64)v20);
v21 = (_DWORD *)v62;
v25 = v64;
v31 = v60;
v30 = v59;
v63 = XpressCallback;
LABEL_22:
v35 = *(_DWORD *)v20;
v36 = *(_QWORD *)(v31 + 8i64 * ((v33 + (_WORD)v32) & 0x3FFF));
if( v36 >= (unsigned __int64)v32 )
{
v37 = *(_DWORD *)v36 ^ v35;
if( !v37 )
{
v39 = v71;
LABEL_37:
v43 = v60;
v44 = 0i64;
v45 = 3i64;
LABEL_38:
v46 = v20;
v47 = v20 + 36;
v48 = v20 + 4;
v36 += 4i64;
if( (unsigned __int64)v47 >= v9 )
{
LABEL_49:
while( (unsigned __int64)v48 < v9 )
{
if( *v48 != *(_BYTE *)v36 )
break;
++v48;
++v36;
}
}
else
{
while( 1 )
{
v49 = *(_DWORD *)v48;
v50 = *(_DWORD *)v36;
if( *(_DWORD *)v48 != *(_DWORD *)v36 )
break;
v49 = *((_DWORD *)v48 + 1);
v50 = *(_DWORD *)(v36 + 4);
if( v49 != v50 )
{
v48 += 4;
v36 += 4i64;
break;
}
v49 = *((_DWORD *)v48 + 2);
v50 = *(_DWORD *)(v36 + 8);
if( v49 != v50 )
{
v48 += 8;
v36 += 8i64;
break;
}
v49 = *((_DWORD *)v48 + 3);
v50 = *(_DWORD *)(v36 + 12);
if( v49 != v50 )
{
v48 += 12;
v36 += 12i64;
break;
}
v49 = *((_DWORD *)v48 + 4);
v50 = *(_DWORD *)(v36 + 16);
if( v49 != v50 )
{
v48 += 16;
v36 += 16i64;
break;
}
v49 = *((_DWORD *)v48 + 5);
v50 = *(_DWORD *)(v36 + 20);
if( v49 != v50 )
{
v48 += 20;
v36 += 20i64;
break;
}
v49 = *((_DWORD *)v48 + 6);
v50 = *(_DWORD *)(v36 + 24);
if( v49 != v50 )
{
v48 += 24;
v36 += 24i64;
break;
}
v49 = *((_DWORD *)v48 + 7);
v50 = *(_DWORD *)(v36 + 28);
if( v49 != v50 )
{
v48 += 28;
v36 += 28i64;
break;
}
v48 += 32;
v36 += 32i64;
if( (unsigned __int64)(v48 + 32) >= v9 )
{
v39 = v71;
goto LABEL_49;
}
}
if( (_BYTE)v49 == (_BYTE)v50 )
{
if( v48[1] != *(_BYTE *)(v36 + 1) )
{
++v48;
++v36;
goto LABEL_63;
}
v39 = v71;
if( v48[2] == *(_BYTE *)(v36 + 2) )
{
v48 += 3;
v36 += 3i64;
}
else
{
v48 += 2;
v36 += 2i64;
}
}
else
{
LABEL_63:
v39 = v71;
}
}
v51 = v48 - v46;
if( v48 - v46 <= v45 )
{
v44 += v51;
}
else
{
v45 = v48 - v46;
v14 = (__int64)&v48[-v36];
if( v36 > (unsigned __int64)v46 )
{
v21 = (_DWORD *)v62;
v20 = v46;
v30 = v59;
goto LABEL_67;
}
}
v21 = (_DWORD *)v62;
v20 = v46;
v30 = v59;
LOWORD(v36) = v36 - v51;
while( (unsigned __int64)++v44 < 0x18 )
{
LABEL_75:
v36 = *(_QWORD *)(v43 + 8i64 * (((_WORD)v36 - v39) & 0x3FFF));
if( v36 < (unsigned __int64)v32 )
break;
if( v35 == *(_DWORD *)v36 )
goto LABEL_38;
}
LABEL_67:
v20 += v45;
v52 = 8 * v14 - 8;
if( v45 - 3 < 7 )
{
v14 = v45 - 3 + v52;
*(_WORD *)v19 = v14;
v19 += 2;
goto LABEL_91;
}
v14 = v52 | 7;
*(_WORD *)v19 = v14;
v53 = v45 - 10;
v19 += 2;
if( v61 )
{
v54 = *v61;
if( v53 < 0xF )
{
*v61 = v54 | (16 * v53);
v61 = 0i64;
goto LABEL_90;
}
*v61 = v54 | 0xF0;
v61 = 0i64;
}
else
{
v61 = v19;
if( v53 < 0xF )
{
*v19++ = v53;
LABEL_90:
v30 = v59;
LABEL_91:
if( v22 <= 0 )
{
*v21 = 2 * v22 + 1;
v22 = 1;
v21 = v19;
v62 = (INT64)v19;
v19 += 4;
}
else
{
v22 = 2 * v22 + 1;
}
if( (unsigned __int64)v19 < v30 )
{
LOWORD(v13) = v71;
v25 = v64;
v31 = v60;
v26 = (char *)v63;
goto LABEL_18;
}
goto LABEL_97;
}
*v19++ = 15;
}
v55 = v45 - 25;
if( v45 - 25 >= 0xFF )
{
v56 = v55 + 22;
*v19 = -1;
if( v56 >= 0x10000 )
{
*(_WORD *)(v19 + 1) = 0;
*(_DWORD *)(v19 + 3) = v56;
v19 += 7;
}
else
{
*(_WORD *)(v19 + 1) = v56;
v19 += 3;
}
}
else
{
*v19++ = v55;
}
goto LABEL_90;
}
v38 = (v37 & 0xFFFFFF) == 0;
v39 = v71;
if( v38 )
goto LABEL_35;
v36 = *(_QWORD *)(v31 + 8i64 * (((_WORD)v36 - v71) & 0x3FFF));
if( v36 >= (unsigned __int64)v32 )
{
v40 = *(_DWORD *)v36 ^ v35;
if( !v40 )
goto LABEL_37;
if( (v40 & 0xFFFFFF) == 0 )
goto LABEL_35;
v36 = *(_QWORD *)(v31 + 8i64 * (((_WORD)v36 - v71) & 0x3FFF));
if( v36 >= (unsigned __int64)v32 )
{
v41 = *(_DWORD *)v36 ^ v35;
if( !v41 )
goto LABEL_37;
if( (v41 & 0xFFFFFF) == 0 )
{
LABEL_35:
v43 = v60;
v32 = v20 - 0x2000;
v14 = (__int64)&v20[-v36];
v44 = 0i64;
v45 = 3i64;
goto LABEL_75;
}
}
}
}
*v19++ = v35;
++v20;
++v32;
v42 = v19;
if( v22 <= 0 )
{
v19 += 4;
*v21 = 2 * v22;
v22 = 1;
v21 = v42;
if( (unsigned __int64)v19 >= v30 )
goto LABEL_97;
v62 = (INT64)v42;
v26 = (char *)v63;
}
else
{
v26 = (char *)v63;
v22 *= 2;
}
}
LOWORD(v13) = v71;
v17 = v9 - 5;
v18 = a9;
v16 = result;
v23 = v65;
v24 = v66;
if( (unsigned __int64)v20 < v9 - 5 )
continue;
break;
}
LABEL_97:
if( (unsigned __int64)v20 >= v9 )
{
LABEL_103:
if( (unsigned __int64)v19 >= v67 )
return 3221225507i64;
for( ; v22 > 0; v22 = 2 * v22 + 1 )
;
v58 = (_DWORD)v19 - v72;
*v21 = 2 * v22 + 1;
if( v58 < 8 )
v58 = 8;
*(_DWORD *)a5 = v58;
return 0i64;
}
else
{
while( (unsigned __int64)v19 < v67 )
{
v57 = *v20++;
*v19++ = v57;
if( v22 <= 0 )
{
*v21 = 2 * v22;
v22 = 1;
v21 = v19;
v19 += 4;
}
else
{
v22 *= 2;
}
if( (unsigned __int64)v20 >= v9 )
goto LABEL_103;
}
return 3221225507i64;
}
}Referenced by:
RtlCompressBufferProgress
RtlCompressBufferXpressLz