EtwpAddBinaryInfoEvents

INT64 __fastcall EtwpAddBinaryInfoEvents(
        _WMI_LOGGER_CONTEXT *LoggerContext,
        _WMI_BUFFER_HEADER *Buffer,
        UINT64 BufferSize){
  char v3; 
  int v4; 
  int v5; 
  char v6; 
  __int64 *v8; 
  _WMI_BUFFER_HEADER *v9; 
  int v10; 
  unsigned int v11; 
  INT64 v12; 
  UINT64 DataSize; 
  UINT64 RemainingBufferSize; 
  _WMI_BUFFER_HEADER *Bufferb; 
  UINT64 EventSize; 
  int v19; 
  LODWORD(EventSize) = 0;
  v4 = BufferSize - Buffer->Offset;
  v5 = v3 & 2;
  v6 = v3;
  v19 = v5;
  if( (v3 & 2) != 0 )
    ExAcquirePushLockExclusiveEx((UINT64)LoggerContext + 704, 0i64);
  v8 = (__int64 *)*((_QWORD *)LoggerContext + 128);
  if( v8 != (__int64 *)((char *)LoggerContext + 1024) )
  {
    v9 = Buffer;
    v10 = v6 & 4;
    do
    {
      if( v10 )
        v11 = *((_DWORD *)v8 + 6);
      else
        v11 = *((_DWORD *)v8 + 5);
      if( v11 )
      {
        LODWORD(RemainingBufferSize) = v4;
        LODWORD(DataSize) = 16 * v11 + 4 + *((_DWORD *)v8 + 4);
        v12 = EtwpAddEventToBuffer(v9, 0x43u, &v9[1].TimeStamp, 0i64, DataSize, RemainingBufferSize, &EventSize);
        if( !v12 )
          break;
        *(_DWORD *)v12 = v11;
        Bufferb = (_WMI_BUFFER_HEADER *)(v12 + 4);
        memmove((UINT8 *)(v12 + 4), (UINT8 *)&v8[2 * (*((_DWORD *)v8 + 5) - v11) + 3] + 4, 16i64 * v11);
        memmove(
          (UINT8 *)Bufferb + 16 * v11,
          (UINT8 *)&v8[2 * *((unsigned int *)v8 + 5) + 3] + 4,
          *((unsigned int *)v8 + 4));
        if( v10 )
          *((_DWORD *)v8 + 6) = 0;
        v4 -= EventSize;
      }
      v8 = (__int64 *)*v8;
    }
    while( v8 != (__int64 *)((char *)LoggerContext + 1024) );
    v5 = v19;
  }
  if( v5 )
  {
    if( (_InterlockedExchangeAdd64((volatile signed __int64 *)LoggerContext + 88, 0xFFFFFFFFFFFFFFFFui64) & 6) == 2 )
      ExfTryToWakePushLock((volatile INT64 *)LoggerContext + 88);
    KeAbPostRelease((char *)LoggerContext + 704);
  }
  return 0i64;
}

Referenced by:

EtwpAddLogHeader
EtwpFinalizeHeader
EtwpRealtimeNotifyConsumers