EtwpAddBinaryInfoEvents

NTSTATUS __stdcall EtwpAddBinaryInfoEvents(
        _WMI_LOGGER_CONTEXT *LoggerContext,
        _WMI_BUFFER_HEADER *Buffer,
        UINT64 BufferSize){
  char v3; 
  int v4; 
  int v5; 
  char v6; 
  _WMI_LOGGER_CONTEXT *Flink; 
  _WMI_BUFFER_HEADER *v9; 
  int v10; 
  unsigned int v11; 
  unsigned int *v12; 
  UINT64 DataSize; 
  UINT64 RemainingBufferSize; 
  _WMI_BUFFER_HEADER *Bufferb; 
  UINT64 EventSize; 
  int v19; 

  LODWORD(EventSize) = 0;
  v4 = BufferSize - *((_DWORD *)Buffer + 12);
  v5 = v3 & 2;
  v6 = v3;
  v19 = v5;
  if( (v3 & 2) != 0 )
    ExAcquirePushLockExclusiveEx(&LoggerContext->LoggerLock, 0i64);
  Flink = (_WMI_LOGGER_CONTEXT *)LoggerContext->BinaryTrackingList.Flink;
  if( Flink != (_WMI_LOGGER_CONTEXT *)&LoggerContext->BinaryTrackingList )
  {
    v9 = Buffer;
    v10 = v6 & 4;
    do
    {
      if( v10 )
        v11 = Flink->EventMarker[1];
      else
        v11 = Flink->EventMarker[0];
      if( v11 )
      {
        LODWORD(RemainingBufferSize) = v4;
        LODWORD(DataSize) = 16 * v11 + 4 + Flink->AcceptNewEvents;
        LODWORD(v12) = EtwpAddEventToBuffer(
                         v9,
                         0x43u,
                         (_LARGE_INTEGER *)v9 + 11,
                         0i64,
                         DataSize,
                         RemainingBufferSize,
                         &EventSize);
        if( !v12 )
          break;
        *v12 = v11;
        Bufferb = (_WMI_BUFFER_HEADER *)(v12 + 1);
        memmove(v12 + 1, &Flink->EventMarker[4 * (Flink->EventMarker[0] - v11) + 2], 16 * v11);
        memmove((char *)Bufferb + 16 * v11, &Flink->EventMarker[4 * Flink->EventMarker[0] + 2], Flink->AcceptNewEvents);
        if( v10 )
          Flink->EventMarker[1] = 0;
        v4 -= EventSize;
      }
      Flink = *(_WMI_LOGGER_CONTEXT **)&Flink->LoggerId;
    }
    while( Flink != (_WMI_LOGGER_CONTEXT *)&LoggerContext->BinaryTrackingList );
    v5 = v19;
  }
  if( v5 )
  {
    if( (_InterlockedExchangeAdd64(&LoggerContext->LoggerLock._bf_0, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
      ExfTryToWakePushLock(&LoggerContext->LoggerLock);
    KeAbPostRelease(&LoggerContext->LoggerLock);
  }
  return 0;
}

Referenced by:

EtwpAddLogHeader
EtwpFinalizeHeader
EtwpRealtimeNotifyConsumers