EtwpDisallowedGuidAddition

VOID __stdcall EtwpDisallowedGuidAddition(_GUID *Guid, VOID *NotificationContext){
  _WMI_LOGGER_CONTEXT *v2; 
  _ETW_GUID_ENTRY *GuidEntryByGuid; 
  _ETW_GUID_ENTRY *v5; 
  _ETHREAD *CurrentThread; 
  ULONG_PTR v7; 
  NTSTATUS v8; 
  _ETWP_NOTIFICATION_HEADER *v9; 
  _GUID *v10; 
  _EX_PUSH_LOCK *p_Lock; 
  _ETW_GUID_ENTRY *Flink; 
  _ETW_GUID_ENTRY *v13; 
  unsigned __int8 v14; 
  _ETW_REG_ENTRY *v15; 
  _ETW_REG_ENTRY *v16; 
  _ETW_REG_ENTRY *v17; 
  _ETW_GUID_ENTRY *GroupEntry; 
  UINT8 v19; 
  unsigned __int8 v20; 
  UINT8 v21; 
  _ETWP_NOTIFICATION_HEADER *v22; 
  UINT8 updated; 
  _ETHREAD *v24; 
  UINT64 ControlCode; 
  _ETWP_NOTIFICATION_HEADER **v26; 
  _ETW_REG_ENTRY *RegEntry; 
  UINT8 v29; 
  _ETWP_NOTIFICATION_HEADER *NotificationPacket; 

  NotificationPacket = 0i64;
  v2 = (_WMI_LOGGER_CONTEXT *)NotificationContext;
  GuidEntryByGuid = EtwpFindGuidEntryByGuid(
                      *((_ETW_SILODRIVERSTATE **)NotificationContext + 135),
                      Guid,
                      EtwTraceGuidType);
  v5 = GuidEntryByGuid;
  if( GuidEntryByGuid )
  {
    CurrentThread = (_ETHREAD *)KeGetCurrentThread();
    --CurrentThread->Tcb.KernelApcDisable;
    v7 = (_DWORD)GuidEntryByGuid + 408;
    ExAcquirePushLockExclusiveEx(&GuidEntryByGuid->Lock, 0i64);
    v5->LockOwner = (_ETHREAD *)KeGetCurrentThread();
    v8 = EtwpBuildNotificationPacket(v5, 0i64, 0, &NotificationPacket);
    v9 = NotificationPacket;
    if( !v8 )
    {
      NotificationPacket->NotificationType = EtwNotificationTypeEnable;
      v9->DestinationGuid = *Guid;
      v9->SourcePID = (unsigned int)PsGetCurrentThreadProcessId();
      if( EtwpIsGuidAllowed(v2, Guid, v10) != 1 )
      {
        p_Lock = 0i64;
        if( !v5->HostEntry )
        {
          Flink = (_ETW_GUID_ENTRY *)v5->SiloGuidList.Flink;
          if( Flink != (_ETW_GUID_ENTRY *)&v5->SiloGuidList )
            p_Lock = &Flink[-1].Lock;
        }
        v13 = v5;
        v14 = 0;
        while( 1 )
        {
          v15 = (_ETW_REG_ENTRY *)v13->RegListHead.Flink;
LABEL_27:
          while( v15 != (_ETW_REG_ENTRY *)&v13->RegListHead )
          {
            v16 = v15;
            RegEntry = v15;
            v17 = v15;
            v15 = (_ETW_REG_ENTRY *)v15->RegList.Flink;
            GroupEntry = v16->GroupEntry;
            if( GroupEntry )
            {
              if( v14 )
                GroupEntry = GroupEntry->HostEntry;
              v19 = *(&v16->GroupEnableMask + 2 * v14);
              if( v19 )
              {
                v20 = 0;
                while( !GroupEntry->EnableInfo[v20].IsEnabled || GroupEntry->EnableInfo[v20].LoggerId != v2->LoggerId )
                {
                  if( ++v20 >= 8u )
                    goto LABEL_27;
                }
                v21 = 1 << v20;
                if( 1 << v20 && (v19 & v21) != 0 )
                {
                  v22 = v9;
                  *(&v17->GroupEnableMask + 2 * v14) = v19 & ~v21;
                  LODWORD(v26) = 0;
                  LOBYTE(ControlCode) = v14;
                  updated = EtwpCalculateUpdateNotification(v17, v21, v19, v19, 2u, ControlCode, v26);
                  v9 = NotificationPacket;
                  v29 = updated;
                  if( v22 != NotificationPacket )
                  {
                    if( NotificationPacket )
                    {
                      EtwpUnreferenceDataBlock(v22);
                      updated = v29;
                    }
                    else
                    {
                      v9 = v22;
                      NotificationPacket = v22;
                    }
                  }
                  if( updated )
                    EtwpSendDataBlock(RegEntry, v9);
                  v2 = (_WMI_LOGGER_CONTEXT *)NotificationContext;
                }
              }
            }
          }
          if( v13 != v5 )
          {
            v13->LockOwner = 0i64;
            ExReleasePushLockEx((_DWORD)v13 + 408, 0);
            KeLeaveCriticalRegionThread(KeGetCurrentThread());
            v9 = NotificationPacket;
          }
          if( !p_Lock )
            break;
          v24 = (_ETHREAD *)KeGetCurrentThread();
          v14 = 1;
          v13 = (_ETW_GUID_ENTRY *)p_Lock;
          --v24->Tcb.KernelApcDisable;
          ExAcquirePushLockExclusiveEx(p_Lock + 51, 0i64);
          p_Lock[52]._bf_0 = (__int64)KeGetCurrentThread();
          p_Lock = (_EX_PUSH_LOCK *)(p_Lock[2]._bf_0 - 16);
          if( p_Lock == (_EX_PUSH_LOCK *)v5 )
            p_Lock = 0i64;
          v9 = NotificationPacket;
        }
        v7 = (_DWORD)v5 + 408;
      }
    }
    if( v9 )
      EtwpUnreferenceDataBlock(v9);
    v5->LockOwner = 0i64;
    ExReleasePushLockEx(v7, 0);
    KeLeaveCriticalRegionThread(KeGetCurrentThread());
    EtwpUnreferenceGuidEntry(v5);
  }
}

Referenced by:

EtwpUpdateDisallowedGuids