EtwpCompressBuffer
NTSTATUS __stdcall EtwpCompressBuffer(_WMI_LOGGER_CONTEXT *LoggerContext, _WMI_BUFFER_HEADER *UncompressedBuffer){
unsigned int v4;
unsigned int v5;
unsigned int v6;
int v7;
__int64 v8;
_WMI_BUFFER_HEADER *v9;
__int64 v10;
unsigned int v11;
unsigned int v12;
unsigned int i;
int v14;
int NextEventOffsetType;
int v16;
_WMI_BUFFER_HEADER *CompressionTarget;
int v19;
UINT64 CompressedBufferSize;
UINT64 v21;
UINT64 FinalCompressedSize;
UINT64 EventSize;
unsigned int v24;
LODWORD(FinalCompressedSize) = 0;
LODWORD(EventSize) = 0;
if( *((_DWORD *)UncompressedBuffer + 2) <= *(_DWORD *)UncompressedBuffer )
v4 = *((_DWORD *)UncompressedBuffer + 2);
else
v4 = *((_DWORD *)UncompressedBuffer + 1);
v5 = v4 - 72;
v6 = 72;
if( v4 == 72 )
return 0;
EtwpRotateCompressionTargetIfNeeded(LoggerContext);
while( 1 )
{
CompressionTarget = LoggerContext->CompressionTarget;
if( !CompressionTarget )
{
++LoggerContext->LogBuffersLost;
return -1073741801;
}
v8 = *((unsigned int *)CompressionTarget + 2);
v9 = LoggerContext->CompressionTarget;
v10 = (unsigned int)v8;
if( *((_DWORD *)v9 + 2) == 72
|| v5 < (LoggerContext->BufferSize - *((_DWORD *)v9 + 2) - 72) * LoggerContext->CompressionRatioGuess )
{
LODWORD(v21) = 0;
LODWORD(CompressedBufferSize) = LoggerContext->BufferSize - *((_DWORD *)v9 + 2) - 72;
v7 = RtlCompressBuffer(
3u,
(UINT8 *)UncompressedBuffer + v6,
v5,
(UINT8 *)v9 + v8 + 72,
CompressedBufferSize,
v21,
&FinalCompressedSize,
LoggerContext->CompressionWorkspace);
if( v7 >= 0 )
{
*(_OWORD *)((char *)v9 + v10) = *(_OWORD *)UncompressedBuffer;
*(_OWORD *)((char *)v9 + v10 + 16) = *((_OWORD *)UncompressedBuffer + 1);
*(_OWORD *)((char *)v9 + v10 + 32) = *((_OWORD *)UncompressedBuffer + 2);
*(_OWORD *)((char *)v9 + v10 + 48) = *((_OWORD *)UncompressedBuffer + 3);
*(_QWORD *)((char *)v9 + v10 + 64) = *((_QWORD *)UncompressedBuffer + 8);
v19 = FinalCompressedSize;
*(_QWORD *)((char *)v9 + v10 + 24) = 0i64;
*(_DWORD *)((char *)v9 + v10) = v19 + 72;
*(_DWORD *)((char *)v9 + v10 + 8) = v5 + 72;
*(_DWORD *)((char *)v9 + v10 + 4) = v5 + 72;
*(_DWORD *)((char *)v9 + v10 + 12) = 0;
*(_DWORD *)((char *)v9 + v10 + 44) = 3;
*((_DWORD *)LoggerContext->CompressionTarget + 2) += 72;
*((_DWORD *)LoggerContext->CompressionTarget + 2) += FinalCompressedSize;
return v7;
}
}
LOBYTE(v11) = 1;
v24 = 1;
if( LoggerContext->PartialBufferCompressionLevel )
break;
LABEL_26:
v5 = v4 - v6;
EtwpRotateCompressionTarget(LoggerContext);
}
while( 1 )
{
v12 = v6 + (v5 >> v11);
for( i = 0; ; i += EventSize )
{
NextEventOffsetType = EtwpGetNextEventOffsetType(UncompressedBuffer, v6 + i, &EventSize);
if( !NextEventOffsetType || (unsigned int)EventSize + v6 + i > v12 )
break;
}
if( i )
{
LODWORD(v21) = 0;
LODWORD(CompressedBufferSize) = v14;
if( RtlCompressBuffer(
3u,
(UINT8 *)UncompressedBuffer + v6,
i,
(UINT8 *)v9 + v10 + 72,
CompressedBufferSize,
v21,
&FinalCompressedSize,
LoggerContext->CompressionWorkspace) >= 0 )
{
v6 += i;
*(_OWORD *)((char *)v9 + v10) = *(_OWORD *)UncompressedBuffer;
*(_OWORD *)((char *)v9 + v10 + 16) = *((_OWORD *)UncompressedBuffer + 1);
*(_OWORD *)((char *)v9 + v10 + 32) = *((_OWORD *)UncompressedBuffer + 2);
*(_OWORD *)((char *)v9 + v10 + 48) = *((_OWORD *)UncompressedBuffer + 3);
*(_QWORD *)((char *)v9 + v10 + 64) = *((_QWORD *)UncompressedBuffer + 8);
v16 = FinalCompressedSize;
*(_QWORD *)((char *)v9 + v10 + 24) = 0i64;
*(_DWORD *)((char *)v9 + v10) = v16 + 72;
*(_DWORD *)((char *)v9 + v10 + 8) = i + 72;
*(_DWORD *)((char *)v9 + v10 + 4) = i + 72;
*(_DWORD *)((char *)v9 + v10 + 12) = 0;
*(_DWORD *)((char *)v9 + v10 + 44) = 3;
*((_DWORD *)LoggerContext->CompressionTarget + 2) += 72;
*((_DWORD *)LoggerContext->CompressionTarget + 2) += FinalCompressedSize;
goto LABEL_26;
}
v11 = ++v24;
goto LABEL_23;
}
if( *((_DWORD *)LoggerContext->CompressionTarget + 2) != 72 )
goto LABEL_26;
if( !NextEventOffsetType )
break;
EtwpUpdateEventsLostCount(LoggerContext);
v6 += EventSize;
if( v6 == v4 )
return 0;
if( v6 > v4 )
return -1073741566;
v11 = v24;
LABEL_23:
v5 = v4 - v6;
if( v11 > LoggerContext->PartialBufferCompressionLevel )
goto LABEL_26;
}
++LoggerContext->LogBuffersLost;
return -1073741566;
}Referenced by:
EtwpCompressPendingBuffers