PpmInstallFeedbackCounters
VOID __stdcall PpmInstallFeedbackCounters(_KPRCB *Prcb, _PROC_FEEDBACK_COUNTER **Counters){
_KPRCB *v2;
__int64 Number;
unsigned __int8 CurrentIrql;
__int64 v6;
_PROC_FEEDBACK *p_PerfFeedback;
UINT64 PerformanceCounter;
bool v9;
signed __int64 v10;
_PROC_FEEDBACK_COUNTER *v11;
UINT64 Value;
_GROUP_AFFINITY v13;
_GROUP_AFFINITY PreviousAffinity;
int v15;
LODWORD(Value) = 0;
v2 = Prcb;
Number = Prcb->Number;
v13 = 0i64;
*(_DWORD *)v13.Reserved = 0;
LODWORD(Number) = KiProcessorIndexToNumberMappingTable[Number];
*(_DWORD *)&v13.Group = (unsigned __int16)((unsigned int)Number >> 6);
v13.Reserved[2] = 0;
v13.Mask = 1i64 << (Number & 0x3F);
PreviousAffinity = 0i64;
KeSetSystemGroupAffinityThread(&v13, &PreviousAffinity);
CurrentIrql = KeGetCurrentIrql();
v6 = 2i64;
__writecr8(2ui64);
p_PerfFeedback = &v2->PowerState.PerfFeedback;
PerformanceCounter = KeQueryPerformanceCounter(0i64);
PpmContinueActiveTimeAccumulation(v2, PerformanceCounter);
LOWORD(v2) = v15;
_disable();
v9 = ((unsigned __int16)v2 & 0x200) != 0;
KxAcquireSpinLock(&p_PerfFeedback->Lock);
v10 = (char *)p_PerfFeedback - (char *)Counters;
do
{
v11 = *Counters;
if( *Counters )
{
if( v11->DiscardIdleTime )
{
p_PerfFeedback->CounterDiscardsIdleTime = 1;
v11 = *Counters;
}
*(_PROC_FEEDBACK_COUNTER **)((char *)Counters + v10 + 24) = v11;
*(_PROC_FEEDBACK_COUNTER **)((char *)Counters + v10 + 64) = (_PROC_FEEDBACK_COUNTER *)(100
* p_PerfFeedback->UnscaledTime);
PpmPerfFeedbackCounterRead(*Counters, 1u, &Value);
}
++Counters;
--v6;
}
while( v6 );
if( p_PerfFeedback->Counters[1] )
{
p_PerfFeedback->KernelTimesIndex = 1;
}
else if( p_PerfFeedback->Counters[0] )
{
p_PerfFeedback->KernelTimesIndex = 0;
}
KxReleaseSpinLock(&p_PerfFeedback->Lock);
if( v9 )
_enable();
__writecr8(CurrentIrql);
KeRevertToUserGroupAffinityThread(&PreviousAffinity);
}Referenced by:
PpmRegisterPerfStates