EtwpDisallowedGuidAddition

VOID __stdcall EtwpDisallowedGuidAddition(_GUID *Guid, PVOID NotificationContext){
  _WMI_LOGGER_CONTEXT *v2; 
  _ETW_GUID_ENTRY *GuidEntryByGuid; 
  _ETW_GUID_ENTRY *v5; 
  _ETHREAD *CurrentThread; 
  UINT64 p_Lock; 
  int v8; 
  _ETWP_NOTIFICATION_HEADER *v9; 
  __int64 v10; 
  _LIST_ENTRY *Flink; 
  _ETW_GUID_ENTRY *v12; 
  unsigned __int8 v13; 
  _ETW_REG_ENTRY *v14; 
  _ETW_REG_ENTRY *v15; 
  INT64 v16; 
  _ETW_GUID_ENTRY *GroupEntry; 
  unsigned __int8 v18; 
  unsigned __int8 v19; 
  UINT8 v20; 
  volatile INT32 *v21; 
  CHAR updated; 
  _ETHREAD *v23; 
  INT64 v24; 
  _ETW_REG_ENTRY *RegEntry; 
  CHAR v27; 
  _ETWP_NOTIFICATION_HEADER *DataBlock; 
  DataBlock = 0i64;
  v2 = (_WMI_LOGGER_CONTEXT *)NotificationContext;
  GuidEntryByGuid = EtwpFindGuidEntryByGuid(
                      *((_ETW_SILODRIVERSTATE **)NotificationContext + 135),
                      Guid,
                      EtwTraceGuidType);
  v5 = GuidEntryByGuid;
  if( GuidEntryByGuid )
  {
    CurrentThread = (_ETHREAD *)KeGetCurrentThread();
    --*((_WORD *)CurrentThread + 242);
    p_Lock = (UINT64)&GuidEntryByGuid->Lock;
    ExAcquirePushLockExclusiveEx((UINT64)&GuidEntryByGuid->Lock, 0i64);
    v5->LockOwner = (_ETHREAD *)KeGetCurrentThread();
    v8 = EtwpBuildNotificationPacket((__int64)v5, 0i64, 0, (__int64 *)&DataBlock);
    v9 = DataBlock;
    if( !v8 )
    {
      DataBlock->NotificationType = EtwNotificationTypeEnable;
      v9->DestinationGuid = *Guid;
      v9->SourcePID = (unsigned int)PsGetCurrentThreadProcessId();
      if( EtwpIsGuidAllowed(v2, Guid) != 1 )
      {
        v10 = 0i64;
        if( !v5->HostEntry )
        {
          Flink = v5->SiloGuidList.Flink;
          if( Flink != &v5->SiloGuidList )
            v10 = (__int64)&Flink[-1];
        }
        v12 = v5;
        v13 = 0;
        while( 1 )
        {
          v14 = (_ETW_REG_ENTRY *)v12->RegListHead.Flink;
LABEL_27:
          while( v14 != (_ETW_REG_ENTRY *)&v12->RegListHead )
          {
            v15 = v14;
            RegEntry = v14;
            v16 = (INT64)v14;
            v14 = (_ETW_REG_ENTRY *)v14->RegList.Flink;
            GroupEntry = v15->GroupEntry;
            if( GroupEntry )
            {
              if( v13 )
                GroupEntry = GroupEntry->HostEntry;
              v18 = *(&v15->GroupEnableMask + 2 * v13);
              if( v18 )
              {
                v19 = 0;
                while( !GroupEntry->EnableInfo[v19].IsEnabled || GroupEntry->EnableInfo[v19].LoggerId != *(_DWORD *)v2 )
                {
                  if( ++v19 >= 8u )
                    goto LABEL_27;
                }
                v20 = 1 << v19;
                if( 1 << v19 && (v18 & v20) != 0 )
                {
                  v21 = (volatile INT32 *)v9;
                  *(_BYTE *)(v16 + 2i64 * v13 + 101) = v18 & ~v20;
                  LODWORD(v24) = 0;
                  updated = EtwpCalculateUpdateNotification(v16, v20, v18, v18, 2, v13, v24, (CHAR **)&DataBlock);
                  v9 = DataBlock;
                  v27 = updated;
                  if( v21 != (volatile INT32 *)DataBlock )
                  {
                    if( DataBlock )
                    {
                      EtwpUnreferenceDataBlock(v21);
                      updated = v27;
                    }
                    else
                    {
                      v9 = (_ETWP_NOTIFICATION_HEADER *)v21;
                      DataBlock = (_ETWP_NOTIFICATION_HEADER *)v21;
                    }
                  }
                  if( updated )
                    EtwpSendDataBlock(RegEntry, v9);
                  v2 = (_WMI_LOGGER_CONTEXT *)NotificationContext;
                }
              }
            }
          }
          if( v12 != v5 )
          {
            v12->LockOwner = 0i64;
            ExReleasePushLockEx((UINT64)&v12->Lock, 0i64);
            KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
            v9 = DataBlock;
          }
          if( !v10 )
            break;
          v23 = (_ETHREAD *)KeGetCurrentThread();
          v13 = 1;
          v12 = (_ETW_GUID_ENTRY *)v10;
          --*((_WORD *)v23 + 242);
          ExAcquirePushLockExclusiveEx(v10 + 408, 0i64);
          *(_QWORD *)(v10 + 416) = KeGetCurrentThread();
          v10 = *(_QWORD *)(v10 + 16) - 16i64;
          if( (_ETW_GUID_ENTRY *)v10 == v5 )
            v10 = 0i64;
          v9 = DataBlock;
        }
        p_Lock = (UINT64)&v5->Lock;
      }
    }
    if( v9 )
      EtwpUnreferenceDataBlock((volatile INT32 *)v9);
    v5->LockOwner = 0i64;
    ExReleasePushLockEx(p_Lock, 0i64);
    KeLeaveCriticalRegionThread((__int64)KeGetCurrentThread());
    EtwpUnreferenceGuidEntry(v5);
  }
}

Referenced by:

EtwpUpdateDisallowedGuids