EtwpSendDataBlock

INT64 __fastcall EtwpSendDataBlock(_ETW_REG_ENTRY *RegEntry, _ETWP_NOTIFICATION_HEADER *DataBlock){
  unsigned __int16 Flags; 
  __int128 *v5; 
  struct _DMA_ADAPTER *v6; 
  NTSTATUS v7; 
  _EPROCESS *Process; 
  volatile unsigned __int64 TickCountQuad; 
  _ETW_NOTIFICATION_TYPE NotificationType; 
  __int64 v12; 
  char v13; 
  unsigned __int64 v14; 
  unsigned int v15; 
  __int64 v16; 
  volatile unsigned __int64 v17; 
  _ETW_GUID_ENTRY *GuidEntry; 
  _EPROCESS *v19; 
  char Level; 
  int LowPart; 
  int HighPart; 
  void(__fastcall *Callback)(_GUID *, _EPROCESS *, unsigned __int16 *, _EPROCESS *); 
  int *p_Data2; 
  struct _DMA_ADAPTER *v25; 
  int v26; 
  __int64 v27; 
  _ETW_GUID_ENTRY *v28; 
  void(__fastcall *v29)(_GUID *, _QWORD, __int64, __int64, unsigned __int64, __int128 *, _EPROCESS *); 
  _EPROCESS *v30; 
  __int64 v31; 
  __int64 v32; 
  unsigned __int16 LoggerId; 
  char v34; 
  char v35; 
  int v36; 
  int v37; 
  int v38; 
  __int128 v39; 
  KAPC_STATE ApcState; 
  struct _EVENT_DATA_DESCRIPTOR v41; 
  __int64 *v42; 
  __int64 v43; 
  __int64 *v44; 
  __int64 v45; 
  _GUID *p_Guid; 
  __int64 v47; 
  Flags = RegEntry->Flags;
  v5 = 0i64;
  v6 = 0i64;
  v7 = 0;
  memset(&ApcState, 0, sizeof(ApcState));
  v39 = 0i64;
  if( (Flags & 1) != 0 )
  {
    Process = RegEntry->Process;
    v30 = Process;
    if( RegEntry->Callback )
    {
      TickCountQuad = KUSER_SHARED_DATA.TickCountQuad;
      if( (RegEntry->Flags & 0x10) != 0 )
      {
        LODWORD(v25) = MmGetSessionById(RegEntry->SessionId);
        v6 = v25;
        if( !v25 )
          return(unsigned int)-1073741275;
        v7 = MmAttachSession(v25, &ApcState);
        if( v7 < 0 )
        {
          HalPutDmaAdapter(v6);
          return(unsigned int)v7;
        }
        Process = v30;
        v5 = 0i64;
      }
      if( DataBlock->NotificationType == EtwNotificationTypeEnable )
      {
        if( (RegEntry->Flags & 8) != 0 )
        {
          GuidEntry = RegEntry->GuidEntry;
          v19 = Process;
          LOBYTE(Process) = DataBlock[1].DestinationGuid.Data1;
          Level = GuidEntry->LastEnable.Level;
          LowPart = GuidEntry->LastEnable.EnableFlags.LowPart;
          HighPart = GuidEntry->LastEnable.EnableFlags.HighPart;
          LoggerId = GuidEntry->LastEnable.LoggerId;
          Callback = (void(__fastcall *)(_GUID *, _EPROCESS *, unsigned __int16 *, _EPROCESS *))RegEntry->Callback;
          v34 = Level;
          v36 = LowPart;
          v35 = 0;
          v37 = HighPart;
          v38 = 0;
          Callback(&GuidEntry->Guid, Process, &LoggerId, v19);
        }
        else
        {
          NotificationType = DataBlock[1].NotificationType;
          v12 = *(unsigned int *)&DataBlock[1].DestinationGuid.Data2;
          v29 = (void(__fastcall *)(_GUID *, _QWORD, __int64, __int64, unsigned __int64, __int128 *, _EPROCESS *))RegEntry->Callback;
          v13 = NotificationType != 0 ? LOBYTE(DataBlock[1].NotificationSize) : 0;
          v14 = DataBlock[1].ReplyHandle & -(__int64)(NotificationType != 0);
          v15 = 0;
          v16 = *(_QWORD *)&DataBlock[1].ReplyIndex & -(__int64)(NotificationType != 0);
          if( (_DWORD)v12 )
          {
            p_Data2 = (int *)&DataBlock[1].SourceGuid.Data2;
            while( *p_Data2 < 0 && *p_Data2 != 0x80000000 )
            {
              ++v15;
              p_Data2 += 4;
              if( v15 >= (unsigned int)v12 )
                goto LABEL_10;
            }
            v26 = *(&DataBlock[1].SourceGuid.Data1 + 4 * v15);
            *(_QWORD *)&v39 = (char *)DataBlock + *(_QWORD *)&DataBlock[1].DestinationGuid.Data4[16 * v15];
            v5 = &v39;
            HIDWORD(v39) = *((_DWORD *)&DataBlock[1].SourceGuid.Data2 + 4 * v15);
            DWORD2(v39) = v26;
          }
LABEL_10:
          LOBYTE(v12) = v13;
          v29(&DataBlock->SourceGuid, (unsigned int)NotificationType, v12, v16, v14, v5, v30);
        }
      }
      else
      {
        v7 = -1073741811;
      }
      if( v6 )
      {
        MmDetachSession(v6, &ApcState);
        HalPutDmaAdapter(v6);
      }
      v17 = KUSER_SHARED_DATA.TickCountQuad;
      if( (__int64)((v17 - TickCountQuad) * KeQueryTimeIncrement()) >= 600010000
        && (unsigned int)dword_140C02BB0 > 5
        && tlgKeywordOn((__int64)&dword_140C02BB0, 0x200000000800i64) )
      {
        v43 = 8i64;
        v31 = 2164260864i64;
        v45 = 8i64;
        v42 = &v31;
        v47 = 16i64;
        v44 = &v32;
        v28 = RegEntry->GuidEntry;
        v32 = v27 / 10000;
        p_Guid = &v28->Guid;
        tlgWriteTransfer_EtwWriteTransfer(
          (__int64)&dword_140C02BB0,
          (unsigned __int8 *)byte_14002C91D,
          0i64,
          0i64,
          5u,
          &v41);
      }
    }
  }
  else if( (Flags & 2) != 0 )
  {
    return(unsigned int)EtwpQueueNotification(RegEntry->Process, DataBlock, RegEntry);
  }
  return(unsigned int)v7;
}

Referenced by:

EtwpClearSessionAndUnreferenceEntry
EtwpDisallowedGuidAddition
EtwpDisallowedGuidRemoval
EtwpEnableGuid
EtwpNotifyGuid
SendCaptureStateNotificationsWorker