EtwpFlushActiveBuffers

NTSTATUS __stdcall EtwpFlushActiveBuffers(_WMI_LOGGER_CONTEXT *LoggerContext, UINT64 FlushAll){
  int v2; 
  _WMI_BUFFER_HEADER **ScratchArray; 
  int v5; 
  int v6; 
  __int64 v7; 
  __int64 v8; 
  _QWORD *v9; 
  $B90001D19DE6081274E09A4BBDE43C18 *v10; 
  unsigned __int64 v11; 
  __int64 v12; 
  unsigned int v13; 
  signed __int64 i; 
  signed __int64 v15; 
  unsigned __int64 v16; 
  _QWORD **v17; 
  __int64 v18; 
  _WMI_BUFFER_HEADER **v19; 
  int v20; 
  int v21; 
  __int64 v22; 
  __int64 v23; 
  _WMI_BUFFER_HEADER *v24; 
  _WMI_BUFFER_HEADER *v25; 
  unsigned int v26; 
  UINT16 v27; 
  NTSTATUS v28; 
  _QWORD *v29; 
  UINT16 v30; 
  unsigned int v31; 
  __int64 v33; 
  __int64 v34; 
  __int64 v35; 
  int v36; 
  __int64 v37; 
  __int64 v38; 
  char v39; 
  int v40; 
  char v41[256]; 

  v2 = FlushAll;
  v40 = FlushAll;
  memset(v41, 0i64, sizeof(v41));
  if( !LoggerContext->LogFileHandle && !LoggerContext->RealtimeLogfileHandle )
  {
    if( LoggerContext->FlushTimer )
      EtwpRequestFlushTimer(LoggerContext, 0);
    return 259;
  }
  ScratchArray = (_WMI_BUFFER_HEADER **)v41;
  v39 = 0;
  v5 = 0;
  if( LoggerContext->ScratchArray )
    ScratchArray = LoggerContext->ScratchArray;
  if( (LoggerContext->LoggerMode & 0x40000) != 0 )
  {
    v37 = _InterlockedExchange64((volatile __int64 *)&LoggerContext->144, 0i64);
    if( v37 )
    {
      *ScratchArray = (_WMI_BUFFER_HEADER *)v37;
      v5 = 1;
    }
    goto LABEL_26;
  }
  v6 = EtwpQueryUsedProcessorCount(LoggerContext) - 1;
  v7 = v6;
  if( v6 < 0 )
    goto LABEL_25;
  v8 = (__int64)v6 << 6;
  v9 = ScratchArray;
  do
  {
    if( (LoggerContext->LoggerMode & 0x10000000) != 0 )
      v10 = &LoggerContext->144;
    else
      v10 = ($B90001D19DE6081274E09A4BBDE43C18 *)&(*(_EX_FAST_REF **)((char *)&LoggerContext->SiloState->ProcessorBlocks->ProcessorBuffers
                                                                    + v8))[LoggerContext->LoggerId];
    v11 = v10->CurrentBuffer.Value & 0xFFFFFFFFFFFFFFF0ui64;
    if( v11 )
    {
      if( v40 )
      {
        v13 = _InterlockedExchangeAdd((volatile signed __int32 *)(v11 + 8), LoggerContext->BufferSize);
        if( v13 <= LoggerContext->BufferSize )
          *(_DWORD *)(v11 + 4) = v13;
        _m_prefetchw(v10);
        for( i = v10->CurrentBuffer.Value; (v11 ^ i) <= 0xF; i = v15 )
        {
          v15 = _InterlockedCompareExchange64((volatile signed __int64 *)v10, 0i64, i);
          if( i == v15 )
            break;
        }
        v16 = i & 0xFFFFFFFFFFFFFFF0ui64;
        if( (i & 0xFFFFFFFFFFFFFFF0ui64) == v11 )
        {
          _InterlockedExchangeAdd((volatile signed __int32 *)(v16 + 12), -(i & 0xF));
          EtwpPrepareDirtyBuffer(LoggerContext, (_WMI_BUFFER_HEADER *)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->CurrentBuffer.Value & 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(LoggerContext);
LABEL_26:
  v17 = 0i64;
  if( v5 > 0 )
  {
    v18 = v5;
    v19 = &ScratchArray[v5 - 1];
    do
    {
      v20 = 1;
      v21 = 0;
      v22 = 1i64;
      v23 = 0i64;
      while( v22 < v18 )
      {
        v33 = *((_QWORD *)ScratchArray[v22] + 2);
        v34 = *((_QWORD *)ScratchArray[v23] + 2);
        v35 = v22;
        if( v33 <= v34 )
          v35 = v23;
        v23 = v35;
        v36 = v20;
        if( v33 <= v34 )
          v36 = v21;
        ++v20;
        ++v22;
        v21 = v36;
      }
      v24 = ScratchArray[v23];
      v25 = (_WMI_BUFFER_HEADER *)*((_QWORD *)v24 + 4);
      ScratchArray[v23] = v25;
      if( !v25 )
      {
        --v18;
        ScratchArray[v23] = *v19--;
      }
      if( *((int *)v24 + 3) <= 0 && (v26 = *((_DWORD *)v24 + 1), v26 <= 0x48) && (v26 || *((_DWORD *)v24 + 2) <= 0x48u) )
      {
        EtwpCompleteBuffer(LoggerContext, v24, 0i64);
      }
      else
      {
        *((_QWORD *)v24 + 4) = v17;
        v17 = (_QWORD **)((char *)v24 + 32);
      }
    }
    while( v18 > 0 );
    v2 = v40;
  }
  v27 = 0;
  v28 = 0;
  if( v17 )
  {
    v29 = *v17;
    do
    {
      v30 = v40 != 0;
      if( v29 )
        v30 = v27;
      v27 = v30;
      EtwpAdjustFreeBuffers(LoggerContext);
      EtwpWaitForBufferReferenceCount((_WMI_BUFFER_HEADER *)(v17 - 4));
      v31 = EtwpFlushBuffer(LoggerContext, (_WMI_BUFFER_HEADER *)(v17 - 4), v27);
      EtwpCompleteBuffer(LoggerContext, (_WMI_BUFFER_HEADER *)(v17 - 4), v31);
      v17 = (_QWORD **)v29;
      if( v29 )
        v29 = (_QWORD *)*v29;
      if( v31 )
        v28 = v31;
    }
    while( v17 );
    if( LoggerContext->FlushTimer && v40 && ((LoggerContext->LoggerMode & 0x10000000) == 0 || v39) )
      EtwpRequestFlushTimer(LoggerContext, 0);
  }
  else if( v2 && (LoggerContext->Flags & 8) != 0 )
  {
    EtwpRealtimeSendEmptyMarker(LoggerContext);
  }
  return v28;
}

Referenced by:

EtwpLogger