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