RtlCompressBufferXpressHuffStandard
NTSTATUS __stdcall RtlCompressBufferXpressHuffStandard(
UINT8 *UncompressedBuffer,
UINT64 UncompressedBufferSize,
UINT8 *CompressedBuffer,
UINT64 CompressedBufferSize,
UINT64 *FinalCompressedSize,
_XPRESS_HUFF_WORKSPACE *Workspace,
VOID *Callback,
VOID *a8,
VOID *CallbackContext,
UINT64 ProgressBytes){
UINT8 *v10;
UINT8 *v11;
unsigned int v12;
_XPRESS_HUFF_WORKSPACE *v13;
_XPRESS_HUFF_WORKSPACE *v14;
__int64 v15;
__int64 v16;
__int64 v17;
UINT8 *v18;
unsigned __int64 XpressCallback;
bool v20;
UINT8 *v21;
int v22;
UINT8 v23;
UINT8 *v24;
UINT8 *v25;
_XPRESS_HUFF_WORKSPACE *v26;
__int64 v27;
UINT8 *v28;
__int64 v29;
__int64 v30;
UINT8 *v31;
__int64 v32;
__int64 v33;
__int64 v34;
int v35;
int v36;
__int64 v37;
UINT8 *v38;
unsigned __int64 v39;
unsigned __int64 v40;
__int64 v41;
unsigned __int64 v42;
char v43;
unsigned __int64 v44;
UINT8 *v45;
UINT8 v46;
_WORD *v47;
int v48;
UINT8 v49;
int v50;
UINT8 *v51;
bool v52;
__int64 v54;
UINT8 *v55;
unsigned __int64 v56;
UINT8 *v57;
unsigned __int64 v58;
__int64 v59;
__int64 v60;
int *v61;
__int64 v62;
unsigned __int64 v63;
UINT64 WriteEof;
_XPRESS_HUFF_WORKSPACE *v65;
char *v66;
unsigned __int64 v67;
__int64 v68;
__int64 v69;
UINT8 *v70;
unsigned __int64 v71;
UINT8 *v72;
UINT8 *HuffOutputPos;
UINT8 *v74;
__int64 v75;
__int64 v76[2];
unsigned int v77;
int v78;
UINT8 v80;
int v81;
UINT8 v82;
v81 = (int)CompressedBuffer;
v10 = &UncompressedBuffer[(unsigned int)UncompressedBufferSize];
v70 = v10;
v74 = &CompressedBuffer[(unsigned int)CompressedBufferSize];
v78 = 0;
if( (unsigned int)CompressedBufferSize < 0x12C )
return -1073741789;
HuffOutputPos = CompressedBuffer;
memset64(Workspace, (unsigned __int64)UncompressedBuffer, 0xAF6ui64);
memset64(Workspace + 5612, (unsigned __int64)UncompressedBuffer, 0x12EEui64);
v11 = UncompressedBuffer;
if( !Callback
|| (v12 = (unsigned int)CallbackContext, (unsigned int)CallbackContext > (unsigned int)UncompressedBufferSize) )
{
v12 = UncompressedBufferSize;
}
v76[0] = (__int64)Callback;
v13 = Workspace + 23184;
v14 = Workspace + 22608;
v15 = v12;
v76[1] = (__int64)a8;
v77 = v12;
v75 = v12;
while( 2 )
{
v68 = 0i64;
v69 = 0i64;
v16 = 0i64;
v17 = 0i64;
memset(v14, 0i64, 0x800u);
v18 = v11 + 0x10000;
v72 = v11 + 0x10000;
if( v11 + 0x10000 > v10 )
{
v18 = v10;
v72 = v10;
}
v65 = v13;
XpressCallback = (unsigned __int64)&v11[v15];
v71 = (unsigned __int64)(v18 - 40);
v20 = v18 - 40 < &v11[v15];
v21 = (UINT8 *)(Workspace + 23185);
v22 = 1;
if( v20 )
XpressCallback = (unsigned __int64)(v18 - 40);
v67 = XpressCallback;
if( v11 == UncompressedBuffer )
{
v22 = 2;
++Workspace[*v11 + 22608];
v23 = *v11++;
*v21 = v23;
v21 = (UINT8 *)Workspace + 92741;
}
if( v11 >= v18 - 40 )
goto LABEL_40;
while( 1 )
{
do
{
while( 1 )
{
while( 1 )
{
v24 = v11 + 1;
v25 = v11;
v26 = &Workspace[2 * *v11];
v27 = v11[2] + 4i64 * v11[1];
v28 = *(UINT8 **)&v26[4 * v27];
*(_QWORD *)&v26[4 * v27] = v11;
v29 = *v11;
if( *v28 != (_BYTE)v29 || v28[1] != *v24 || v28[2] != v11[2] || v11 - v28 >= 0x10000 )
break;
v30 = v28[3];
v31 = v11;
v32 = v11[3];
if( (_BYTE)v32 != (_BYTE)v30 )
{
v37 = v29 + 2 * v27;
v38 = *(UINT8 **)&Workspace[2 * v37 + 5612 + 2 * v32];
*(_QWORD *)&Workspace[2 * v37 + 5612 + 2 * v30] = v28;
if( v11 - v38 >= 0x10000 )
goto LABEL_29;
v39 = *(unsigned int *)v11;
if( (_DWORD)v39 != *(_DWORD *)v38 )
goto LABEL_29;
v28 = v38;
*(_QWORD *)&Workspace[2 * v37 + 5612 + 2 * (v39 >> 24)] = v11;
}
v33 = v28[4];
v34 = v11[4];
v66 = (char *)(v11 + 4);
if( (_BYTE)v34 != (_BYTE)v33 )
{
v54 = 2
* ((unsigned __int8)__ROR1__(*v24 ^ __ROL1__(*v11 + v11[3], 3), 1)
+ 4i64 * (unsigned __int8)__ROL1__(*v11 ^ __ROR1__(v11[2] + *v24 + 97, 1), 3));
v55 = *(UINT8 **)&Workspace[2 * v54 + 5612 + 2 * v34];
*(_QWORD *)&Workspace[2 * v54 + 5612 + 2 * v33] = v28;
if( v11 - v55 >= 0x10000
|| *(_DWORD *)v11 != *(_DWORD *)v55
|| (v60 = (unsigned __int8)*v66, (_BYTE)v60 != v55[4])
|| v11 == v55 )
{
v28 += 4;
v11 += 4;
goto LABEL_30;
}
v28 = v55;
*(_QWORD *)&Workspace[2 * v54 + 5612 + 2 * v60] = v11;
}
v82 = v28[5];
v80 = v11[5];
if( v80 != v82 )
{
v56 = 2
* ((v11[2] ^ (unsigned __int64)(unsigned __int8)__ROL1__(*v11, *v66))
+ 4
* ((unsigned __int8)__ROR1__(*v24 ^ __ROL1__(v11[3], 3), 1)
+ (unsigned __int64)(unsigned __int8)__ROL1__(*v66 ^ (__ROR1__(*v11, 1) + 69), 3)));
v57 = *(UINT8 **)&Workspace[2 * v56 + 5612 + 2 * v80];
*(_QWORD *)&Workspace[2 * v56 + 5612 + 2 * v82] = v28;
if( v11 - v57 >= 0x10000
|| *(_DWORD *)v11 != *(_DWORD *)v57
|| *v66 != v57[4]
|| (v62 = v11[5], (_BYTE)v62 != v57[5])
|| v11 == v57 )
{
v11 += 5;
v28 += 5;
goto LABEL_30;
}
v28 = v57;
*(_QWORD *)&Workspace[2 * v56 + 5612 + 2 * v62] = v11;
}
v11 += 6;
v28 += 6;
if( v11 >= v70 - 40 )
{
LABEL_65:
while( v11 < v70 )
{
if( *v11 != *v28 )
break;
++v11;
++v28;
}
}
else
{
while( 1 )
{
v35 = *(_DWORD *)v28;
v36 = *(_DWORD *)v11;
if( *(_DWORD *)v11 != *(_DWORD *)v28 )
break;
v35 = *((_DWORD *)v28 + 1);
v36 = *((_DWORD *)v11 + 1);
if( v36 != v35 )
{
v11 += 4;
v28 += 4;
break;
}
v35 = *((_DWORD *)v28 + 2);
v36 = *((_DWORD *)v11 + 2);
if( v36 != v35 )
{
v11 += 8;
v28 += 8;
break;
}
v35 = *((_DWORD *)v28 + 3);
v36 = *((_DWORD *)v11 + 3);
if( v36 != v35 )
{
v11 += 12;
v28 += 12;
break;
}
v35 = *((_DWORD *)v28 + 4);
v36 = *((_DWORD *)v11 + 4);
if( v36 != v35 )
{
v11 += 16;
v28 += 16;
break;
}
v35 = *((_DWORD *)v28 + 5);
v36 = *((_DWORD *)v11 + 5);
if( v36 != v35 )
{
v11 += 20;
v28 += 20;
break;
}
v35 = *((_DWORD *)v28 + 6);
v36 = *((_DWORD *)v11 + 6);
if( v36 != v35 )
{
v11 += 24;
v28 += 24;
break;
}
v35 = *((_DWORD *)v28 + 7);
v36 = *((_DWORD *)v11 + 7);
if( v36 != v35 )
{
v11 += 28;
v28 += 28;
break;
}
v11 += 32;
v28 += 32;
if( v11 >= v70 - 40 )
goto LABEL_65;
}
if( (_BYTE)v36 == (_BYTE)v35 )
{
if( v11[1] != v28[1] )
{
++v11;
++v28;
goto LABEL_30;
}
if( v11[2] == v28[2] )
{
LABEL_29:
v11 += 3;
v28 += 3;
goto LABEL_30;
}
v11 += 2;
v28 += 2;
}
}
LABEL_30:
v40 = v11 - v28;
if( v11 - v31 == 3 && v40 > 0x1000 )
{
XpressCallback = v67;
v13 = v65;
break;
}
if( v40 >= 0x100 )
v41 = *((unsigned __int8 *)XpressHighBitIndexTable + (v40 >> 8)) + 8i64;
else
v41 = *((unsigned __int8 *)XpressHighBitIndexTable + v40);
v16 = v41 + v68;
v42 = v40 - (1i64 << v41);
v43 = 16 * v41;
v44 = v11 - v31 - 3;
v68 = v16;
v45 = v21 + 1;
if( v44 >= 0xF )
{
v46 = v43 + 15;
v58 = v11 - v31 - 18;
*v21 = v46;
v47 = v21 + 2;
if( v58 >= 0xFF )
{
v63 = v58 + 15;
*v45 = -1;
if( v63 < 0x10000 )
{
*v47 = v63;
v47 = v45 + 3;
v69 += 3i64;
goto LABEL_35;
}
*(_DWORD *)(v45 + 3) = v63;
*v47 = 0;
v47 = v45 + 7;
v59 = 7i64;
}
else
{
*v45 = v58;
v59 = 1i64;
}
v69 += v59;
}
else
{
v46 = v44 + v43;
*v21 = v46;
v47 = v21 + 1;
}
LABEL_35:
++Workspace[v46 + 22864];
v48 = 2 * v22 + 1;
*v47 = v42;
v21 = (UINT8 *)(v47 + 1);
if( v22 <= 0 )
{
v61 = v65;
v22 = 1;
v65 = (_XPRESS_HUFF_WORKSPACE *)v21;
v21 += 4;
*v61 = v48;
}
else
{
v22 = 2 * v22 + 1;
}
XpressCallback = v67;
v13 = v65;
if( (unsigned __int64)v11 >= v67 )
{
if( (unsigned __int64)v11 >= v71 )
goto LABEL_39;
XpressCallback = RtlpMakeXpressCallback((__int64)v76, v71, (__int64)v11);
v67 = XpressCallback;
}
}
v11 = v24;
++Workspace[*v25 + 22608];
*v21++ = *v25;
if( v22 <= 0 )
break;
v22 *= 2;
}
*v13 = 2 * v22;
v22 = 1;
v13 = (_XPRESS_HUFF_WORKSPACE *)v21;
v65 = (_XPRESS_HUFF_WORKSPACE *)v21;
v21 += 4;
}
while( (unsigned __int64)v24 < XpressCallback );
if( (unsigned __int64)v24 >= v71 )
break;
XpressCallback = RtlpMakeXpressCallback((__int64)v76, v71, (__int64)v24);
v67 = XpressCallback;
}
v16 = v68;
LABEL_39:
v17 = v69;
v18 = v72;
LABEL_40:
while( v11 < v18 )
{
++Workspace[*v11 + 22608];
v49 = *v11++;
*v21++ = v49;
if( v22 <= 0 )
{
*v13 = 2 * v22;
v22 = 1;
v13 = (_XPRESS_HUFF_WORKSPACE *)v21;
v21 += 4;
}
else
{
v22 *= 2;
}
}
for( ; v22 > 0; v22 = 2 * v22 + 1 )
;
*v13 = 2 * v22 + 1;
if( v11 < v70 )
{
v50 = 0;
}
else
{
++Workspace[22864];
v50 = 1;
}
if( &HuffOutputPos[4 * ((v16 + XpressBuildHuffmanEncodings(Workspace + 15304) + 31) >> 5) + 258 + v17] < v74 )
{
v13 = Workspace + 23184;
LODWORD(WriteEof) = v50;
v51 = XpressDoHuffmanPass(Workspace + 15304, (UINT8 *)Workspace + 92736, v21, HuffOutputPos, WriteEof);
v10 = v70;
v14 = Workspace + 22608;
v52 = v50 == 0;
HuffOutputPos = v51;
v15 = v75;
if( !v52 )
{
*(_DWORD *)FinalCompressedSize = (_DWORD)v51 - v81;
return 0;
}
continue;
}
return -1073741789;
}
}Referenced by:
RtlCompressBufferProgress
RtlCompressBufferXpressHuff