RtlReserveChunkLZNT1
INT64 __stdcall RtlReserveChunkLZNT1(
UINT8 **CompressedBuffer,
UINT8 *EndOfCompressedBufferPlus1,
UINT8 **ChunkBuffer,
UINT64 ChunkSize){
UINT8 *v4;
UINT8 *v6;
__int64 v9;
int v10;
unsigned int v11;
int v12;
UINT8 *v13;
unsigned int v14;
UINT8 *CompressedBuffera;
void *ChunkBuffera[6];
UINT64 ChunkSizea;
v4 = *CompressedBuffer;
ChunkBuffera[0] = 0i64;
v6 = v4;
LODWORD(ChunkSizea) = 0;
CompressedBuffera = v4;
v9 = (unsigned int)ChunkSize;
while( 1 )
{
v10 = RtlDescribeChunkLZNT1(&CompressedBuffera, EndOfCompressedBufferPlus1, (UINT8 **)ChunkBuffera, &ChunkSizea);
v11 = v10;
if( v10 < 0 )
break;
if( v6 == v4 )
v6 = CompressedBuffera;
}
if( v10 == -2147483622 )
{
v12 = (_DWORD)CompressedBuffera - (_DWORD)v6;
*ChunkBuffer = v4;
v13 = *CompressedBuffer;
v14 = v12 + 2;
v11 = -1073741789;
if( *CompressedBuffer <= &EndOfCompressedBufferPlus1[-v9] )
{
if( (_DWORD)v9 == 4096 )
{
LODWORD(v9) = 4098;
if( &v13[v14 + 4098] <= EndOfCompressedBufferPlus1 )
{
memmove(v13 + 4098, v6, v14);
*(_WORD *)*CompressedBuffer = 0x3FFF;
*ChunkBuffer += 2;
LABEL_15:
v11 = 0;
}
}
else if( (_DWORD)v9 )
{
if( &v13[v9 + v14] <= EndOfCompressedBufferPlus1 )
{
memmove(&v13[v9], v6, v14);
goto LABEL_15;
}
}
else
{
LODWORD(v9) = 6;
if( &v13[v14 + 6] <= EndOfCompressedBufferPlus1 )
{
memmove(v13 + 6, v6, v14);
*(_WORD *)*CompressedBuffer = -20477;
*((_WORD *)*CompressedBuffer + 1) = 2;
*((_WORD *)*CompressedBuffer + 2) = 4092;
goto LABEL_15;
}
}
*CompressedBuffer += (unsigned int)v9;
}
}
return v11;
}Referenced by:
No references.