EtwpUpdateGroupMasks

INT64 __fastcall EtwpUpdateGroupMasks(INT64 a1, INT64 a2){
  unsigned int v2; 
  UINT64 v4; 
  int v6; 
  __int64 v7; 
  __int64 v8; 
  int v9; 
  int v10; 
  int v11; 
  int updated; 
  __int64 v13; 
  char *v14; 
  __int16 v15; 
  INT64 v16; 
  int *v17; 
  char *v18; 
  __int64 v19; 
  int v20; 
  int v21; 
  char v22; 
  __int64 v23; 
  char v24; 
  INT64 result; 
  int v26; 
  unsigned int a3; 
  _PERFINFO_GROUPMASK GroupMasks; 
  _PERFINFO_GROUPMASK v29; 
  v2 = *(_DWORD *)a1;
  v4 = *(_QWORD *)(a1 + 1080);
  memset(&GroupMasks, 0, sizeof(GroupMasks));
  memset(&v29, 0, sizeof(v29));
  EtwpMapEnableFlags((_PERFINFO_GROUPMASK *)a2, 1u);
  if( a2 )
  {
    v6 = *(_DWORD *)(a2 + 4);
    if( (v6 & 1) != 0 || (v6 & 0x10) != 0 )
      *(_DWORD *)a2 |= 0x200u;
  }
  if( *(_QWORD *)(a1 + 1080) == EtwpHostSiloState || (result = EtwpCheckSiloGroupMasks((CHAR *)a2), (int)result >= 0) )
  {
    if( a2
      && (*(_DWORD *)(a2 + 4) & 0x402) != 0
      && !SeSinglePrivilegeCheck(*(_QWORD *)&SeSystemProfilePrivilege, *((_BYTE *)KeGetCurrentThread() + 562)) )
    {
      return 3221225569i64;
    }
    ExAcquirePushLockExclusiveEx(a1 + 704, 0i64);
    v7 = 32i64 * *(unsigned __int8 *)(a1 + 834);
    a3 = *(unsigned __int8 *)(a1 + 834);
    v8 = v7 + *(_QWORD *)(a1 + 1080) + 4260i64;
    if( !v8
      || (v9 = *(_DWORD *)(v8 + 4), (v9 & 4) == 0)
      || (v9 & 0x100) == 0
      || a2 && (v26 = *(_DWORD *)(a2 + 4), (v26 & 4) != 0) && (v26 & 0x100) != 0 )
    {
      if( a2 )
      {
        v10 = *(_DWORD *)(a2 + 4);
        if( (v10 & 4) != 0 && (v10 & 0x100) != 0 )
        {
          if( !v8 || (v11 = *(_DWORD *)(v8 + 4), (v11 & 4) == 0) || (v11 & 0x100) == 0 )
          {
            updated = EtwpCCSwapStart(*(unsigned int *)(a1 + 216));
            if( updated < 0 )
            {
LABEL_23:
              v24 = _InterlockedExchangeAdd64((volatile signed __int64 *)(a1 + 704), 0xFFFFFFFFFFFFFFFFui64);
              if( (v24 & 2) != 0 && (v24 & 4) == 0 )
                ExfTryToWakePushLock((volatile INT64 *)(a1 + 704));
              KeAbPostRelease((PVOID)(a1 + 704));
              return(unsigned int)updated;
            }
          }
        }
      }
    }
    else
    {
      EtwpCCSwapStop(*(unsigned int *)(a1 + 216), 1u);
    }
    v13 = *(_QWORD *)(a1 + 1080);
    v14 = (char *)&GroupMasks - v7 - v13;
    v15 = v13 + v7;
    v16 = a2 - v7 - v13;
    v17 = (int *)(v13 + v7 + 4260);
    v18 = (char *)&v29 - v7 - v13;
    v19 = 8i64;
    do
    {
      v20 = *(int *)((char *)v17 + v16 - 4260);
      *(int *)((char *)v17 + (_QWORD)v14 - 4260) = *v17 & ~v20;
      v21 = *v17++;
      *(int *)((char *)v17 + (_QWORD)v18 - 4264) = v20 & ~v21;
      --v19;
    }
    while( v19 );
    EtwpLogGroupMask(v4, (_PERFINFO_GROUPMASK *)v2, v15 + 4260);
    if( (*(_DWORD *)(a1 + 12) & 0x400) != 0 )
    {
      v22 = 1;
    }
    else
    {
      v22 = 0;
      EtwpKernelTraceRundown(&GroupMasks, v4, v2);
    }
    v23 = *(_QWORD *)(a1 + 1080);
    *(_OWORD *)(v23 + v7 + 4260) = *(_OWORD *)a2;
    *(_OWORD *)(v23 + v7 + 4276) = *(_OWORD *)(a2 + 16);
    updated = EtwpUpdateGlobalGroupMasks(v4, v2, a3);
    if( updated >= 0 )
    {
      EtwpLogGroupMask(v4, (_PERFINFO_GROUPMASK *)v2, a2);
      if( !v22 || (*(_DWORD *)(a1 + 832) & 2) != 0 )
        EtwpKernelTraceRundown(&v29, v4, v2);
    }
    EtwpLogAlwaysPresentRundown(v4);
    goto LABEL_23;
  }
  return result;
}

Referenced by:

EtwSetPerformanceTraceInformation
EtwpUpdateLoggerGroupMasks