RtlCompressBufferXpressLzMax
NTSTATUS __stdcall RtlCompressBufferXpressLzMax(
UINT8 *UncompressedBuffer,
UINT64 UncompressedBufferSize,
UINT8 *CompressedBuffer,
UINT64 CompressedBufferSize,
UINT64 *FinalCompressedSize,
_XPRESS_LZ_WORKSPACE_MAX *Workspace,
VOID *Callback,
VOID *a8,
VOID *CallbackContext,
UINT64 ProgressBytes){
UINT8 *v10;
UINT8 *v11;
unsigned int v12;
UINT8 *v14;
__int64 v15;
_XPRESS_LZ_WORKSPACE_MAX *v17;
unsigned __int64 v18;
unsigned int v19;
UINT8 *v20;
UINT8 *v21;
UINT8 *v22;
int v23;
__int16 v24;
UINT8 *v25;
unsigned __int64 v26;
UINT8 *v27;
__int64 v28;
_XPRESS_LZ_WORKSPACE_MAX *v29;
unsigned __int64 v30;
unsigned __int64 v31;
_XPRESS_LZ_WORKSPACE_MAX *v32;
UINT8 *v33;
__int16 v34;
unsigned __int64 XpressCallback;
int v36;
unsigned __int64 v37;
int v38;
bool v39;
__int16 v40;
int v41;
int v42;
UINT8 *v43;
_XPRESS_LZ_WORKSPACE_MAX *v44;
__int64 v45;
unsigned __int64 v46;
UINT8 *v47;
UINT8 *v48;
UINT8 *v49;
int v50;
int v51;
signed __int64 v52;
__int64 v53;
unsigned __int64 v54;
UINT8 v55;
unsigned __int64 v56;
unsigned __int64 v57;
UINT8 v58;
unsigned int v59;
UINT8 *v60;
_XPRESS_LZ_WORKSPACE_MAX *v61;
UINT8 *v62;
UINT8 *v63;
unsigned __int64 v64;
unsigned __int64 v65;
__int16 v66;
UINT8 *v67;
UINT8 *v68;
__int64 v69[2];
unsigned int v70;
int v71;
__int16 v72;
int v73;
v73 = (int)CompressedBuffer;
v72 = (__int16)UncompressedBuffer;
v10 = &UncompressedBuffer[(unsigned int)UncompressedBufferSize];
v11 = &CompressedBuffer[(unsigned int)CompressedBufferSize];
v12 = UncompressedBufferSize;
v71 = 0;
v68 = v11;
v14 = UncompressedBuffer;
v15 = 0i64;
if( (unsigned int)CompressedBufferSize < 0x40 || (unsigned int)UncompressedBufferSize < 8 )
return -1073741789;
if( (unsigned __int64)UncompressedBuffer <= 0x2001 )
return -1073741637;
v17 = Workspace;
memset(Workspace, 0i64, 0x40000u);
v62 = 0i64;
v60 = v11 - 41;
v18 = (unsigned __int64)(v10 - 5);
if( !Callback || (v19 = (unsigned int)CallbackContext, (unsigned int)CallbackContext > v12) )
{
v19 = v12;
LODWORD(CallbackContext) = v12;
}
v69[0] = (__int64)Callback;
v20 = CompressedBuffer + 5;
v21 = v14 + 1;
v69[1] = (__int64)a8;
v22 = CompressedBuffer;
v23 = 2;
CompressedBuffer[4] = *v14;
v24 = 0;
v63 = CompressedBuffer;
v25 = v14;
v70 = v19;
v67 = v14;
while( 2 )
{
v26 = v18;
if( (unsigned __int64)(v25 + 0x2000) <= v18 )
v26 = (unsigned __int64)(v25 + 0x2000);
v27 = &v21[v19];
v65 = v26;
if( v26 < (unsigned __int64)v27 )
v27 = (UINT8 *)v26;
v28 = v24 & 0x3FFF;
v64 = (unsigned __int64)v27;
v66 = v28;
if( (unsigned __int64)v25 < v26 )
{
v29 = &v17[2 * v28 + 0x10000];
do
{
v29 += 2;
LOWORD(v28) = v28 + 1;
v30 = (unsigned __int16)XpressHashFunction[v25[2] + 512] ^ (unsigned __int16)XpressHashFunction[*v25] ^ (unsigned __int64)(unsigned __int16)XpressHashFunction[v25[1] + 256];
*((_QWORD *)v29 - 1) = *(_QWORD *)&v17[2 * v30];
*(_QWORD *)&v17[2 * v30] = v25++;
}
while( (unsigned __int64)v25 < v26 );
v67 = v25;
v66 = v28;
}
v31 = (unsigned __int64)v60;
v32 = v17 + 0x10000;
v61 = v17 + 0x10000;
LABEL_18:
v33 = v21 - 0x2000;
v34 = 0x2000 - (_WORD)v14;
while( 1 )
{
if( v21 < v27 )
goto LABEL_22;
if( (unsigned __int64)v21 >= v26 )
break;
XpressCallback = RtlpMakeXpressCallback((__int64)v69, v26, (__int64)v21);
v22 = v63;
v26 = v65;
v32 = v61;
v31 = (unsigned __int64)v60;
v64 = XpressCallback;
LABEL_22:
v36 = *(_DWORD *)v21;
v37 = *(_QWORD *)&v32[2 * ((v34 + (_WORD)v33) & 0x3FFF)];
if( v37 >= (unsigned __int64)v33 )
{
v38 = *(_DWORD *)v37 ^ v36;
if( !v38 )
{
v40 = v72;
LABEL_37:
v44 = v61;
v45 = 0i64;
v46 = 3i64;
LABEL_38:
v47 = v21;
v48 = v21 + 36;
v49 = v21 + 4;
v37 += 4i64;
if( v48 >= v10 )
{
LABEL_49:
while( v49 < v10 )
{
if( *v49 != *(_BYTE *)v37 )
break;
++v49;
++v37;
}
}
else
{
while( 1 )
{
v50 = *(_DWORD *)v49;
v51 = *(_DWORD *)v37;
if( *(_DWORD *)v49 != *(_DWORD *)v37 )
break;
v50 = *((_DWORD *)v49 + 1);
v51 = *(_DWORD *)(v37 + 4);
if( v50 != v51 )
{
v49 += 4;
v37 += 4i64;
break;
}
v50 = *((_DWORD *)v49 + 2);
v51 = *(_DWORD *)(v37 + 8);
if( v50 != v51 )
{
v49 += 8;
v37 += 8i64;
break;
}
v50 = *((_DWORD *)v49 + 3);
v51 = *(_DWORD *)(v37 + 12);
if( v50 != v51 )
{
v49 += 12;
v37 += 12i64;
break;
}
v50 = *((_DWORD *)v49 + 4);
v51 = *(_DWORD *)(v37 + 16);
if( v50 != v51 )
{
v49 += 16;
v37 += 16i64;
break;
}
v50 = *((_DWORD *)v49 + 5);
v51 = *(_DWORD *)(v37 + 20);
if( v50 != v51 )
{
v49 += 20;
v37 += 20i64;
break;
}
v50 = *((_DWORD *)v49 + 6);
v51 = *(_DWORD *)(v37 + 24);
if( v50 != v51 )
{
v49 += 24;
v37 += 24i64;
break;
}
v50 = *((_DWORD *)v49 + 7);
v51 = *(_DWORD *)(v37 + 28);
if( v50 != v51 )
{
v49 += 28;
v37 += 28i64;
break;
}
v49 += 32;
v37 += 32i64;
if( v49 + 32 >= v10 )
{
v40 = v72;
goto LABEL_49;
}
}
if( (_BYTE)v50 == (_BYTE)v51 )
{
if( v49[1] != *(_BYTE *)(v37 + 1) )
{
++v49;
++v37;
goto LABEL_63;
}
v40 = v72;
if( v49[2] == *(_BYTE *)(v37 + 2) )
{
v49 += 3;
v37 += 3i64;
}
else
{
v49 += 2;
v37 += 2i64;
}
}
else
{
LABEL_63:
v40 = v72;
}
}
v52 = v49 - v47;
if( v49 - v47 <= v46 )
{
v45 += v52;
}
else
{
v46 = v49 - v47;
v15 = (__int64)&v49[-v37];
if( v37 > (unsigned __int64)v47 )
{
v22 = v63;
v21 = v47;
v31 = (unsigned __int64)v60;
goto LABEL_67;
}
}
v22 = v63;
v21 = v47;
v31 = (unsigned __int64)v60;
LOWORD(v37) = v37 - v52;
while( (unsigned __int64)++v45 < 0x18 )
{
LABEL_75:
v37 = *(_QWORD *)&v44[2 * (((_WORD)v37 - v40) & 0x3FFF)];
if( v37 < (unsigned __int64)v33 )
break;
if( v36 == *(_DWORD *)v37 )
goto LABEL_38;
}
LABEL_67:
v21 += v46;
v53 = 8 * v15 - 8;
if( v46 - 3 < 7 )
{
v15 = v46 - 3 + v53;
*(_WORD *)v20 = v15;
v20 += 2;
goto LABEL_91;
}
v15 = v53 | 7;
*(_WORD *)v20 = v15;
v54 = v46 - 10;
v20 += 2;
if( v62 )
{
v55 = *v62;
if( v54 < 0xF )
{
*v62 = v55 | (16 * v54);
v62 = 0i64;
goto LABEL_90;
}
*v62 = v55 | 0xF0;
v62 = 0i64;
}
else
{
v62 = v20;
if( v54 < 0xF )
{
*v20++ = v54;
LABEL_90:
v31 = (unsigned __int64)v60;
LABEL_91:
if( v23 <= 0 )
{
*(_DWORD *)v22 = 2 * v23 + 1;
v23 = 1;
v22 = v20;
v63 = v20;
v20 += 4;
}
else
{
v23 = 2 * v23 + 1;
}
if( (unsigned __int64)v20 < v31 )
{
LOWORD(v14) = v72;
v26 = v65;
v32 = v61;
v27 = (UINT8 *)v64;
goto LABEL_18;
}
goto LABEL_97;
}
*v20++ = 15;
}
v56 = v46 - 25;
if( v46 - 25 >= 0xFF )
{
v57 = v56 + 22;
*v20 = -1;
if( v57 >= 0x10000 )
{
*(_WORD *)(v20 + 1) = 0;
*(_DWORD *)(v20 + 3) = v57;
v20 += 7;
}
else
{
*(_WORD *)(v20 + 1) = v57;
v20 += 3;
}
}
else
{
*v20++ = v56;
}
goto LABEL_90;
}
v39 = (v38 & 0xFFFFFF) == 0;
v40 = v72;
if( v39 )
goto LABEL_35;
v37 = *(_QWORD *)&v32[2 * (((_WORD)v37 - v72) & 0x3FFF)];
if( v37 >= (unsigned __int64)v33 )
{
v41 = *(_DWORD *)v37 ^ v36;
if( !v41 )
goto LABEL_37;
if( (v41 & 0xFFFFFF) == 0 )
goto LABEL_35;
v37 = *(_QWORD *)&v32[2 * (((_WORD)v37 - v72) & 0x3FFF)];
if( v37 >= (unsigned __int64)v33 )
{
v42 = *(_DWORD *)v37 ^ v36;
if( !v42 )
goto LABEL_37;
if( (v42 & 0xFFFFFF) == 0 )
{
LABEL_35:
v44 = v61;
v33 = v21 - 0x2000;
v15 = (__int64)&v21[-v37];
v45 = 0i64;
v46 = 3i64;
goto LABEL_75;
}
}
}
}
*v20++ = v36;
++v21;
++v33;
v43 = v20;
if( v23 <= 0 )
{
v20 += 4;
*(_DWORD *)v22 = 2 * v23;
v23 = 1;
v22 = v43;
if( (unsigned __int64)v20 >= v31 )
goto LABEL_97;
v63 = v43;
v27 = (UINT8 *)v64;
}
else
{
v27 = (UINT8 *)v64;
v23 *= 2;
}
}
LOWORD(v14) = v72;
v18 = (unsigned __int64)(v10 - 5);
v19 = (unsigned int)CallbackContext;
v17 = Workspace;
v24 = v66;
v25 = v67;
if( v21 < v10 - 5 )
continue;
break;
}
LABEL_97:
if( v21 >= v10 )
{
LABEL_103:
if( v20 >= v68 )
return -1073741789;
for( ; v23 > 0; v23 = 2 * v23 + 1 )
;
v59 = (_DWORD)v20 - v73;
*(_DWORD *)v22 = 2 * v23 + 1;
if( v59 < 8 )
v59 = 8;
*(_DWORD *)FinalCompressedSize = v59;
return 0;
}
else
{
while( v20 < v68 )
{
v58 = *v21++;
*v20++ = v58;
if( v23 <= 0 )
{
*(_DWORD *)v22 = 2 * v23;
v23 = 1;
v22 = v20;
v20 += 4;
}
else
{
v23 *= 2;
}
if( v21 >= v10 )
goto LABEL_103;
}
return -1073741789;
}
}Referenced by:
RtlCompressBufferProgress
RtlCompressBufferXpressLz