RtlCompressBufferXpressHuffMax
NTSTATUS __stdcall RtlCompressBufferXpressHuffMax(
UINT8 *UncompressedBuffer,
UINT64 UncompressedBufferSize,
UINT8 *CompressedBuffer,
UINT64 CompressedBufferSize,
UINT64 *FinalCompressedSize,
_XPRESS_HUFF_WORKSPACE_MAX *Workspace,
VOID *Callback,
VOID *a8,
VOID *CallbackContext,
UINT64 ProgressBytes){
unsigned int v11;
UINT8 *v14;
UINT8 *v15;
_XPRESS_HUFF_WORKSPACE_MAX *v16;
unsigned __int64 v17;
__int64 v18;
UINT8 *v19;
UINT8 *v20;
int v21;
unsigned __int64 v22;
unsigned __int64 v23;
UINT8 v24;
UINT8 *v25;
__int64 v26;
unsigned __int64 v27;
__int64 v28;
unsigned __int64 XpressCallback;
int v30;
char *v31;
int v32;
char *v33;
UINT8 *v34;
UINT8 *v35;
__int64 v36;
unsigned __int64 v37;
int v38;
int v39;
_DWORD *v40;
UINT8 *v41;
UINT8 *v42;
int v43;
int v44;
unsigned __int64 v45;
UINT8 *v46;
unsigned __int64 v47;
__int64 v48;
UINT8 *v49;
unsigned __int64 v50;
char v51;
UINT8 v52;
unsigned __int64 v53;
_WORD *v54;
__int64 v55;
unsigned __int64 v56;
UINT8 v57;
int v58;
UINT8 *v59;
UINT64 WriteEof;
UINT8 *v61;
unsigned __int64 v62;
unsigned __int64 v63;
__int64 v64;
__int64 v65;
UINT8 *v66;
UINT8 *v67;
UINT8 *v68;
__int64 v69[2];
unsigned int v70;
int v71;
char *v72;
int v73;
v73 = (int)CompressedBuffer;
v11 = UncompressedBufferSize;
v71 = 0;
v61 = &UncompressedBuffer[(unsigned int)UncompressedBufferSize];
v68 = &CompressedBuffer[(unsigned int)CompressedBufferSize];
if( (unsigned int)CompressedBufferSize >= 0x12C )
{
if( (unsigned __int64)UncompressedBuffer <= 0x10001 )
return -1073741637;
memset(Workspace, 0i64, 0x40000u);
v14 = UncompressedBuffer;
v66 = CompressedBuffer;
v15 = CompressedBuffer;
*((_QWORD *)Workspace + 0x8000) = 0i64;
if( Callback && (unsigned int)CallbackContext <= v11 )
v11 = (unsigned int)CallbackContext;
else
LODWORD(CallbackContext) = v11;
v69[0] = (__int64)Callback;
v16 = Workspace + 335560;
v69[1] = (__int64)a8;
v70 = v11;
v72 = 0i64;
while( 1 )
{
v64 = 0i64;
v65 = 0i64;
memset(Workspace + 334984, 0i64, 0x800u);
v17 = (unsigned __int64)v61;
v18 = v11;
v19 = v61;
v20 = (UINT8 *)(v16 + 1);
if( v14 + 0x10000 <= v61 )
v19 = v14 + 0x10000;
v21 = 1;
v22 = (unsigned __int64)&v14[v18];
v67 = v19;
v23 = (unsigned __int64)(v19 - 5);
v62 = (unsigned __int64)(v19 - 5);
if( (unsigned __int64)(v19 - 5) < v22 )
v22 = (unsigned __int64)(v19 - 5);
v63 = v22;
if( v14 == UncompressedBuffer )
{
v21 = 2;
++Workspace[*v14 + 334984];
v24 = *v14++;
*v20 = v24;
v20 = (UINT8 *)v16 + 5;
}
if( (unsigned __int64)v14 >= v23 )
goto LABEL_91;
v25 = v14;
v26 = (v14 - UncompressedBuffer) % 0x20000;
do
{
v27 = (unsigned __int16)XpressHashFunction[*v25] ^ (unsigned __int16)word_14003A320[v25[2]] ^ (unsigned __int64)(unsigned __int16)word_14003A120[v25[1]];
v28 = *(_QWORD *)&Workspace[2 * v27];
*(_QWORD *)&Workspace[2 * v27] = v25++;
*(_QWORD *)&Workspace[2 * v26 + 0x10000] = v28;
v26 = ((_DWORD)v26 + 1) & 0x1FFFF;
}
while( (unsigned __int64)v25 < v23 );
LABEL_18:
v17 = (unsigned __int64)v61;
while( (unsigned __int64)v14 < v22 )
{
LABEL_22:
v30 = *(_DWORD *)v14;
v31 = *(char **)&Workspace[2 * ((v14 - UncompressedBuffer) % 0x20000) + 0x10000];
if( v31 + 0x10000 > (char *)v14 )
{
v32 = *(_DWORD *)v31 ^ v30;
if( !v32 )
goto LABEL_24;
if( (v32 & 0xFFFFFF) == 0 )
goto LABEL_32;
v31 = *(char **)&Workspace[2 * ((v31 - (char *)UncompressedBuffer) % 0x20000) + 0x10000];
if( v31 + 0x10000 > (char *)v14 )
{
v38 = *(_DWORD *)v31 ^ v30;
if( !v38 )
goto LABEL_24;
if( (v38 & 0xFFFFFF) == 0 )
goto LABEL_32;
v31 = *(char **)&Workspace[2 * ((v31 - (char *)UncompressedBuffer) % 0x20000) + 0x10000];
if( v31 + 0x10000 > (char *)v14 )
{
v39 = *(_DWORD *)v31 ^ v30;
if( !v39 )
{
LABEL_24:
v33 = v72;
v34 = v14 - 0x10000;
v35 = v14;
v36 = 0i64;
v37 = 3i64;
goto LABEL_36;
}
if( (v39 & 0xFFFFFF) == 0 )
{
LABEL_32:
v72 = v31;
v35 = v14;
v34 = v14 - 0x10000;
v33 = v31;
v36 = 0i64;
v37 = 3i64;
while( 1 )
{
v31 = *(char **)&Workspace[2 * ((v31 - (char *)UncompressedBuffer) % 0x20000) + 0x10000];
if( v31 <= (char *)v34 )
{
LABEL_70:
v14 = &v35[v37];
v47 = v35 - (UINT8 *)v33;
if( v37 == 3 && v47 > 0x1000 )
{
v23 = v62;
v14 = v35;
v22 = v63;
goto LABEL_73;
}
if( v47 < 0x100 )
v48 = *((unsigned __int8 *)XpressHighBitIndexTable + v47);
else
v48 = *((unsigned __int8 *)XpressHighBitIndexTable + (v47 >> 8)) + 8i64;
v64 += v48;
v49 = v20 + 1;
v50 = v47 - (1i64 << v48);
v51 = 16 * v48;
if( v37 - 3 < 0xF )
{
v52 = v37 - 3 + v51;
*v20 = v52;
v54 = v20 + 1;
}
else
{
v52 = v51 + 15;
v53 = v37 - 18;
*v20 = v52;
v54 = v20 + 2;
if( v37 - 18 >= 0xFF )
{
v56 = v53 + 15;
*v49 = -1;
if( v56 >= 0x10000 )
{
*(_DWORD *)(v49 + 3) = v56;
*v54 = 0;
v55 = 7i64;
v54 = v49 + 7;
}
else
{
*v54 = v56;
v54 = v49 + 3;
v55 = 3i64;
}
}
else
{
*v49 = v53;
v55 = 1i64;
}
v65 += v55;
}
v23 = v62;
v22 = v63;
++Workspace[v52 + 335240];
*v54 = v50;
v20 = (UINT8 *)(v54 + 1);
if( v21 <= 0 )
{
*v16 = 2 * v21 + 1;
v21 = 1;
v16 = (_XPRESS_HUFF_WORKSPACE_MAX *)v20;
v20 += 4;
}
else
{
v21 = 2 * v21 + 1;
}
goto LABEL_18;
}
if( v30 == *(_DWORD *)v31 )
break;
LABEL_69:
if( (unsigned __int64)++v36 >= 0xC )
goto LABEL_70;
}
v14 = v35;
LABEL_36:
v40 = v31 + 4;
v41 = v14 + 36;
v42 = v14 + 4;
if( (unsigned __int64)v41 >= v17 )
{
LABEL_47:
while( (unsigned __int64)v42 < v17 )
{
if( *v42 != *(_BYTE *)v40 )
break;
++v42;
v40 = (_DWORD *)((char *)v40 + 1);
}
}
else
{
while( 1 )
{
v43 = *(_DWORD *)v42;
v44 = *v40;
if( *(_DWORD *)v42 != *v40 )
goto LABEL_58;
v43 = *((_DWORD *)v42 + 1);
v44 = v40[1];
if( v43 != v44 )
break;
v43 = *((_DWORD *)v42 + 2);
v44 = v40[2];
if( v43 != v44 )
{
v42 += 8;
v40 += 2;
goto LABEL_58;
}
v43 = *((_DWORD *)v42 + 3);
v44 = v40[3];
if( v43 != v44 )
{
v42 += 12;
v40 += 3;
goto LABEL_58;
}
v43 = *((_DWORD *)v42 + 4);
v44 = v40[4];
if( v43 != v44 )
{
v42 += 16;
v40 += 4;
goto LABEL_58;
}
v43 = *((_DWORD *)v42 + 5);
v44 = v40[5];
if( v43 != v44 )
{
v42 += 20;
v40 += 5;
goto LABEL_58;
}
v43 = *((_DWORD *)v42 + 6);
v44 = v40[6];
if( v43 != v44 )
{
v42 += 24;
v40 += 6;
goto LABEL_58;
}
v43 = *((_DWORD *)v42 + 7);
v44 = v40[7];
if( v43 != v44 )
{
v42 += 28;
v40 += 7;
goto LABEL_58;
}
v42 += 32;
v40 += 8;
if( (unsigned __int64)(v42 + 32) >= v17 )
{
v33 = v72;
goto LABEL_47;
}
}
v42 += 4;
++v40;
LABEL_58:
if( (_BYTE)v43 == (_BYTE)v44 )
{
v17 = (unsigned __int64)v61;
if( v42[1] != *((_BYTE *)v40 + 1) )
{
++v42;
v40 = (_DWORD *)((char *)v40 + 1);
goto LABEL_61;
}
v33 = v72;
if( v42[2] == *((_BYTE *)v40 + 2) )
{
v42 += 3;
v40 = (_DWORD *)((char *)v40 + 3);
}
else
{
v42 += 2;
v40 = (_DWORD *)((char *)v40 + 2);
}
}
else
{
LABEL_61:
v33 = v72;
}
}
v45 = v42 - v35;
v46 = (UINT8 *)v40;
v31 = (char *)v40 - v45;
if( v45 <= v37 )
{
v36 += v45;
goto LABEL_69;
}
v72 = v31;
v37 = v45;
v33 = v31;
if( v46 > v35 )
goto LABEL_70;
goto LABEL_69;
}
}
}
}
LABEL_73:
++v14;
++Workspace[(unsigned __int8)v30 + 334984];
*v20++ = v30;
if( v21 <= 0 )
{
*v16 = 2 * v21;
v21 = 1;
v16 = (_XPRESS_HUFF_WORKSPACE_MAX *)v20;
v20 += 4;
}
else
{
v21 *= 2;
}
}
if( (unsigned __int64)v14 < v23 )
break;
v15 = v66;
v19 = v67;
LABEL_91:
while( v14 < v19 )
{
++Workspace[*v14 + 334984];
v57 = *v14++;
*v20++ = v57;
if( v21 <= 0 )
{
*v16 = 2 * v21;
v21 = 1;
v16 = (_XPRESS_HUFF_WORKSPACE_MAX *)v20;
v20 += 4;
}
else
{
v21 *= 2;
}
}
for( ; v21 > 0; v21 = 2 * v21 + 1 )
;
*v16 = 2 * v21 + 1;
if( (unsigned __int64)v14 < v17 )
{
v58 = 0;
}
else
{
++Workspace[335240];
v58 = 1;
}
if( &v15[4 * ((XpressBuildHuffmanEncodings(Workspace + 327680) + v64 + 31) >> 5) + 258 + v65] >= v68 )
return -1073741789;
v16 = Workspace + 335560;
LODWORD(WriteEof) = v58;
v59 = XpressDoHuffmanPass(Workspace + 327680, (UINT8 *)Workspace + 1342240, v20, v15, WriteEof);
v11 = (unsigned int)CallbackContext;
v15 = v59;
v66 = v59;
if( v58 )
{
*(_DWORD *)FinalCompressedSize = (_DWORD)v59 - v73;
return 0;
}
}
XpressCallback = RtlpMakeXpressCallback((__int64)v69, v23, (__int64)v14);
v23 = v62;
v22 = XpressCallback;
v17 = (unsigned __int64)v61;
v63 = XpressCallback;
goto LABEL_22;
}
return -1073741789;
}Referenced by:
RtlCompressBufferProgress
RtlCompressBufferXpressHuff