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