SmDecompressBuffer
__int64 __fastcall SmDecompressBuffer(PUCHAR Buffer, unsigned int a2, _QWORD *a3, _DWORD *a4, __int64 a5, __int64 a6){
NTSTATUS CompressionWorkSpaceSize;
void *WorkSpace;
int v10;
unsigned int v11;
UINT8 *v12;
UINT64 v13;
__int64 v14;
UINT8 *v15;
unsigned __int8 v16;
UINT16 v17;
PUCHAR v19;
unsigned int v20;
unsigned int v21;
UINT64 CompressedBufferSize;
UCHAR Buffera[4];
int CompressBufferWorkSpaceSize[21];
ULONG CompressFragmentWorkSpaceSize;
UINT64 FinalUncompressedSize;
_QWORD *v27;
_DWORD *v28;
v28 = a4;
v27 = a3;
CompressionWorkSpaceSize = 0;
LODWORD(FinalUncompressedSize) = 0;
CompressFragmentWorkSpaceSize = 0;
WorkSpace = 0i64;
CompressBufferWorkSpaceSize[0] = 0;
if( a2 < 8 )
return(unsigned int)-1073741246;
v10 = *(_DWORD *)Buffer;
v11 = a2 - 8;
if( (v10 & 0xFFFFFF) != 5062989 )
return(unsigned int)-1073741672;
if( v10 < 0 )
{
if( v11 >= 4 )
{
v19 = Buffer + 8;
*(_DWORD *)Buffera = 0;
v12 = Buffer + 12;
v11 = a2 - 12;
v20 = RtlComputeCrc32(0i64, Buffer, 8ui64);
v21 = RtlComputeCrc32(v20, Buffera, 4ui64);
if( (unsigned int)RtlComputeCrc32(v21, v12, v11) == *(_DWORD *)v19 )
{
CompressionWorkSpaceSize = 0;
goto LABEL_5;
}
}
return(unsigned int)-1073741246;
}
v12 = Buffer + 8;
LABEL_5:
v13 = *((unsigned int *)Buffer + 1);
if( a5 && (unsigned int)v13 > *(_DWORD *)a5 )
return(unsigned int)-1073739516;
v14 = a6;
v15 = (UINT8 *)(*(__int64(__fastcall **)(_QWORD))a6)((unsigned int)v13);
if( !v15 )
return(unsigned int)-1073741670;
v16 = Buffer[3] & 0x7F;
v17 = v16;
if( !v16 )
{
if( v11 == (_DWORD)v13 )
{
memmove(v15, v12, v13);
LODWORD(FinalUncompressedSize) = v13;
goto LABEL_15;
}
LABEL_21:
CompressionWorkSpaceSize = -1073741246;
goto LABEL_16;
}
CompressionWorkSpaceSize = RtlGetCompressionWorkSpaceSize(
v16,
(PULONG)CompressBufferWorkSpaceSize,
&CompressFragmentWorkSpaceSize);
if( CompressionWorkSpaceSize >= 0 )
{
if( CompressFragmentWorkSpaceSize )
{
WorkSpace = (void *)(*(__int64(**)(void))v14)();
if( !WorkSpace )
{
CompressionWorkSpaceSize = -1073741670;
goto LABEL_16;
}
}
LODWORD(CompressedBufferSize) = v11;
CompressionWorkSpaceSize = RtlDecompressBufferEx(
v17,
v15,
(unsigned int)v13,
v12,
CompressedBufferSize,
&FinalUncompressedSize,
WorkSpace);
if( CompressionWorkSpaceSize >= 0 )
{
if( (_DWORD)v13 == (_DWORD)FinalUncompressedSize )
{
CompressionWorkSpaceSize = 0;
LABEL_15:
*v27 = v15;
v15 = 0i64;
*v28 = v13;
goto LABEL_16;
}
goto LABEL_21;
}
}
LABEL_16:
if( v15 )
(*(void(__fastcall **)(UINT8 *))(v14 + 8))(v15);
if( WorkSpace )
(*(void(__fastcall **)(void *))(v14 + 8))(WorkSpace);
return(unsigned int)CompressionWorkSpaceSize;
}Referenced by:
PfSnGetPrefetchInstructions