EtwpFreeTraceBufferPool

INT64 __fastcall EtwpFreeTraceBufferPool(UINT64 *a1){
  __int64 v1; 
  int v2; 
  CHAR *v4; 
  INT64 v5; 
  CHAR *v6; 
  CHAR *v7; 
  INT64 v8; 
  unsigned int UsedProcessorCount; 
  __int64 v10; 
  __int64 v11; 
  volatile __int64 *v12; 
  __int64 v13; 
  unsigned __int64 v14; 
  UINT64 *v15; 
  unsigned __int64 v17; 
  v1 = *(unsigned int *)a1;
  v2 = 0;
  if( (*((_DWORD *)a1 + 3) & 0x40000) == 0 )
  {
    do
    {
      EtwpDequeueBuffer((_WMI_LOGGER_CONTEXT *)a1, (_ETW_BUFFER_QUEUE *)a1 + 4);
      v6 = v4;
      if( v4 )
      {
        _InterlockedDecrement((volatile signed __int32 *)a1 + 62);
        ++v2;
        _InterlockedDecrement((volatile signed __int32 *)a1 + 61);
        EtwpFreeTraceBuffer(v5, v4);
      }
    }
    while( v6 );
    while( 1 )
    {
      EtwpDequeueBuffer((_WMI_LOGGER_CONTEXT *)a1, (_ETW_BUFFER_QUEUE *)a1 + 5);
      if( !v7 )
        break;
      _InterlockedDecrement((volatile signed __int32 *)a1 + 62);
      ++v2;
      _InterlockedDecrement((volatile signed __int32 *)a1 + 61);
      EtwpFreeTraceBuffer(v8, v7);
    }
    UsedProcessorCount = EtwpQueryUsedProcessorCount(v8);
    if( UsedProcessorCount )
    {
      v10 = 0i64;
      v11 = UsedProcessorCount;
      do
      {
        if( (*((_DWORD *)a1 + 3) & 0x10000000) != 0 )
          v12 = (volatile __int64 *)(a1 + 18);
        else
          v12 = (volatile __int64 *)(*(_QWORD *)(*(_QWORD *)(a1[135] + 4136) + v10) + 8 * v1);
        v13 = _InterlockedExchange64(v12, 0i64);
        v14 = v13 & 0xFFFFFFFFFFFFFFF0ui64;
        if( (v13 & 0xFFFFFFFFFFFFFFF0ui64) != 0 )
        {
          _InterlockedExchangeAdd((volatile signed __int32 *)(v14 + 12), -(v13 & 0xF));
          do
          {
            v17 = *(_QWORD *)(v14 + 32);
            _InterlockedDecrement((volatile signed __int32 *)a1 + 62);
            ++v2;
            EtwpFreeTraceBuffer((INT64)a1, (CHAR *)v14);
            v14 = v17;
          }
          while( v17 );
        }
        v10 += 64i64;
        --v11;
      }
      while( v11 );
    }
    if( a1[142] )
    {
      _InterlockedDecrement((volatile signed __int32 *)a1 + 62);
      ++v2;
      EtwpFreeTraceBuffer((INT64)a1, (CHAR *)a1[142]);
    }
    while( 1 )
    {
      v15 = (UINT64 *)a1[146];
      if( !v15 )
        break;
      a1[146] = *v15;
      ExFreePoolWithTag(v15 - 4, 0);
    }
    _InterlockedExchangeAdd(
      (volatile signed __int32 *)(a1[135] + 4i64 * (*((_DWORD *)a1 + 79) & 1) + 4116),
      -(v2 * *((_DWORD *)a1 + 1)));
  }
  return 0i64;
}

Referenced by:

EtwpFreeLoggerContext
EtwpStartLogger