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