KeEnableProfiling
NTSTATUS __stdcall KeEnableProfiling(
_ETHREAD *Thread,
UINT64 Flags,
UINT64 HardwareCounters,
_THREAD_PERFORMANCE_DATA *UserData){
int v6;
_QWORD *PoolWithQuotaTag;
_QWORD *v10;
v6 = Flags;
if( (Flags & 0xFFFFFFFE) != 0 )
return -1073741811;
if( *((_QWORD *)Thread + 45) )
return -1073741053;
PoolWithQuotaTag = ExAllocatePoolWithQuotaTag((POOL_TYPE)520, 0x1A8ui64, 0x666F7250ui64);
v10 = PoolWithQuotaTag;
if( !PoolWithQuotaTag )
return -1073741801;
memset((INT64)PoolWithQuotaTag, 0i64);
v10[1] = UserData;
*((_DWORD *)v10 + 4) = v6;
v10[4] = HardwareCounters;
*((_QWORD *)Thread + 45) = v10;
_interlockedbittestandset((volatile signed __int32 *)Thread, 0x10u);
v10[3] = KeUpdateTotalCyclesCurrentThread((_KTHREAD *)Thread, 0i64);
if( (v6 & 1) != 0 || HardwareCounters )
{
KiBeginCounterAccumulation((_KTHREAD *)Thread, 0);
_interlockedbittestandset((volatile signed __int32 *)Thread, 0x11u);
}
return 0;
}Referenced by:
NtSetInformationThread