KiBeginCounterAccumulation

VOID __stdcall KiBeginCounterAccumulation(_ETHREAD *Thread, UINT8 CalledFromContextSwitch){
  _QWORD *SparePtr; 
  __int64 v3; 
  __int64 v4; 
  unsigned int *v5; 
  __int64 v6; 
  _QWORD *v7; 

  SparePtr = Thread->Tcb.WaitBlock[0].SparePtr;
  v3 = SparePtr[4];
  if( v3 )
  {
    v4 = 1i64;
    if( KiHwCountersCount )
    {
      v5 = KiHwCounters;
      v6 = (unsigned int)KiHwCountersCount;
      v7 = SparePtr + 6;
      do
      {
        if( (v3 & v4) != 0 )
          *v7 = __readpmc(*v5);
        v4 *= 2i64;
        v7 += 3;
        ++v5;
        --v6;
      }
      while( v6 );
    }
  }
  if( (SparePtr[2] & 1) != 0 )
  {
    if( CalledFromContextSwitch )
    {
      ++*((_DWORD *)SparePtr + 5);
      *SparePtr |= 1i64 << Thread->Tcb.WaitReason;
    }
  }
}

Referenced by:

KeEnableProfiling
KiBeginThreadAccountingPeriod
KiDirectSwitchThread
KiEndDebugAccumulation
KiRetireDpcList
KiStartThreadCycleAccumulation