EtwpDisallowedGuidRemoval

VOID __stdcall EtwpDisallowedGuidRemoval(const _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; 
  int v16; 
  _ETW_REG_ENTRY *p_RegListHead; 
  _ETW_REG_ENTRY *v18; 
  _ETW_REG_ENTRY *v19; 
  _ETW_GUID_ENTRY *GroupEntry; 
  UINT64 v21; 
  unsigned __int8 v22; 
  UINT8 v23; 
  UINT8 v24; 
  _ETW_REG_ENTRY *v25; 
  _ETWP_NOTIFICATION_HEADER *v26; 
  UINT8 updated; 
  _ETHREAD *v28; 
  UINT64 ControlCode; 
  _ETWP_NOTIFICATION_HEADER **NotificationBlockPtr; 
  _ETW_GUID_ENTRY *v31; 
  int RegEntry; 
  _ETW_REG_ENTRY *RegEntrya; 
  UINT8 RegEntryb; 
  _ETWP_NOTIFICATION_HEADER *NotificationPacket; 

  NotificationPacket = 0i64;
  v2 = (_WMI_LOGGER_CONTEXT *)NotificationContext;
  LOBYTE(RegEntry) = 0;
  GuidEntryByGuid = EtwpFindGuidEntryByGuid(
                      *((_ETW_SILODRIVERSTATE **)NotificationContext + 135),
                      Guid,
                      EtwTraceGuidType);
  v31 = GuidEntryByGuid;
  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;
          if( v15 != (_ETW_REG_ENTRY *)&v13->RegListHead )
          {
            v16 = RegEntry;
            p_RegListHead = (_ETW_REG_ENTRY *)&v13->RegListHead;
            do
            {
              v18 = v15;
              RegEntrya = v15;
              v19 = v15;
              v15 = (_ETW_REG_ENTRY *)v15->RegList.Flink;
              GroupEntry = v18->GroupEntry;
              if( GroupEntry )
              {
                if( v14 )
                  GroupEntry = GroupEntry->HostEntry;
                v21 = v14;
                if( GroupEntry->ProviderEnableInfo.IsEnabled )
                {
                  v22 = 0;
                  while( !GroupEntry->EnableInfo[v22].IsEnabled || GroupEntry->EnableInfo[v22].LoggerId != v2->LoggerId )
                  {
                    if( ++v22 >= 8u )
                      goto LABEL_20;
                  }
                  v16 = 1;
                  LOBYTE(v16) = 1 << v22;
LABEL_20:
                  if( (_BYTE)v16 )
                  {
                    v23 = *(&v18->GroupEnableMask + 2 * v14);
                    LOBYTE(v21) = 2;
                    LODWORD(ControlCode) = 1;
                    EtwpUpdateRegEntryEnableMask(v19, (UINT8)v2, v16, v21);
                    v24 = v23;
                    v25 = RegEntrya;
                    LODWORD(NotificationBlockPtr) = 1;
                    LOBYTE(ControlCode) = v14;
                    v26 = v9;
                    updated = EtwpCalculateUpdateNotification(
                                RegEntrya,
                                v16,
                                v24,
                                0,
                                2u,
                                ControlCode,
                                NotificationBlockPtr);
                    v9 = NotificationPacket;
                    RegEntryb = updated;
                    if( v26 != NotificationPacket )
                    {
                      if( NotificationPacket )
                      {
                        EtwpUnreferenceDataBlock(v26);
                        updated = RegEntryb;
                      }
                      else
                      {
                        v9 = v26;
                        NotificationPacket = v26;
                      }
                    }
                    if( updated )
                      EtwpSendDataBlock(v25, v9);
                    v2 = (_WMI_LOGGER_CONTEXT *)NotificationContext;
                  }
                  p_RegListHead = (_ETW_REG_ENTRY *)&v13->RegListHead;
                }
              }
            }
            while( v15 != p_RegListHead );
            RegEntry = v16;
            v5 = v31;
          }
          if( v13 != v5 )
          {
            v13->LockOwner = 0i64;
            ExReleasePushLockEx((_DWORD)v13 + 408, 0);
            KeLeaveCriticalRegionThread(KeGetCurrentThread());
            v9 = NotificationPacket;
          }
          if( !p_Lock )
            break;
          v28 = (_ETHREAD *)KeGetCurrentThread();
          v14 = 1;
          v13 = (_ETW_GUID_ENTRY *)p_Lock;
          --v28->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