KiBeginCounterAccumulation

VOID __stdcall KiBeginCounterAccumulation(_ETHREAD *Thread, UINT8 CalledFromContextSwitch){
  __int64 v2; 
  __int64 v3; 
  __int64 v4; 
  unsigned int *v5; 
  __int64 v6; 
  _QWORD *v7; 
  v2 = *((_QWORD *)Thread + 45);
  v3 = *(_QWORD *)(v2 + 32);
  if( v3 )
  {
    v4 = 1i64;
    if( KiHwCountersCount )
    {
      v5 = (unsigned int *)KiHwCounters;
      v6 = (unsigned int)KiHwCountersCount;
      v7 = (_QWORD *)(v2 + 48);
      do
      {
        if( (v3 & v4) != 0 )
          *v7 = __readpmc(*v5);
        v4 *= 2i64;
        v7 += 3;
        ++v5;
        --v6;
      }
      while( v6 );
    }
  }
  if( (*(_DWORD *)(v2 + 16) & 1) != 0 )
  {
    if( CalledFromContextSwitch )
    {
      ++*(_DWORD *)(v2 + 20);
      *(_QWORD *)v2 |= 1i64 << *((_BYTE *)Thread + 643);
    }
  }
}

Referenced by:

KeEnableProfiling
KiBeginThreadAccountingPeriod
KiDirectSwitchThread
KiEndDebugAccumulation
KiRetireDpcList