RtlDecompressChunks
NTSTATUS __stdcall RtlDecompressChunks(
UINT8 *UncompressedBuffer,
UINT64 UncompressedBufferSize,
UINT8 *CompressedBuffer,
UINT64 CompressedBufferSize,
UINT8 *CompressedTail,
UINT64 CompressedTailSize,
_COMPRESSED_DATA_INFO *CompressedDataInfo){
UINT8 *v7;
size_t v8;
__int64 v9;
int NumberOfChunks;
unsigned int v12;
UINT8 *v13;
unsigned int *CompressedChunkSizes;
__int64 v15;
unsigned int v16;
int v17;
__int64 v18;
__int64 v19;
UINT8 *v20;
char *v21;
NTSTATUS result;
__int64 v23;
UINT64 CompressedBufferSizea;
unsigned int v25;
UINT8 *v26;
UINT64 FinalUncompressedSize;
int v28;
LODWORD(FinalUncompressedSize) = 0;
v7 = UncompressedBuffer;
v8 = CompressedBufferSize;
v9 = (unsigned int)UncompressedBufferSize;
NumberOfChunks = CompressedDataInfo->NumberOfChunks;
v12 = 1 << CompressedDataInfo->ChunkShift;
v13 = &UncompressedBuffer[v9];
v28 = NumberOfChunks;
v25 = v12;
v26 = v13;
if( v13 >= v7 )
{
CompressedChunkSizes = CompressedDataInfo->CompressedChunkSizes;
while( 1 )
{
v15 = (unsigned int)v9;
if( (unsigned int)v9 >= v12 )
v15 = v12;
if( NumberOfChunks && (v16 = *CompressedChunkSizes) != 0 )
{
if( v16 == v12 )
{
if( (unsigned int)v15 < v8 )
{
memmove(v7, CompressedBuffer, v15);
}
else
{
v17 = CompressedTailSize;
if( !(_DWORD)CompressedTailSize && (unsigned int)v15 > v8 )
return -1073741246;
v18 = v8;
memmove(v7, CompressedBuffer, v8);
memmove(&v7[v8], CompressedTail, v15 - v8);
v8 += v17;
CompressedBuffer = &CompressedTail[-v18];
NumberOfChunks = v28;
LODWORD(CompressedTailSize) = 0;
}
}
else
{
if( v16 <= v8 )
{
v19 = v8;
}
else
{
if( !(_DWORD)CompressedTailSize )
return -1073741246;
v19 = v8;
v20 = &v7[(unsigned int)v9 - (unsigned __int64)v12];
v21 = (char *)&v20[v8];
if( v21 < (char *)v20 )
return -1073741811;
if( v20 < v7 || v21 > (char *)v13 )
return -1073741246;
memmove(v20, CompressedBuffer, v8);
memmove(&v20[v8], CompressedTail, *CompressedChunkSizes - v8);
v16 = *CompressedChunkSizes;
CompressedBuffer = v20;
NumberOfChunks = v28;
}
LODWORD(CompressedBufferSizea) = v16;
result = RtlDecompressBuffer(
CompressedDataInfo->CompressionFormatAndEngine,
v7,
(unsigned int)v15,
CompressedBuffer,
CompressedBufferSizea,
&FinalUncompressedSize);
if( result < 0 )
return result;
if( (unsigned int)v15 > (unsigned int)FinalUncompressedSize )
memset(&v7[(unsigned int)FinalUncompressedSize], 0i64, v15 - FinalUncompressedSize);
if( *CompressedChunkSizes >= v8 )
{
v8 += CompressedTailSize;
CompressedBuffer = &CompressedTail[-v19];
LODWORD(CompressedTailSize) = 0;
}
}
}
else
{
if( &v7[v15] > v13 )
return -1073741246;
memset(v7, 0i64, v15);
if( !NumberOfChunks )
{
NumberOfChunks = 1;
--CompressedChunkSizes;
}
}
v13 = v26;
v7 += (unsigned int)v15;
if( v7 > v26 || (unsigned int)v15 > (unsigned int)v9 )
return -1073741246;
v23 = *CompressedChunkSizes;
--NumberOfChunks;
CompressedBuffer += v23;
v28 = NumberOfChunks;
v8 -= v23;
++CompressedChunkSizes;
LODWORD(v9) = v9 - v15;
if( !(_DWORD)v9 )
return 0;
v12 = v25;
}
}
return -1073741811;
}Referenced by:
No references.