EtwpAddDebugInfoEvents

VOID __stdcall EtwpAddDebugInfoEvents(
        _WMI_LOGGER_CONTEXT *LoggerContext,
        _WMI_BUFFER_HEADER *Buffer,
        UINT64 BufferSize,
        _LARGE_INTEGER *TimeStamp,
        UINT64 Flags){
  _LARGE_INTEGER *v5; 
  int v6; 
  char v8; 
  int v10; 
  __int64 v11; 
  __int64 v12; 
  int v13; 
  unsigned int DecodeControlCount; 
  _LIST_ENTRY *Flink; 
  __int64 v16; 
  _ETW_DECODE_CONTROL_ENTRY *DecodeControlList; 
  _GUID *v18; 
  _ETW_DECODE_CONTROL_ENTRY *v19; 
  UINT64 DataSize; 
  UINT64 RemainingBufferSize; 
  UINT64 EventSize; 
  __int64 v24; 

  LODWORD(EventSize) = 0;
  v5 = (_LARGE_INTEGER *)&v24;
  v24 = 0i64;
  v6 = BufferSize - *((_DWORD *)Buffer + 12);
  v8 = Flags;
  if( TimeStamp )
    v5 = TimeStamp;
  v10 = Flags & 2;
  LODWORD(Flags) = v10;
  if( v10 )
    ExAcquirePushLockExclusiveEx(&LoggerContext->LoggerLock, 0i64);
  if( (v8 & 1) != 0 && LoggerContext->DebugIdTrackingList.Flink != &LoggerContext->DebugIdTrackingList )
  {
    v11 = -1i64;
    do
      ++v11;
    while( NtBuildLabEx[v11] );
    LODWORD(RemainingBufferSize) = v6;
    LODWORD(DataSize) = v11 + 1;
    LODWORD(v12) = EtwpAddEventToBuffer(Buffer, 0x42u, v5, NtBuildLabEx, DataSize, RemainingBufferSize, &EventSize);
    if( !v12 )
      goto LABEL_20;
    v6 -= EventSize;
  }
  v13 = v8 & 4;
  if( v13 )
  {
    DecodeControlList = LoggerContext->DecodeControlList;
    DecodeControlCount = 0;
    if( !DecodeControlList )
      goto LABEL_14;
    do
    {
      if( DecodeControlList->ConsumersNotified )
        break;
      DecodeControlList = DecodeControlList->Next;
      ++DecodeControlCount;
    }
    while( DecodeControlList );
  }
  else
  {
    DecodeControlCount = LoggerContext->DecodeControlCount;
  }
  if( DecodeControlCount )
  {
    LODWORD(RemainingBufferSize) = v6;
    LODWORD(DataSize) = 32 * DecodeControlCount;
    LODWORD(v18) = EtwpAddEventToBuffer(Buffer, 0x44u, v5, 0i64, DataSize, RemainingBufferSize, &EventSize);
    if( v18 )
    {
      v19 = LoggerContext->DecodeControlList;
      do
      {
        *v18 = v19->Decode;
        v18 += 2;
        v18[-1] = v19->Control;
        v19 = v19->Next;
        --DecodeControlCount;
      }
      while( DecodeControlCount );
      v6 -= EventSize;
    }
  }
LABEL_14:
  Flink = LoggerContext->DebugIdTrackingList.Flink;
  if( Flink != &LoggerContext->DebugIdTrackingList )
  {
    do
    {
      if( !v13 || !LOBYTE(Flink[1].Flink) )
      {
        LODWORD(RemainingBufferSize) = v6;
        LODWORD(DataSize) = HIDWORD(Flink[1].Flink) - 4;
        LODWORD(v16) = EtwpAddEventToBuffer(
                         Buffer,
                         0x40u,
                         v5,
                         (UINT8 *)&Flink[1].Blink + 4,
                         DataSize,
                         RemainingBufferSize,
                         &EventSize);
        if( !v16 )
          break;
        v6 -= EventSize;
      }
      Flink = Flink->Flink;
    }
    while( Flink != &LoggerContext->DebugIdTrackingList );
    v10 = Flags;
  }
LABEL_20:
  if( v10 )
  {
    if( (_InterlockedExchangeAdd64(&LoggerContext->LoggerLock._bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
      ExfTryToWakePushLock(&LoggerContext->LoggerLock);
    KeAbPostRelease(&LoggerContext->LoggerLock);
  }
}

Referenced by:

EtwpAddLogHeader
EtwpFinalizeHeader
EtwpRealtimeNotifyConsumers
EtwpSendDbgId