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