RtlDecompressBufferXpressHuffProgress
NTSTATUS __stdcall RtlDecompressBufferXpressHuffProgress(
UINT8 *UncompressedBuffer,
UINT64 UncompressedBufferSize,
UINT8 *CompressedBuffer,
UINT64 CompressedBufferSize,
UINT64 *FinalUncompressedSize,
VOID *WorkspacePvoid,
VOID *Callback,
VOID *a8,
VOID *CallbackContext,
UINT64 ProgressBytes){
unsigned int v10;
UINT8 *v11;
UINT8 *v12;
UINT8 *v14;
__m128i *v15;
UINT8 *v16;
UINT8 *v17;
__int64 v18;
UINT8 *v19;
unsigned __int16 *v20;
int v21;
int v22;
unsigned int v23;
unsigned __int64 v24;
unsigned __int64 XpressCallback;
__int16 v26;
int v27;
__int64 v28;
__int16 v29;
int v30;
int v31;
unsigned __int64 v32;
unsigned __int64 v33;
unsigned __int64 v34;
unsigned __int64 v35;
unsigned __int64 v36;
int v37;
UINT8 *v38;
unsigned __int64 v39;
UINT8 v40;
__int64 v41;
_DWORD *v42;
UINT8 *v43;
unsigned __int64 v44;
__int16 v45;
int v46;
__int64 v47;
int v48;
int v49;
unsigned __int64 v50;
unsigned __int64 v51;
unsigned __int64 v52;
int v53;
UINT8 *v54;
unsigned __int64 v55;
__m128i *v56;
UINT8 *v57;
__int64 v58[2];
unsigned int v59;
int v60;
UINT8 *WorkspacePvoida;
int CallbackContexta;
v10 = 4096;
CallbackContexta = 4096;
v11 = CompressedBuffer;
v60 = 0;
LODWORD(v12) = (_DWORD)UncompressedBuffer;
if( !WorkspacePvoid )
return -1073741592;
v14 = UncompressedBuffer;
v15 = (__m128i *)(((unsigned __int64)WorkspacePvoid + 7) & 0xFFFFFFFFFFFFFFF8ui64);
v16 = &CompressedBuffer[(unsigned int)CompressedBufferSize];
v17 = &UncompressedBuffer[(unsigned int)UncompressedBufferSize];
v56 = v15;
WorkspacePvoida = v17;
if( !Callback || (unsigned int)UncompressedBufferSize < 0x1000 )
{
v10 = UncompressedBufferSize;
CallbackContexta = UncompressedBufferSize;
}
v58[0] = (__int64)Callback;
v58[1] = (__int64)a8;
v59 = v10;
LABEL_7:
if( v16 - v11 < 260 )
{
if( v14 != v17 )
return -1073741246;
goto LABEL_106;
}
if( (unsigned int)XpressBuildHuffmanDecodingTable(v15, (__int64)v11) )
return -1073741246;
v17 = WorkspacePvoida;
v18 = 16i64;
v19 = WorkspacePvoida;
v20 = (unsigned __int16 *)(v11 + 256);
v21 = v20[1];
v22 = *v20;
v11 = (UINT8 *)(v20 + 2);
v23 = v21 + (v22 << 16);
if( v14 + 0x10000 <= WorkspacePvoida )
v19 = v14 + 0x10000;
v57 = v19;
v24 = (unsigned __int64)(v19 - 188);
if( v14 >= v19 - 188 )
goto LABEL_66;
XpressCallback = (unsigned __int64)&v14[v10];
if( v24 < XpressCallback )
XpressCallback = (unsigned __int64)(v19 - 188);
while( 1 )
{
v26 = v15[66].m128i_i16[(unsigned __int64)v23 >> 22];
if( v26 > 0 )
{
v28 = v26 & 0xF;
v23 <<= v28;
v18 -= v28;
}
else
{
v23 <<= 10;
v18 -= 10i64;
do
{
--v18;
v27 = (unsigned __int64)v23 >> 31;
v23 *= 2;
v26 = v15[194].m128i_i16[(__int16)(v27 - v26)];
}
while( v26 <= 0 );
}
v29 = (v26 >> 4) - 256;
if( v18 < 0 )
break;
LABEL_27:
if( v29 >= 0 )
{
v17 = WorkspacePvoida;
if( !v29 && v11 >= v16 && v14 == WorkspacePvoida )
{
LODWORD(v12) = (_DWORD)UncompressedBuffer;
goto LABEL_106;
}
v31 = v29 / 16;
v32 = v29 % 16;
if( v32 == 15 )
{
if( v11 >= v16 )
return -1073741246;
v33 = *v11++;
if( v33 == 255 )
{
if( v11 + 1 >= v16 )
return -1073741246;
v34 = *(unsigned __int16 *)v11;
v11 += 2;
if( !v34 )
{
if( v11 + 3 >= v16 )
return -1073741246;
v34 = *(unsigned int *)v11;
v11 += 4;
}
if( v34 < 0xF || &v14[v34 + 3] < v14 )
return -1073741246;
v33 = v34 - 15;
}
v32 = v33 + 15;
}
v35 = v32 + 3;
v36 = (1i64 << v31) + ((unsigned __int64)v23 >> (31 - (unsigned __int8)v31) >> 1);
v23 <<= v31;
v18 -= v31;
if( v18 < 0 )
{
if( (unsigned __int64)v14 >= v24 )
{
v12 = UncompressedBuffer;
goto LABEL_97;
}
if( v11 + 1 >= v16 )
return -1073741246;
v37 = *(unsigned __int16 *)v11;
v11 += 2;
v23 += v37 << -(char)v18;
v18 += 16i64;
}
v38 = &v14[-v36];
if( &v14[-v36] < UncompressedBuffer )
return -1073741246;
if( v36 < 4 )
{
*v14 = *v38;
v39 = v36 - 1;
if( v39 )
{
v14[1] = v38[1];
if( v39 != 1 )
{
v40 = v38[2];
goto LABEL_54;
}
v14 += 2;
v41 = -2i64;
}
else
{
v14[1] = *v38;
v40 = *v38;
LABEL_54:
v14[2] = v40;
v41 = -3i64;
v14 += 3;
}
v35 += v41;
if( !v35 )
goto LABEL_15;
}
*(_DWORD *)v14 = *(_DWORD *)v38;
*((_DWORD *)v14 + 1) = *((_DWORD *)v38 + 1);
if( v35 >= 9 )
{
v14 += 8;
v42 = v38 + 8;
for( v35 -= 8i64; ; v35 -= 16i64 )
{
if( (unsigned __int64)v14 >= XpressCallback )
{
if( (unsigned __int64)v14 >= v24 )
{
v17 = WorkspacePvoida;
v43 = &v14[v35];
if( &v14[v35] <= WorkspacePvoida )
{
v44 = v35;
v15 = v56;
qmemcpy(v14, v42, v44);
v19 = v57;
v14 = v43;
LABEL_66:
v12 = UncompressedBuffer;
goto LABEL_67;
}
return -1073741246;
}
XpressCallback = RtlpMakeXpressCallback((__int64)v58, v24, (__int64)v14);
}
*(_DWORD *)v14 = *v42;
*((_DWORD *)v14 + 1) = v42[1];
*((_DWORD *)v14 + 2) = v42[2];
*((_DWORD *)v14 + 3) = v42[3];
if( v35 < 0x11 )
break;
v14 += 16;
v42 += 4;
}
}
v14 += v35;
LABEL_15:
v15 = v56;
}
else
{
*v14++ = v29;
}
}
if( (unsigned __int64)v14 < XpressCallback )
{
LABEL_25:
if( v11 + 1 >= v16 )
return -1073741246;
v30 = *(unsigned __int16 *)v11;
v11 += 2;
v23 += v30 << -(char)v18;
v18 += 16i64;
goto LABEL_27;
}
if( (unsigned __int64)v14 < v24 )
{
XpressCallback = RtlpMakeXpressCallback((__int64)v58, v24, (__int64)v14);
goto LABEL_25;
}
v17 = WorkspacePvoida;
v12 = UncompressedBuffer;
LABEL_76:
if( v11 + 1 >= v16 )
return -1073741246;
v48 = *(unsigned __int16 *)v11;
v11 += 2;
v19 = v57;
v23 += v48 << -(char)v18;
v18 += 16i64;
while( v29 < 0 )
{
*v14++ = v29;
LABEL_67:
if( v14 >= v19 )
{
v10 = CallbackContexta;
goto LABEL_7;
}
v45 = v15[66].m128i_i16[(unsigned __int64)v23 >> 22];
if( v45 > 0 )
{
v47 = v45 & 0xF;
v23 <<= v47;
v18 -= v47;
v19 = v57;
}
else
{
v23 <<= 10;
v18 -= 10i64;
do
{
--v18;
v46 = (unsigned __int64)v23 >> 31;
v23 *= 2;
v45 = v15[194].m128i_i16[(__int16)(v46 - v45)];
}
while( v45 <= 0 );
}
v29 = (v45 >> 4) - 256;
if( v18 < 0 )
goto LABEL_76;
}
if( !v29 && v11 >= v16 && v14 == v17 )
{
LABEL_106:
*(_DWORD *)FinalUncompressedSize = (_DWORD)v14 - (_DWORD)v12;
return 0;
}
v49 = v29 / 16;
v50 = v29 % 16;
if( v50 != 15 )
goto LABEL_94;
if( v11 >= v16 )
return -1073741246;
v51 = *v11++;
if( v51 != 255 )
{
LABEL_93:
v50 = v51 + 15;
LABEL_94:
v35 = v50 + 3;
v36 = (1i64 << v49) + ((unsigned __int64)v23 >> (31 - (unsigned __int8)v49) >> 1);
v23 <<= v49;
v18 -= v49;
if( v18 < 0 )
{
LABEL_97:
if( v11 + 1 >= v16 )
return -1073741246;
v53 = *(unsigned __int16 *)v11;
v11 += 2;
v23 += v53 << -(char)v18;
v18 += 16i64;
}
if( &v14[-v36] < v12 )
return -1073741246;
v54 = &v14[v35];
if( &v14[v35] > v17 )
return -1073741246;
v55 = v35;
v15 = v56;
qmemcpy(v14, &v14[-v36], v55);
v19 = v57;
v14 = v54;
goto LABEL_67;
}
if( v11 + 1 >= v16 )
return -1073741246;
v52 = *(unsigned __int16 *)v11;
v11 += 2;
if( !v52 )
{
if( v11 + 3 >= v16 )
return -1073741246;
v52 = *(unsigned int *)v11;
v11 += 4;
}
if( v52 >= 0xF && &v14[v52 + 3] >= v14 )
{
v51 = v52 - 15;
goto LABEL_93;
}
return -1073741246;
}Referenced by:
RtlDecompressBufferProgress