EtwpRealtimeDeliverBuffer

NTSTATUS __stdcall EtwpRealtimeDeliverBuffer(_WMI_LOGGER_CONTEXT *LoggerContext, _WMI_BUFFER_HEADER *Buffer){
  _ETW_RT_EVENT_LOSS NewRTEventsLost; 
  _ETW_REALTIME_CONSUMER *v5; 
  _LIST_ENTRY *p_Consumers; 
  _LIST_ENTRY *Flink; 
  __int16 v8; 
  _ETW_REALTIME_CONSUMER *v9; 
  NTSTATUS v10; 
  unsigned __int8 Flags; 
  char v12; 
  bool v14; 
  __int16 v15; 
  char v16; 
  char v17; 

  NewRTEventsLost = LoggerContext->NewRTEventsLost;
  v16 = 0;
  v17 = 0;
  v5 = 0i64;
  if( NewRTEventsLost )
  {
    if( NewRTEventsLost == EtwRtBackupLost )
    {
      v15 = 8;
    }
    else
    {
      v14 = NewRTEventsLost == EtwRtBufferLost;
      v15 = 4;
      if( !v14 )
        v15 = 2;
    }
    *((_WORD *)Buffer + 26) |= v15;
    v17 = 1;
  }
  p_Consumers = &LoggerContext->Consumers;
  Flink = LoggerContext->Consumers.Flink;
  if( Flink == &LoggerContext->Consumers )
    return -1073741823;
  do
  {
    v8 = *((_WORD *)Buffer + 26);
    v9 = (_ETW_REALTIME_CONSUMER *)Flink;
    Flink = Flink->Flink;
    if( (v9->Flags & 2) != 0 )
      *((_WORD *)Buffer + 26) = v8 | 4;
    v10 = EtwpRealtimeInjectEtwBuffer(LoggerContext, v9, Buffer);
    *((_WORD *)Buffer + 26) = v8;
    if( v10 < 0 )
    {
      if( v10 == -1073741764 )
      {
        v9->NextNotDelivered = v5;
        v5 = v9;
      }
      else
      {
LABEL_17:
        EtwpDisassociateConsumer(LoggerContext, v9);
      }
      v12 = v16;
      continue;
    }
    Flags = v9->Flags;
    if( (Flags & 2) != 0 )
    {
      Flags &= ~2u;
      v9->Flags = Flags;
      v8 = *((_WORD *)Buffer + 26);
    }
    v12 = 1;
    v16 = 1;
    if( (Flags & ((v8 & 1) != 0)) != 0 )
      goto LABEL_17;
  }
  while( Flink != p_Consumers );
  if( !v12 )
    return -1073741823;
  if( v17 )
    LoggerContext->NewRTEventsLost = EtwRtEventNoLoss;
  if( *((_WORD *)Buffer + 27) != 6 )
    ++LoggerContext->RealTimeBuffersDelivered;
  while( v5 )
  {
    v5->Flags |= 2u;
    ++v5->BuffersLost;
    v5 = (_ETW_REALTIME_CONSUMER *)v5->NextNotDelivered;
  }
  return 0;
}

Referenced by:

EtwpFlushBufferToRealtime
EtwpRealtimeFlushSavedBuffers
EtwpRealtimeSendEmptyMarker
EtwpRealtimeUpdateReferenceTime