RtlDecompressBufferXpressHuffProgress
__int64 __fastcall RtlDecompressBufferXpressHuffProgress(
_DWORD *a1,
unsigned int a2,
unsigned __int8 *a3,
int a4,
_DWORD *a5,
__int64 a6,
__int64 a7,
__int64 a8){
unsigned int v8;
unsigned __int8 *v9;
char *v10;
char *v12;
__m128i *v13;
unsigned __int8 *v14;
char *v15;
__int64 v16;
char *v17;
unsigned __int16 *v18;
int v19;
int v20;
unsigned int v21;
UINT64 v22;
UINT64 XpressCallback;
__int16 v24;
int v25;
__int64 v26;
__int16 v27;
int v28;
int v29;
unsigned __int64 v30;
unsigned __int64 v31;
unsigned __int64 v32;
unsigned __int64 v33;
unsigned __int64 v34;
int v35;
char *v36;
unsigned __int64 v37;
char v38;
__int64 v39;
_DWORD *v40;
char *v41;
unsigned __int64 v42;
__int16 v43;
int v44;
__int64 v45;
int v46;
int v47;
unsigned __int64 v48;
unsigned __int64 v49;
unsigned __int64 v50;
int v51;
char *v52;
unsigned __int64 v53;
__m128i *v54;
char *v55;
INT64 v56[2];
unsigned int v57;
int v58;
unsigned __int64 v60;
unsigned int v61;
v8 = 4096;
v61 = 4096;
v9 = a3;
v58 = 0;
LODWORD(v10) = (_DWORD)a1;
if( !a6 )
return 3221225704i64;
v12 = (char *)a1;
v13 = (__m128i *)((a6 + 7) & 0xFFFFFFFFFFFFFFF8ui64);
v14 = &a3[a4];
v15 = (char *)a1 + a2;
v54 = v13;
v60 = (unsigned __int64)v15;
if( !a7 || a2 < 0x1000 )
{
v8 = a2;
v61 = a2;
}
v56[0] = a7;
v56[1] = a8;
v57 = v8;
LABEL_7:
if( v14 - v9 < 260 )
{
if( v12 != v15 )
return 3221226050i64;
goto LABEL_106;
}
if( (unsigned int)XpressBuildHuffmanDecodingTable(v13, (INT64)v9) )
return 3221226050i64;
v15 = (char *)v60;
v16 = 16i64;
v17 = (char *)v60;
v18 = (unsigned __int16 *)(v9 + 256);
v19 = v18[1];
v20 = *v18;
v9 = (unsigned __int8 *)(v18 + 2);
v21 = v19 + (v20 << 16);
if( (unsigned __int64)(v12 + 0x10000) <= v60 )
v17 = v12 + 0x10000;
v55 = v17;
v22 = (UINT64)(v17 - 188);
if( v12 >= v17 - 188 )
goto LABEL_66;
XpressCallback = (UINT64)&v12[v8];
if( v22 < XpressCallback )
XpressCallback = (UINT64)(v17 - 188);
while( 1 )
{
v24 = v13[66].m128i_i16[(unsigned __int64)v21 >> 22];
if( v24 > 0 )
{
v26 = v24 & 0xF;
v21 <<= v26;
v16 -= v26;
}
else
{
v21 <<= 10;
v16 -= 10i64;
do
{
--v16;
v25 = (unsigned __int64)v21 >> 31;
v21 *= 2;
v24 = v13[194].m128i_i16[(__int16)(v25 - v24)];
}
while( v24 <= 0 );
}
v27 = (v24 >> 4) - 256;
if( v16 < 0 )
break;
LABEL_27:
if( v27 >= 0 )
{
v15 = (char *)v60;
if( !v27 && v9 >= v14 && v12 == (char *)v60 )
{
LODWORD(v10) = (_DWORD)a1;
goto LABEL_106;
}
v29 = v27 / 16;
v30 = v27 % 16;
if( v30 == 15 )
{
if( v9 >= v14 )
return 3221226050i64;
v31 = *v9++;
if( v31 == 255 )
{
if( v9 + 1 >= v14 )
return 3221226050i64;
v32 = *(unsigned __int16 *)v9;
v9 += 2;
if( !v32 )
{
if( v9 + 3 >= v14 )
return 3221226050i64;
v32 = *(unsigned int *)v9;
v9 += 4;
}
if( v32 < 0xF || &v12[v32 + 3] < v12 )
return 3221226050i64;
v31 = v32 - 15;
}
v30 = v31 + 15;
}
v33 = v30 + 3;
v34 = (1i64 << v29) + ((unsigned __int64)v21 >> (31 - (unsigned __int8)v29) >> 1);
v21 <<= v29;
v16 -= v29;
if( v16 < 0 )
{
if( (unsigned __int64)v12 >= v22 )
{
v10 = (char *)a1;
goto LABEL_97;
}
if( v9 + 1 >= v14 )
return 3221226050i64;
v35 = *(unsigned __int16 *)v9;
v9 += 2;
v21 += v35 << -(char)v16;
v16 += 16i64;
}
v36 = &v12[-v34];
if( &v12[-v34] < (char *)a1 )
return 3221226050i64;
if( v34 < 4 )
{
*v12 = *v36;
v37 = v34 - 1;
if( v37 )
{
v12[1] = v36[1];
if( v37 != 1 )
{
v38 = v36[2];
goto LABEL_54;
}
v12 += 2;
v39 = -2i64;
}
else
{
v12[1] = *v36;
v38 = *v36;
LABEL_54:
v12[2] = v38;
v39 = -3i64;
v12 += 3;
}
v33 += v39;
if( !v33 )
goto LABEL_15;
}
*(_DWORD *)v12 = *(_DWORD *)v36;
*((_DWORD *)v12 + 1) = *((_DWORD *)v36 + 1);
if( v33 >= 9 )
{
v12 += 8;
v40 = v36 + 8;
for( v33 -= 8i64; ; v33 -= 16i64 )
{
if( (unsigned __int64)v12 >= XpressCallback )
{
if( (unsigned __int64)v12 >= v22 )
{
v15 = (char *)v60;
v41 = &v12[v33];
if( (unsigned __int64)&v12[v33] <= v60 )
{
v42 = v33;
v13 = v54;
qmemcpy(v12, v40, v42);
v17 = v55;
v12 = v41;
LABEL_66:
v10 = (char *)a1;
goto LABEL_67;
}
return 3221226050i64;
}
XpressCallback = RtlpMakeXpressCallback((INT64)v56, v22, (INT64)v12);
}
*(_DWORD *)v12 = *v40;
*((_DWORD *)v12 + 1) = v40[1];
*((_DWORD *)v12 + 2) = v40[2];
*((_DWORD *)v12 + 3) = v40[3];
if( v33 < 0x11 )
break;
v12 += 16;
v40 += 4;
}
}
v12 += v33;
LABEL_15:
v13 = v54;
}
else
{
*v12++ = v27;
}
}
if( (unsigned __int64)v12 < XpressCallback )
{
LABEL_25:
if( v9 + 1 >= v14 )
return 3221226050i64;
v28 = *(unsigned __int16 *)v9;
v9 += 2;
v21 += v28 << -(char)v16;
v16 += 16i64;
goto LABEL_27;
}
if( (unsigned __int64)v12 < v22 )
{
XpressCallback = RtlpMakeXpressCallback((INT64)v56, v22, (INT64)v12);
goto LABEL_25;
}
v15 = (char *)v60;
v10 = (char *)a1;
LABEL_76:
if( v9 + 1 >= v14 )
return 3221226050i64;
v46 = *(unsigned __int16 *)v9;
v9 += 2;
v17 = v55;
v21 += v46 << -(char)v16;
v16 += 16i64;
while( v27 < 0 )
{
*v12++ = v27;
LABEL_67:
if( v12 >= v17 )
{
v8 = v61;
goto LABEL_7;
}
v43 = v13[66].m128i_i16[(unsigned __int64)v21 >> 22];
if( v43 > 0 )
{
v45 = v43 & 0xF;
v21 <<= v45;
v16 -= v45;
v17 = v55;
}
else
{
v21 <<= 10;
v16 -= 10i64;
do
{
--v16;
v44 = (unsigned __int64)v21 >> 31;
v21 *= 2;
v43 = v13[194].m128i_i16[(__int16)(v44 - v43)];
}
while( v43 <= 0 );
}
v27 = (v43 >> 4) - 256;
if( v16 < 0 )
goto LABEL_76;
}
if( !v27 && v9 >= v14 && v12 == v15 )
{
LABEL_106:
*a5 = (_DWORD)v12 - (_DWORD)v10;
return 0i64;
}
v47 = v27 / 16;
v48 = v27 % 16;
if( v48 != 15 )
goto LABEL_94;
if( v9 >= v14 )
return 3221226050i64;
v49 = *v9++;
if( v49 != 255 )
{
LABEL_93:
v48 = v49 + 15;
LABEL_94:
v33 = v48 + 3;
v34 = (1i64 << v47) + ((unsigned __int64)v21 >> (31 - (unsigned __int8)v47) >> 1);
v21 <<= v47;
v16 -= v47;
if( v16 < 0 )
{
LABEL_97:
if( v9 + 1 >= v14 )
return 3221226050i64;
v51 = *(unsigned __int16 *)v9;
v9 += 2;
v21 += v51 << -(char)v16;
v16 += 16i64;
}
if( &v12[-v34] < v10 )
return 3221226050i64;
v52 = &v12[v33];
if( &v12[v33] > v15 )
return 3221226050i64;
v53 = v33;
v13 = v54;
qmemcpy(v12, &v12[-v34], v53);
v17 = v55;
v12 = v52;
goto LABEL_67;
}
if( v9 + 1 >= v14 )
return 3221226050i64;
v50 = *(unsigned __int16 *)v9;
v9 += 2;
if( !v50 )
{
if( v9 + 3 >= v14 )
return 3221226050i64;
v50 = *(unsigned int *)v9;
v9 += 4;
}
if( v50 >= 0xF && &v12[v50 + 3] >= v12 )
{
v49 = v50 - 15;
goto LABEL_93;
}
return 3221226050i64;
}Referenced by:
RtlDecompressBufferProgress