KeEnableProfiling
VOID __stdcall KeEnableProfiling(
_ETHREAD *Thread,
UINT64 Flags,
UINT64 HardwareCounters,
_THREAD_PERFORMANCE_DATA *UserData,
INT64 a5,
ULONGLONG pullResult){
int v8;
_QWORD *PoolWithQuotaTag;
_QWORD *v11;
v8 = Flags;
if( (Flags & 0xFFFFFFFE) == 0 && !Thread->Tcb.WaitBlock[0].SparePtr )
{
PoolWithQuotaTag = ExAllocatePoolWithQuotaTag((POOL_TYPE)520, 0x1A8ui64, 0x666F7250ui64);
v11 = PoolWithQuotaTag;
if( PoolWithQuotaTag )
{
memset(PoolWithQuotaTag, 0i64, 0x1A8u);
v11[1] = UserData;
*((_DWORD *)v11 + 4) = v8;
v11[4] = HardwareCounters;
Thread->Tcb.WaitBlock[0].SparePtr = v11;
_interlockedbittestandset((volatile signed __int32 *)Thread, 0x10u);
v11[3] = KeUpdateTotalCyclesCurrentThread(&Thread->Tcb, 0i64);
if( (v8 & 1) != 0 || HardwareCounters )
{
KiBeginCounterAccumulation(&Thread->Tcb, 0);
_interlockedbittestandset((volatile signed __int32 *)Thread, 0x11u);
}
}
}
}Referenced by:
NtSetInformationThread