RtlDecompressBufferXpressLzProgress
__int64 __fastcall RtlDecompressBufferXpressLzProgress(
_BYTE *a1,
unsigned int a2,
_BYTE *a3,
unsigned int a4,
_DWORD *a5,
__int64 a6,
__int64 a7){
_BYTE *v7;
_BYTE *v8;
unsigned int v9;
_BYTE *v10;
_BYTE *v11;
_BYTE *v12;
unsigned __int64 v13;
UINT64 v14;
_BYTE *v15;
_BYTE *v16;
int v17;
_BYTE *v18;
UINT64 XpressCallback;
int v20;
bool v21;
unsigned __int64 v22;
char v23;
unsigned __int64 v24;
unsigned __int64 v25;
unsigned __int64 v26;
unsigned __int64 v27;
unsigned __int64 v28;
signed __int64 v29;
_BYTE *v30;
unsigned __int64 v31;
char v32;
__int64 v33;
_DWORD *v34;
UINT64 v35;
UINT64 v36;
unsigned __int64 v37;
char v38;
unsigned __int64 v39;
unsigned __int64 v40;
unsigned __int64 v41;
unsigned __int64 v42;
_BYTE *v43;
unsigned __int64 v44;
char v45;
__int64 v46;
UINT64 v47;
int v48;
unsigned __int64 v49;
__int16 v51;
unsigned __int64 v52;
char v53;
__int64 v54;
unsigned __int64 v55;
unsigned __int64 v56;
unsigned __int64 v57;
unsigned __int64 v58;
unsigned __int64 v59;
_BYTE *v60;
_BYTE *v61;
INT64 v62[2];
unsigned int v63;
int v64;
v64 = 0;
v7 = a3;
v8 = a1;
v9 = 4096;
if( a4 < 5 )
return 3221226050i64;
v10 = a1;
v11 = &a3[a4];
v12 = &a1[a2];
v60 = v12;
v13 = (unsigned __int64)(v11 - 86);
v14 = (UINT64)(v12 - 352);
v61 = v12 - 352;
if( !a6 || a2 < 0x1000 )
v9 = a2;
v15 = &a1[v9];
v62[0] = a6;
v62[1] = a7;
v63 = v9;
if( v14 < (unsigned __int64)v15 )
v15 = v12 - 352;
v16 = 0i64;
LABEL_8:
v17 = *(_DWORD *)v7;
v18 = v7;
v7 += 4;
if( (unsigned __int64)v7 < v13 )
{
if( v10 >= v15 )
{
if( (unsigned __int64)v10 >= v14 )
{
LABEL_123:
v49 = (unsigned __int64)v60;
goto LABEL_124;
}
XpressCallback = RtlpMakeXpressCallback((INT64)v62, v14, (INT64)v10);
v14 = (UINT64)v61;
v15 = (_BYTE *)XpressCallback;
v8 = a1;
}
v20 = 2 * v17 + 1;
if( v17 >= 0 )
{
while( 1 )
{
if( v20 < 0 )
{
*v10++ = *v7++;
goto LABEL_20;
}
v21 = (v20 & 0x40000000) != 0;
v20 *= 2;
if( v21 )
{
*(_WORD *)v10 = *(_WORD *)v7;
v10 += 2;
v7 += 2;
goto LABEL_20;
}
v21 = (v20 & 0x40000000) != 0;
v20 *= 2;
*(_DWORD *)v10 = *(_DWORD *)v7;
if( v21 )
{
v10 += 3;
v7 += 3;
goto LABEL_20;
}
v10 += 4;
v7 += 4;
v21 = (v20 & 0x40000000) != 0;
v20 *= 2;
if( v21 )
goto LABEL_20;
LABEL_54:
v20 *= 2;
}
}
while( 1 )
{
v22 = *(unsigned __int16 *)v7;
v7 += 2;
v23 = v22;
v24 = (v22 >> 3) + 1;
v25 = v23 & 7;
if( v25 == 7 )
{
if( v16 )
{
v26 = (unsigned __int64)(unsigned __int8)*v16 >> 4;
v16 = 0i64;
}
else
{
v16 = v7++;
v26 = *v16 & 0xF;
}
if( v26 == 15 )
{
if( (unsigned __int64)(v7 + 7) >= v13 )
goto LABEL_67;
v27 = (unsigned __int8)*v7++;
if( v27 == 255 )
{
v28 = *(unsigned __int16 *)v7;
v7 += 2;
if( !v28 )
{
v28 = *(unsigned int *)v7;
v7 += 4;
}
if( v28 < 0x16 || &v10[v28 + 3] < v10 )
return 3221226050i64;
v27 = v28 - 22;
}
v26 = v27 + 15;
}
v25 = v26 + 7;
}
v29 = v25 + 3;
v30 = &v10[-v24];
if( &v10[-v24] < v8 )
return 3221226050i64;
if( v24 >= 4 )
{
LABEL_44:
*(_DWORD *)v10 = *(_DWORD *)v30;
*((_DWORD *)v10 + 1) = *((_DWORD *)v30 + 1);
if( v29 >= 9 )
{
v10 += 8;
v34 = v30 + 8;
for( v29 -= 8i64; ; v29 -= 16i64 )
{
if( v10 >= v15 )
{
if( (unsigned __int64)v10 >= v14 )
goto LABEL_113;
v35 = RtlpMakeXpressCallback((INT64)v62, v14, (INT64)v10);
v14 = (UINT64)v61;
v15 = (_BYTE *)v35;
}
*(_DWORD *)v10 = *v34;
*((_DWORD *)v10 + 1) = v34[1];
*((_DWORD *)v10 + 2) = v34[2];
*((_DWORD *)v10 + 3) = v34[3];
if( v29 < 17 )
break;
v10 += 16;
v34 += 4;
}
v8 = a1;
}
v10 += v29;
goto LABEL_53;
}
*v10 = *v30;
v31 = v24 - 1;
if( v31 )
{
v10[1] = v30[1];
if( v31 == 1 )
{
v10 += 2;
v33 = -2i64;
goto LABEL_43;
}
v32 = v30[2];
}
else
{
v10[1] = *v30;
v32 = *v30;
}
v10[2] = v32;
v33 = -3i64;
v10 += 3;
LABEL_43:
v29 += v33;
if( v29 )
goto LABEL_44;
LABEL_53:
if( v20 >= 0 )
goto LABEL_54;
LABEL_20:
v20 *= 2;
if( !v20 )
goto LABEL_8;
}
}
while( 1 )
{
v7 = v18 + 4;
if( v10 >= v15 )
{
if( (unsigned __int64)v10 >= v14 )
goto LABEL_123;
v36 = RtlpMakeXpressCallback((INT64)v62, v14, (INT64)v10);
v14 = (UINT64)v61;
v15 = (_BYTE *)v36;
v8 = a1;
}
v20 = 2 * v17 + 1;
if( v17 < 0 )
break;
while( v20 >= 0 )
{
v21 = (v20 & 0x40000000) != 0;
v20 *= 2;
if( v21 )
{
if( v7 + 1 >= v11 )
return 3221226050i64;
*(_WORD *)v10 = *(_WORD *)v7;
v10 += 2;
v7 += 2;
goto LABEL_110;
}
v21 = (v20 & 0x40000000) != 0;
v20 *= 2;
if( v21 )
{
if( v7 + 2 >= v11 )
return 3221226050i64;
*(_WORD *)v10 = *(_WORD *)v7;
v10[2] = v7[2];
v10 += 3;
v7 += 3;
goto LABEL_110;
}
v20 *= 2;
if( v7 + 3 >= v11 )
return 3221226050i64;
v48 = *(_DWORD *)v7;
v7 += 4;
*(_DWORD *)v10 = v48;
v10 += 4;
if( v20 < 0 )
goto LABEL_110;
LABEL_97:
v20 *= 2;
}
if( v7 >= v11 )
return 3221226050i64;
*v10++ = *v7++;
LABEL_110:
v18 = v7;
v20 *= 2;
if( v20 )
break;
if( v7 + 3 >= v11 )
return 3221226050i64;
v17 = *(_DWORD *)v7;
}
if( v7 == v11 )
{
v49 = (unsigned __int64)v60;
while( 1 )
{
LABEL_118:
if( v20 >= 0 )
{
v20 *= 2;
goto LABEL_125;
}
LABEL_120:
while( 1 )
{
v20 *= 2;
if( v20 )
break;
if( v7 + 3 >= v11 )
return 3221226050i64;
v17 = *(_DWORD *)v7;
v7 += 4;
LABEL_124:
v20 = 2 * v17 + 1;
if( v17 < 0 )
break;
LABEL_125:
while( v20 >= 0 )
{
v20 *= 2;
if( v7 + 2 > v11 || (unsigned __int64)(v10 + 2) > v49 )
return 3221226050i64;
v51 = *(_WORD *)v7;
v7 += 2;
*(_WORD *)v10 = v51;
v10 += 2;
if( v20 < 0 )
goto LABEL_120;
v20 *= 2;
}
if( v7 >= v11 || (unsigned __int64)v10 >= v49 )
return 3221226050i64;
*v10++ = *v7++;
}
if( v7 == v11 )
break;
if( v7 + 1 >= v11 )
{
if( (unsigned __int64)v10 < v49 )
return 3221226050i64;
break;
}
v52 = *(unsigned __int16 *)v7;
v7 += 2;
v53 = v52;
v54 = (v52 >> 3) + 1;
v55 = v53 & 7;
if( v55 == 7 )
{
if( v16 )
{
v56 = (unsigned __int64)(unsigned __int8)*v16 >> 4;
v16 = 0i64;
}
else
{
if( v7 >= v11 )
return 3221226050i64;
v16 = v7++;
v56 = *v16 & 0xF;
}
if( v56 == 15 )
{
if( v7 >= v11 )
return 3221226050i64;
v57 = (unsigned __int8)*v7++;
if( v57 == 255 )
{
if( v7 + 1 >= v11 )
return 3221226050i64;
v58 = *(unsigned __int16 *)v7;
v7 += 2;
if( !v58 )
{
if( v7 + 3 >= v11 )
return 3221226050i64;
v58 = *(unsigned int *)v7;
v7 += 4;
}
if( v58 < 0x16 || &v10[v58 + 3] < v10 )
return 3221226050i64;
v57 = v58 - 22;
}
v56 = v57 + 15;
}
v55 = v56 + 7;
}
v59 = v55 + 3;
if( &v10[-v54] < v8 || (unsigned __int64)&v10[v59] > v49 )
return 3221226050i64;
qmemcpy(v10, &v10[-v54], v59);
v10 += v59;
}
*a5 = (_DWORD)v10 - (_DWORD)v8;
return 0i64;
}
if( v7 + 1 < v11 )
{
v37 = *(unsigned __int16 *)v7;
v7 += 2;
v38 = v37;
v24 = (v37 >> 3) + 1;
v39 = v38 & 7;
if( v39 == 7 )
{
if( v16 )
{
v40 = (unsigned __int64)(unsigned __int8)*v16 >> 4;
v16 = 0i64;
}
else
{
if( v7 >= v11 )
return 3221226050i64;
v16 = v7++;
v40 = *v16 & 0xF;
}
if( v40 == 15 )
{
LABEL_67:
if( v7 >= v11 )
return 3221226050i64;
v41 = (unsigned __int8)*v7++;
if( v41 == 255 )
{
if( v7 + 1 >= v11 )
return 3221226050i64;
v42 = *(unsigned __int16 *)v7;
v7 += 2;
if( !v42 )
{
if( v7 + 3 >= v11 )
return 3221226050i64;
v42 = *(unsigned int *)v7;
v7 += 4;
}
if( v42 < 0x16 || &v10[v42 + 3] < v10 )
return 3221226050i64;
v41 = v42 - 22;
}
v40 = v41 + 15;
}
v39 = v40 + 7;
}
v29 = v39 + 3;
v43 = &v10[-v24];
if( &v10[-v24] < v8 )
return 3221226050i64;
if( v24 >= 4 )
{
LABEL_87:
*(_DWORD *)v10 = *(_DWORD *)v43;
*((_DWORD *)v10 + 1) = *((_DWORD *)v43 + 1);
if( v29 >= 9 )
{
v10 += 8;
v34 = v43 + 8;
for( v29 -= 8i64; ; v29 -= 16i64 )
{
if( v10 >= v15 )
{
if( (unsigned __int64)v10 >= v14 )
{
LABEL_113:
v49 = (unsigned __int64)v60;
if( &v10[v29] <= v60 )
{
v8 = a1;
qmemcpy(v10, v34, v29);
v10 += v29;
goto LABEL_118;
}
return 3221226050i64;
}
v47 = RtlpMakeXpressCallback((INT64)v62, v14, (INT64)v10);
v14 = (UINT64)v61;
v15 = (_BYTE *)v47;
}
*(_DWORD *)v10 = *v34;
*((_DWORD *)v10 + 1) = v34[1];
*((_DWORD *)v10 + 2) = v34[2];
*((_DWORD *)v10 + 3) = v34[3];
if( v29 < 17 )
break;
v10 += 16;
v34 += 4;
}
v8 = a1;
}
v10 += v29;
LABEL_96:
if( v20 < 0 )
goto LABEL_110;
goto LABEL_97;
}
*v10 = *v43;
v44 = v24 - 1;
if( v44 )
{
v10[1] = v43[1];
if( v44 == 1 )
{
v10 += 2;
v46 = -2i64;
goto LABEL_86;
}
v45 = v43[2];
}
else
{
v10[1] = *v43;
v45 = *v43;
}
v10[2] = v45;
v46 = -3i64;
v10 += 3;
LABEL_86:
v29 += v46;
if( !v29 )
goto LABEL_96;
goto LABEL_87;
}
v49 = (unsigned __int64)v60;
if( v10 >= v60 )
goto LABEL_118;
return 3221226050i64;
}Referenced by:
RtlDecompressBufferProgress