RtlDecompressBufferXpressHuff
NTSTATUS __stdcall RtlDecompressBufferXpressHuff(
UINT8 *UncompressedBuffer,
UINT64 UncompressedBufferSize,
UINT8 *CompressedBuffer,
UINT64 CompressedBufferSize,
UINT64 UncompressedChunkSize,
UINT64 *FinalUncompressedSize,
VOID *WorkspacePvoid){
UINT8 *v7;
__m128i *v9;
UINT8 *v10;
UINT8 *v11;
UINT8 *v12;
__int64 v13;
unsigned __int16 *v14;
UINT8 *v15;
int v16;
int v17;
unsigned int v18;
unsigned __int64 v19;
__int16 v20;
__int64 v21;
__int16 v22;
int v23;
int v24;
unsigned __int64 v25;
unsigned __int64 v26;
unsigned __int64 v27;
UINT8 *v28;
int v29;
UINT8 *v30;
int v31;
unsigned __int64 v32;
unsigned __int64 v33;
UINT8 v34;
__int64 v35;
int v37;
int v38;
unsigned __int64 v39;
__int16 v40;
__int64 v41;
int v42;
int v43;
unsigned __int64 v44;
unsigned __int64 v45;
unsigned __int64 v46;
UINT8 *WorkspacePvoida;
v7 = CompressedBuffer;
if( !WorkspacePvoid )
return -1073741592;
v9 = (__m128i *)(((unsigned __int64)WorkspacePvoid + 7) & 0xFFFFFFFFFFFFFFF8ui64);
v10 = UncompressedBuffer;
v11 = &CompressedBuffer[(unsigned int)CompressedBufferSize];
v12 = &UncompressedBuffer[(unsigned int)UncompressedBufferSize];
WorkspacePvoida = v12;
LABEL_3:
if( v11 - v7 < 260 )
{
if( v10 != v12 )
return -1073741246;
goto LABEL_42;
}
if( (unsigned int)XpressBuildHuffmanDecodingTable(v9, (__int64)v7) )
return -1073741246;
v13 = 16i64;
v14 = (unsigned __int16 *)(v7 + 256);
v15 = v12;
v16 = v14[1];
v17 = *v14;
v7 = (UINT8 *)(v14 + 2);
v18 = v16 + (v17 << 16);
if( v10 + 0x10000 <= v12 )
v15 = v10 + 0x10000;
v19 = (unsigned __int64)(v15 - 188);
if( v10 < v15 - 188 )
{
while( 1 )
{
while( 1 )
{
while( 1 )
{
v20 = v9[66].m128i_i16[(unsigned __int64)v18 >> 22];
if( v20 <= 0 )
{
v18 <<= 10;
v13 -= 10i64;
do
{
--v13;
v31 = (unsigned __int64)v18 >> 31;
v18 *= 2;
v20 = v9[194].m128i_i16[(__int16)(v31 - v20)];
}
while( v20 <= 0 );
}
else
{
v21 = v20 & 0xF;
v18 <<= v21;
v13 -= v21;
}
v22 = (v20 >> 4) - 256;
if( v13 < 0 )
{
if( (unsigned __int64)v10 >= v19 )
goto LABEL_45;
if( v7 + 1 >= v11 )
return -1073741246;
v23 = *(unsigned __int16 *)v7;
v7 += 2;
v18 += v23 << -(char)v13;
v13 += 16i64;
}
if( v22 >= 0 )
break;
*v10++ = v22;
}
if( !v22 && v7 >= v11 && v10 == WorkspacePvoida )
goto LABEL_42;
v24 = v22 / 16;
v25 = v22 % 16;
if( v25 == 15 )
{
if( v7 >= v11 )
return -1073741246;
v32 = *v7++;
if( v32 == 255 )
{
if( v7 + 1 >= v11 )
return -1073741246;
v45 = *(unsigned __int16 *)v7;
v7 += 2;
if( !v45 )
{
if( v7 + 3 >= v11 )
return -1073741246;
v45 = *(unsigned int *)v7;
v7 += 4;
}
if( v45 < 0xF || &v10[v45 + 3] < v10 )
return -1073741246;
v32 = v45 - 15;
}
v25 = v32 + 15;
}
v26 = v25 + 3;
v27 = (1i64 << v24) + ((unsigned __int64)v18 >> (31 - (unsigned __int8)v24) >> 1);
v18 <<= v24;
v13 -= v24;
if( v13 < 0 )
{
if( (unsigned __int64)v10 >= v19 )
goto LABEL_59;
if( v7 + 1 >= v11 )
return -1073741246;
v29 = *(unsigned __int16 *)v7;
v7 += 2;
v18 += v29 << -(char)v13;
v13 += 16i64;
}
v28 = &v10[-v27];
if( &v10[-v27] < UncompressedBuffer )
return -1073741246;
if( v27 < 4 )
break;
LABEL_21:
*(_DWORD *)v10 = *(_DWORD *)v28;
*((_DWORD *)v10 + 1) = *((_DWORD *)v28 + 1);
if( v26 >= 9 )
{
v10 += 8;
v30 = v28 + 8;
v26 -= 8i64;
while( (unsigned __int64)v10 < v19 )
{
*(_DWORD *)v10 = *(_DWORD *)v30;
*((_DWORD *)v10 + 1) = *((_DWORD *)v30 + 1);
*((_DWORD *)v10 + 2) = *((_DWORD *)v30 + 2);
*((_DWORD *)v10 + 3) = *((_DWORD *)v30 + 3);
if( v26 < 0x11 )
goto LABEL_22;
v10 += 16;
v30 += 16;
v26 -= 16i64;
}
LABEL_51:
if( &v10[v26] <= WorkspacePvoida )
{
qmemcpy(v10, v30, v26);
v10 += v26;
goto LABEL_53;
}
return -1073741246;
}
LABEL_22:
v10 += v26;
}
*v10 = *v28;
v33 = v27 - 1;
if( v33 )
{
v10[1] = v28[1];
if( v33 == 1 )
{
v10 += 2;
v35 = -2i64;
goto LABEL_39;
}
v34 = v28[2];
}
else
{
v10[1] = *v28;
v34 = *v28;
}
v10[2] = v34;
v35 = -3i64;
v10 += 3;
LABEL_39:
v26 += v35;
if( v26 )
goto LABEL_21;
}
}
while( 1 )
{
LABEL_53:
if( v10 >= v15 )
{
v12 = WorkspacePvoida;
goto LABEL_3;
}
v40 = v9[66].m128i_i16[(unsigned __int64)v18 >> 22];
if( v40 <= 0 )
{
v18 <<= 10;
v13 -= 10i64;
do
{
--v13;
v43 = (unsigned __int64)v18 >> 31;
v18 *= 2;
v40 = v9[194].m128i_i16[(__int16)(v43 - v40)];
}
while( v40 <= 0 );
}
else
{
v41 = v40 & 0xF;
v18 <<= v41;
v13 -= v41;
}
v22 = (v40 >> 4) - 256;
if( v13 < 0 )
{
LABEL_45:
if( v7 + 1 < v11 )
{
v37 = *(unsigned __int16 *)v7;
v7 += 2;
v18 += v37 << -(char)v13;
v13 += 16i64;
goto LABEL_57;
}
return -1073741246;
}
LABEL_57:
if( v22 >= 0 )
break;
*v10++ = v22;
}
if( !v22 && v7 >= v11 && v10 == WorkspacePvoida )
{
LABEL_42:
*(_DWORD *)FinalUncompressedSize = (_DWORD)v10 - (_DWORD)UncompressedBuffer;
return 0;
}
v38 = v22 / 16;
v39 = v22 % 16;
if( v39 != 15 )
goto LABEL_49;
if( v7 >= v11 )
return -1073741246;
v44 = *v7++;
if( v44 == 255 )
{
if( v7 + 1 >= v11 )
return -1073741246;
v46 = *(unsigned __int16 *)v7;
v7 += 2;
if( !v46 )
{
if( v7 + 3 >= v11 )
return -1073741246;
v46 = *(unsigned int *)v7;
v7 += 4;
}
if( v46 >= 0xF && &v10[v46 + 3] >= v10 )
{
v44 = v46 - 15;
goto LABEL_67;
}
}
else
{
LABEL_67:
v39 = v44 + 15;
LABEL_49:
v26 = v39 + 3;
v27 = (1i64 << v38) + ((unsigned __int64)v18 >> (31 - (unsigned __int8)v38) >> 1);
v18 <<= v38;
v13 -= v38;
if( v13 < 0 )
{
LABEL_59:
if( v7 + 1 >= v11 )
return -1073741246;
v42 = *(unsigned __int16 *)v7;
v7 += 2;
v18 += v42 << -(char)v13;
v13 += 16i64;
}
v30 = &v10[-v27];
if( &v10[-v27] >= UncompressedBuffer )
goto LABEL_51;
}
return -1073741246;
}Referenced by:
No references.