EtwpUpdateGlobalGroupMasks

INT64 __stdcall EtwpUpdateGlobalGroupMasks(INT64 LoggerId, UINT64 a2, UINT64 a3){
  __int64 v3; 
  __int64 v4; 
  __int64 v6; 
  __int64 v7; 
  __int64 v8; 
  INT64 v9; 
  _PERFINFO_GROUPMASK *p_DesiredFlags; 
  __int64 v11; 
  _DWORD *v12; 
  _EJOB *v13; 
  __int128 v14; 
  _EJOB *NextSilo; 
  INT64 v16; 
  _PERFINFO_GROUPMASK *v17; 
  __int64 v18; 
  __m128i si128; 
  unsigned __int64 v20; 
  __int64 v21; 
  __m128i v22; 
  __m128i v23; 
  int v24; 
  __int64 v26; 
  _EJOB *v27; 
  __int64 v28; 
  __int64 v29; 
  _PERFINFO_GROUPMASK *v30; 
  int v31; 
  _PERFINFO_GROUPMASK DesiredFlags; 
  CHAR v33[16]; 
  __int128 v34; 
  _PERFINFO_GROUPMASK FlagsToDisable; 
  v3 = (unsigned int)a3;
  v4 = (unsigned int)a2;
  *(_OWORD *)v33 = 0i64;
  v34 = 0i64;
  memset(&FlagsToDisable, 0, sizeof(FlagsToDisable));
  KeWaitForSingleObject(&EtwpGroupMaskMutex, Executive, 0, 0, 0i64);
  v6 = 8i64;
  if( (unsigned int)v3 < 8
    && ((unsigned int)v4 >= *(_DWORD *)(LoggerId + 16) ? (LOBYTE(v7) = 1) : (v7 = *(_QWORD *)(*(_QWORD *)(LoggerId + 456)
                                                                                            + 8 * v4)),
        (v7 & 1) != 0) )
  {
    v24 = -2147483611;
  }
  else
  {
    v8 = 10i64;
    v9 = LoggerId - (_QWORD)&DesiredFlags + 4260;
    memset(&DesiredFlags, 0, sizeof(DesiredFlags));
    do
    {
      p_DesiredFlags = &DesiredFlags;
      v11 = 8i64;
      do
      {
        p_DesiredFlags->Masks[0] |= *(unsigned int *)((char *)p_DesiredFlags->Masks + v9);
        p_DesiredFlags = (_PERFINFO_GROUPMASK *)((char *)p_DesiredFlags + 4);
        --v11;
      }
      while( v11 );
      v9 += 32i64;
      --v8;
    }
    while( v8 );
    v12 = (_DWORD *)(LoggerId + 4228);
    v13 = 0i64;
    v14 = *(_OWORD *)&DesiredFlags.Masks[4];
    *(_OWORD *)(LoggerId + 4228) = *(_OWORD *)DesiredFlags.Masks;
    *(_OWORD *)(LoggerId + 4244) = v14;
    while( 1 )
    {
      NextSilo = PspGetNextSilo(v13, 1u);
      if( !NextSilo )
        break;
      v26 = PsGetServerSiloGlobals((__int64)NextSilo)[108];
      if( v26 )
      {
        v28 = 8i64;
        v29 = v26 - (_QWORD)&DesiredFlags;
        v30 = &DesiredFlags;
        do
        {
          v30->Masks[0] |= *(unsigned int *)((char *)&v30[132].Masks[1] + v29);
          v30 = (_PERFINFO_GROUPMASK *)((char *)v30 + 4);
          --v28;
        }
        while( v28 );
      }
      v13 = v27;
    }
    v16 = EtwpHostSiloState - (_QWORD)&DesiredFlags;
    v17 = &DesiredFlags;
    v18 = 8i64;
    do
    {
      v17->Masks[0] |= *(unsigned int *)((char *)&v17[132].Masks[1] + v16);
      v17 = (_PERFINFO_GROUPMASK *)((char *)v17 + 4);
      --v18;
    }
    while( v18 );
    si128 = _mm_load_si128((const __m128i *)&_xmm_ffffffffffffffffffffffffffffffff);
    v20 = 0i64;
    v21 = 2i64;
    do
    {
      v22 = _mm_loadu_si128((const __m128i *)((char *)&PerfGlobalGroupMask + v20));
      v23 = _mm_loadu_si128((const __m128i *)((char *)&DesiredFlags + v20));
      v20 += 16i64;
      *(__int128 *)((char *)&v34 + v20) = (__int128)_mm_and_si128(_mm_andnot_si128(v23, si128), v22);
      *(__m128i *)&DesiredFlags.Masks[v20 / 4 + 4] = _mm_and_si128(_mm_andnot_si128(v22, si128), v23);
      --v21;
    }
    while( v21 );
    EtwpDisableKernelTrace(&DesiredFlags, &FlagsToDisable, LoggerId);
    v24 = EtwpEnableKernelTrace((__m128i *)&DesiredFlags, v33, (UINT64 *)LoggerId, (unsigned int)v4);
    if( v24 < 0 )
    {
      do
      {
        v31 = ~*(_DWORD *)&v33[(_QWORD)v12 - LoggerId - 4228];
        *v12 &= v31;
        v12[8 * v3 + 8] &= v31;
        *(_DWORD *)((char *)v12++ + (_QWORD)&DesiredFlags - LoggerId - 4228) &= v31;
        --v6;
      }
      while( v6 );
    }
    *(_PERFINFO_GROUPMASK *)&PerfGlobalGroupMask = DesiredFlags;
    if( (DesiredFlags.Masks[1] & 4) != 0 )
      _interlockedbittestandset(&KiCpuTracingFlags, 0);
    else
      _interlockedbittestandreset(&KiCpuTracingFlags, 0);
  }
  KeReleaseMutex(&EtwpGroupMaskMutex, 0);
  return(unsigned int)v24;
}

Referenced by:

EtwDereferenceSpinLockCounters
EtwReferenceSpinLockCounters
EtwpCoverageSamplerStart
EtwpCoverageSamplerStop
EtwpUpdateGroupMasks
EtwpUpdateKernelGroupsWork