EtwpFlushActiveBuffers

INT64 __fastcall EtwpFlushActiveBuffers(_WMI_LOGGER_CONTEXT *LoggerContext, UINT64 FlushAll){
  int v2; 
  INT64 *v4; 
  int v5; 
  int v6; 
  __int64 v7; 
  __int64 v8; 
  _QWORD *v9; 
  _QWORD *v10; 
  unsigned __int64 v11; 
  __int64 v12; 
  unsigned __int32 v13; 
  signed __int64 i; 
  signed __int64 v15; 
  unsigned __int64 v16; 
  unsigned int *v17; 
  __int64 v18; 
  INT64 *v19; 
  int v20; 
  int v21; 
  __int64 v22; 
  __int64 v23; 
  _WMI_BUFFER_HEADER *v24; 
  $CE5421AAA17F992240E21CD59A4E8E5E v25; 
  unsigned int SavedOffset; 
  __int16 v27; 
  unsigned int v28; 
  unsigned int *v29; 
  __int16 v30; 
  unsigned int v31; 
  __int64 v33; 
  __int64 v34; 
  __int64 v35; 
  int v36; 
  __int64 v37; 
  __int64 v38; 
  char v39; 
  int v40; 
  INT64 result[32]; 
  v2 = FlushAll;
  v40 = FlushAll;
  memset((INT64)result, 0i64);
  if( !*((_QWORD *)LoggerContext + 102) && !*((_QWORD *)LoggerContext + 47) )
  {
    if( *((_DWORD *)LoggerContext + 56) )
      EtwpRequestFlushTimer((__int64)LoggerContext, 0);
    return 259i64;
  }
  v4 = result;
  v39 = 0;
  v5 = 0;
  if( *((_QWORD *)LoggerContext + 130) )
    v4 = (INT64 *)*((_QWORD *)LoggerContext + 130);
  if( (*((_DWORD *)LoggerContext + 3) & 0x40000) != 0 )
  {
    v37 = _InterlockedExchange64((volatile __int64 *)LoggerContext + 18, 0i64);
    if( v37 )
    {
      *v4 = v37;
      v5 = 1;
    }
    goto LABEL_26;
  }
  v6 = EtwpQueryUsedProcessorCount((INT64)LoggerContext) - 1;
  v7 = v6;
  if( v6 < 0 )
    goto LABEL_25;
  v8 = (__int64)v6 << 6;
  v9 = v4;
  do
  {
    if( (*((_DWORD *)LoggerContext + 3) & 0x10000000) != 0 )
      v10 = (_QWORD *)((char *)LoggerContext + 144);
    else
      v10 = (_QWORD *)(*(_QWORD *)(*(_QWORD *)(*((_QWORD *)LoggerContext + 135) + 4136i64) + v8)
                     + 8i64 * *(_DWORD *)LoggerContext);
    v11 = *v10 & 0xFFFFFFFFFFFFFFF0ui64;
    if( v11 )
    {
      if( v40 )
      {
        v13 = _InterlockedExchangeAdd((volatile signed __int32 *)(v11 + 8), *((_DWORD *)LoggerContext + 1));
        if( v13 <= *((_DWORD *)LoggerContext + 1) )
          *(_DWORD *)(v11 + 4) = v13;
        _m_prefetchw(v10);
        for( i = *v10; (v11 ^ i) <= 0xF; i = v15 )
        {
          v15 = _InterlockedCompareExchange64(v10, 0i64, i);
          if( i == v15 )
            break;
        }
        v16 = i & 0xFFFFFFFFFFFFFFF0ui64;
        if( (i & 0xFFFFFFFFFFFFFFF0ui64) == v11 )
        {
          _InterlockedExchangeAdd((volatile signed __int32 *)(v16 + 12), -(i & 0xF));
          EtwpPrepareDirtyBuffer((PSTR)LoggerContext, v16);
        }
        else
        {
          if( v16 )
          {
            do
            {
              v38 = *(_QWORD *)(v16 + 32);
              if( v38 == v11 )
                break;
              v16 = *(_QWORD *)(v16 + 32);
            }
            while( v38 );
          }
          *(_QWORD *)(v16 + 32) = 0i64;
          v39 = 1;
        }
        *v9 = v11;
      }
      else
      {
        v12 = *(_QWORD *)((*v10 & 0xFFFFFFFFFFFFFFF0ui64) + 0x20);
        if( !v12 )
          goto LABEL_23;
        *v9 = v12;
        *(_QWORD *)(v11 + 32) = 0i64;
      }
      ++v5;
      ++v9;
    }
LABEL_23:
    v8 -= 64i64;
    --v7;
  }
  while( v7 >= 0 );
  v2 = v40;
LABEL_25:
  EtwpLockUnlockBufferList((INT64)LoggerContext);
LABEL_26:
  v17 = 0i64;
  if( v5 > 0 )
  {
    v18 = v5;
    v19 = &v4[v5 - 1];
    do
    {
      v20 = 1;
      v21 = 0;
      v22 = 1i64;
      v23 = 0i64;
      while( v22 < v18 )
      {
        v33 = *(_QWORD *)(v4[v22] + 16);
        v34 = *(_QWORD *)(v4[v23] + 16);
        v35 = v22;
        if( v33 <= v34 )
          v35 = v23;
        v23 = v35;
        v36 = v20;
        if( v33 <= v34 )
          v36 = v21;
        ++v20;
        ++v22;
        v21 = v36;
      }
      v24 = (_WMI_BUFFER_HEADER *)v4[v23];
      v25 = v24->0;
      v4[v23] = (INT64)v25;
      if( !*(_QWORD *)&v25 )
      {
        --v18;
        v4[v23] = *v19--;
      }
      if( v24->ReferenceCount <= 0
        && (SavedOffset = v24->SavedOffset, SavedOffset <= 0x48)
        && (SavedOffset || v24->CurrentOffset <= 0x48) )
      {
        EtwpCompleteBuffer(LoggerContext, v24, 0i64);
      }
      else
      {
        v24->0 = ($CE5421AAA17F992240E21CD59A4E8E5E)v17;
        v17 = (unsigned int *)&v24->32;
      }
    }
    while( v18 > 0 );
    v2 = v40;
  }
  v27 = 0;
  v28 = 0;
  if( v17 )
  {
    v29 = *(unsigned int **)v17;
    do
    {
      v30 = v40 != 0;
      if( v29 )
        v30 = v27;
      v27 = v30;
      EtwpAdjustFreeBuffers(LoggerContext);
      EtwpWaitForBufferReferenceCount((_WMI_BUFFER_HEADER *)(v17 - 8));
      v31 = EtwpFlushBuffer((__int64)LoggerContext, v17 - 8, v27);
      EtwpCompleteBuffer(LoggerContext, (_WMI_BUFFER_HEADER *)(v17 - 8), v31);
      v17 = v29;
      if( v29 )
        v29 = *(unsigned int **)v29;
      if( v31 )
        v28 = v31;
    }
    while( v17 );
    if( *((_DWORD *)LoggerContext + 56) && v40 && ((*((_DWORD *)LoggerContext + 3) & 0x10000000) == 0 || v39) )
      EtwpRequestFlushTimer((__int64)LoggerContext, 0);
  }
  else if( v2 && (*((_DWORD *)LoggerContext + 208) & 8) != 0 )
  {
    EtwpRealtimeSendEmptyMarker((__int64)LoggerContext);
  }
  return v28;
}

Referenced by:

EtwpLogger