EtwpUpdateGlobalGroupMasks
NTSTATUS __stdcall EtwpUpdateGlobalGroupMasks(INT64 LoggerId, UINT64 a2, UINT64 a3){
__int64 v3;
__int64 v4;
__int64 v6;
__int64 v7;
__int64 v8;
INT64 v9;
PERFINFO_GROUPMASK *v10;
__int64 v11;
_DWORD *v12;
_EJOB *v13;
__int128 v14;
_EJOB *NextSilo;
INT64 v16;
PERFINFO_GROUPMASK *v17;
__int64 v18;
__m128i si128;
__int64 v20;
__int64 v21;
__m128i v22;
__m128i v23;
int v24;
_ETW_SILODRIVERSTATE *EtwSiloState;
_EJOB *v27;
__int64 v28;
signed __int64 v29;
PERFINFO_GROUPMASK *v30;
int v31;
PERFINFO_GROUPMASK DesiredFlags[4];
__int128 v33;
PERFINFO_GROUPMASK FlagsToEnable[4];
__int128 v35;
int v36[4];
__int128 v37;
v3 = (unsigned int)a3;
v4 = (unsigned int)a2;
*(_OWORD *)FlagsToEnable = 0i64;
v35 = 0i64;
*(_OWORD *)v36 = 0i64;
v37 = 0i64;
KeWaitForSingleObject((UINT64)&ExBootDevicesRemovedEvent + 2368, 0, 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;
*(_OWORD *)DesiredFlags = 0i64;
v33 = 0i64;
do
{
v10 = DesiredFlags;
v11 = 8i64;
do
{
*v10 |= *(PERFINFO_GROUPMASK *)((char *)v10 + v9);
++v10;
--v11;
}
while( v11 );
v9 += 32i64;
--v8;
}
while( v8 );
v12 = (_DWORD *)(LoggerId + 4228);
v13 = 0i64;
v14 = v33;
*(_OWORD *)(LoggerId + 4228) = *(_OWORD *)DesiredFlags;
*(_OWORD *)(LoggerId + 4244) = v14;
while( 1 )
{
NextSilo = PspGetNextSilo(v13, 1u);
if( !NextSilo )
break;
EtwSiloState = PsGetServerSiloGlobals(NextSilo)->EtwSiloState;
if( EtwSiloState )
{
v28 = 8i64;
v29 = (char *)EtwSiloState - (char *)DesiredFlags;
v30 = DesiredFlags;
do
{
*v30 |= *(PERFINFO_GROUPMASK *)((char *)v30 + v29 + 4228);
++v30;
--v28;
}
while( v28 );
}
v13 = v27;
}
v16 = EtwpHostSiloState - (_QWORD)DesiredFlags;
v17 = DesiredFlags;
v18 = 8i64;
do
{
*v17 |= *(PERFINFO_GROUPMASK *)((char *)v17 + v16 + 4228);
++v17;
--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 * 4));
v23 = _mm_loadu_si128((const __m128i *)&DesiredFlags[v20]);
v20 += 4i64;
*(__m128i *)&v36[v20 - 4] = _mm_and_si128(_mm_andnot_si128(v23, si128), v22);
*(__m128i *)&FlagsToEnable[v20 - 4] = _mm_and_si128(_mm_andnot_si128(v22, si128), v23);
--v21;
}
while( v21 );
EtwpDisableKernelTrace(DesiredFlags, v36, (UINT64 *)LoggerId, (unsigned int)v4);
v24 = EtwpEnableKernelTrace(DesiredFlags, FlagsToEnable, LoggerId);
if( v24 < 0 )
{
do
{
v31 = ~*(_DWORD *)((char *)v12 + (_QWORD)FlagsToEnable - LoggerId - 4228);
*v12 &= v31;
v12[8 * v3 + 8] &= v31;
*(_DWORD *)((char *)v12++ + (_QWORD)DesiredFlags - LoggerId - 4228) &= v31;
--v6;
}
while( v6 );
}
*(_OWORD *)&PerfGlobalGroupMask = *(_OWORD *)DesiredFlags;
xmmword_140CFB490 = v33;
if( (DesiredFlags[1] & 4) != 0 )
_interlockedbittestandset(&KiCpuTracingFlags, 0);
else
_interlockedbittestandreset(&KiCpuTracingFlags, 0);
}
KeReleaseMutex((_KMUTANT *)((char *)&ExBootDevicesRemovedEvent + 2368), 0);
return v24;
}Referenced by:
EtwDereferenceSpinLockCounters
EtwReferenceSpinLockCounters
EtwpCoverageSamplerStart
EtwpCoverageSamplerStop
EtwpUpdateGroupMasks
EtwpUpdateKernelGroupsWork