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