EtwpFreeTraceBufferPool
NTSTATUS __stdcall EtwpFreeTraceBufferPool(_WMI_LOGGER_CONTEXT *LoggerContext){
__int64 LoggerId;
int v2;
CHAR *v4;
INT64 v5;
CHAR *v6;
CHAR *v7;
_WMI_LOGGER_CONTEXT *v8;
unsigned int UsedProcessorCount;
__int64 v10;
__int64 v11;
$B90001D19DE6081274E09A4BBDE43C18 *v12;
__int64 v13;
unsigned __int64 v14;
_SINGLE_LIST_ENTRY *Next;
unsigned __int64 v17;
LoggerId = LoggerContext->LoggerId;
v2 = 0;
if( (LoggerContext->LoggerMode & 0x40000) == 0 )
{
do
{
EtwpDequeueBuffer(LoggerContext, &LoggerContext->BufferQueue);
v6 = v4;
if( v4 )
{
_InterlockedDecrement(&LoggerContext->NumberOfBuffers);
++v2;
_InterlockedDecrement(&LoggerContext->BuffersAvailable);
EtwpFreeTraceBuffer(v5, v4);
}
}
while( v6 );
while( 1 )
{
EtwpDequeueBuffer(LoggerContext, &LoggerContext->OverflowQueue);
if( !v7 )
break;
_InterlockedDecrement(&LoggerContext->NumberOfBuffers);
++v2;
_InterlockedDecrement(&LoggerContext->BuffersAvailable);
EtwpFreeTraceBuffer((INT64)v8, v7);
}
UsedProcessorCount = EtwpQueryUsedProcessorCount(v8);
if( UsedProcessorCount )
{
v10 = 0i64;
v11 = UsedProcessorCount;
do
{
if( (LoggerContext->LoggerMode & 0x10000000) != 0 )
v12 = &LoggerContext->144;
else
v12 = ($B90001D19DE6081274E09A4BBDE43C18 *)&LoggerContext->SiloState->ProcessorBlocks[v10].ProcessorBuffers[LoggerId];
v13 = _InterlockedExchange64((volatile __int64 *)v12, 0i64);
v14 = v13 & 0xFFFFFFFFFFFFFFF0ui64;
if( (v13 & 0xFFFFFFFFFFFFFFF0ui64) != 0 )
{
_InterlockedExchangeAdd((volatile signed __int32 *)(v14 + 12), -(v13 & 0xF));
do
{
v17 = *(_QWORD *)(v14 + 32);
_InterlockedDecrement(&LoggerContext->NumberOfBuffers);
++v2;
EtwpFreeTraceBuffer((INT64)LoggerContext, (CHAR *)v14);
v14 = v17;
}
while( v17 );
}
++v10;
--v11;
}
while( v11 );
}
if( LoggerContext->CompressionTarget )
{
_InterlockedDecrement(&LoggerContext->NumberOfBuffers);
++v2;
EtwpFreeTraceBuffer((INT64)LoggerContext, (CHAR *)LoggerContext->CompressionTarget);
}
while( 1 )
{
Next = LoggerContext->PlaceholderList.Next;
if( !Next )
break;
LoggerContext->PlaceholderList = (_SINGLE_LIST_ENTRY)Next->Next;
ExFreePoolWithTag(&Next[-4], 0);
}
_InterlockedExchangeAdd(
&LoggerContext->SiloState->EtwpCounters.PoolUsage[LoggerContext->PoolType & 1],
-(v2 * LoggerContext->BufferSize));
}
return 0;
}Referenced by:
EtwpFreeLoggerContext
EtwpStartLogger