SmDecompressBuffer
NTSTATUS __stdcall SmDecompressBuffer(
VOID *CompressedBuffer,
UINT64 CompressedSize,
VOID **DecompressedBufferOut,
UINT64 *DecompressedSizeOut,
UINT64 *MaxDecompressedSize,
_SM_COMPRESSION_CALLBACKS *Callbacks){
int CompressionWorkSpaceSize;
VOID *WorkSpace;
int v10;
unsigned int v11;
UINT8 *v12;
size_t v13;
_SM_COMPRESSION_CALLBACKS *v14;
VOID *v15;
unsigned __int8 v16;
UINT16 v17;
_DWORD *v19;
unsigned int v20;
unsigned int v21;
UINT64 CompressedBufferSize;
UINT8 Buffer[4];
int CompressBufferWorkSpaceSize[21];
UINT64 CompressFragmentWorkSpaceSize;
UINT64 FinalUncompressedSize;
VOID **v27;
UINT64 *v28;
v28 = DecompressedSizeOut;
v27 = DecompressedBufferOut;
CompressionWorkSpaceSize = 0;
LODWORD(FinalUncompressedSize) = 0;
LODWORD(CompressFragmentWorkSpaceSize) = 0;
WorkSpace = 0i64;
CompressBufferWorkSpaceSize[0] = 0;
if( (unsigned int)CompressedSize < 8 )
return -1073741246;
v10 = *(_DWORD *)CompressedBuffer;
v11 = CompressedSize - 8;
if( (v10 & 0xFFFFFF) != 5062989 )
return -1073741672;
if( v10 < 0 )
{
if( v11 >= 4 )
{
v19 = (char *)CompressedBuffer + 8;
*(_DWORD *)Buffer = 0;
v12 = (UINT8 *)CompressedBuffer + 12;
v11 = CompressedSize - 12;
v20 = RtlComputeCrc32(0i64, (UINT8 *)CompressedBuffer, 8ui64);
v21 = RtlComputeCrc32(v20, Buffer, 4ui64);
if( (unsigned int)RtlComputeCrc32(v21, v12, v11) == *v19 )
{
CompressionWorkSpaceSize = 0;
goto LABEL_5;
}
}
return -1073741246;
}
v12 = (UINT8 *)CompressedBuffer + 8;
LABEL_5:
v13 = *((_DWORD *)CompressedBuffer + 1);
if( MaxDecompressedSize && v13 > *(_DWORD *)MaxDecompressedSize )
return -1073739516;
v14 = Callbacks;
v15 = (VOID *)(*(__int64(__fastcall **)(_QWORD))Callbacks)(v13);
if( !v15 )
return -1073741670;
v16 = *((_BYTE *)CompressedBuffer + 3) & 0x7F;
v17 = v16;
if( !v16 )
{
if( v11 == v13 )
{
memmove(v15, v12, v13);
LODWORD(FinalUncompressedSize) = v13;
goto LABEL_15;
}
LABEL_21:
CompressionWorkSpaceSize = -1073741246;
goto LABEL_16;
}
CompressionWorkSpaceSize = RtlGetCompressionWorkSpaceSize(
v16,
(UINT64 *)CompressBufferWorkSpaceSize,
&CompressFragmentWorkSpaceSize);
if( CompressionWorkSpaceSize >= 0 )
{
if( (_DWORD)CompressFragmentWorkSpaceSize )
{
WorkSpace = (VOID *)(*(__int64(**)(void))v14)();
if( !WorkSpace )
{
CompressionWorkSpaceSize = -1073741670;
goto LABEL_16;
}
}
LODWORD(CompressedBufferSize) = v11;
CompressionWorkSpaceSize = RtlDecompressBufferEx(
v17,
(UINT8 *)v15,
v13,
v12,
CompressedBufferSize,
&FinalUncompressedSize,
WorkSpace);
if( CompressionWorkSpaceSize >= 0 )
{
if( v13 == (_DWORD)FinalUncompressedSize )
{
CompressionWorkSpaceSize = 0;
LABEL_15:
*v27 = v15;
v15 = 0i64;
*(_DWORD *)v28 = v13;
goto LABEL_16;
}
goto LABEL_21;
}
}
LABEL_16:
if( v15 )
(*((void(__fastcall **)(VOID *))v14 + 1))(v15);
if( WorkSpace )
(*((void(__fastcall **)(VOID *))v14 + 1))(WorkSpace);
return CompressionWorkSpaceSize;
}Referenced by:
PfSnGetPrefetchInstructions