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