KiBeginThreadAccountingPeriod
VOID __stdcall KiBeginThreadAccountingPeriod(_KPRCB *Prcb, _ETHREAD *Thread, UINT64 NetCycles){
_ETHREAD *CurrentThread;
char v6;
char v7;
_PROC_PERF_DOMAIN *Domain;
_PROC_PERF_CONSTRAINT *Constraint;
unsigned int LatestFrequencyPercent;
unsigned int v11;
unsigned __int64 *v12;
int v13;
_KSCHEDULING_GROUP *volatile SchedulingGroup;
char *v15;
_BYTE *SchedulerAssist;
CurrentThread = Thread;
if( Thread )
{
v6 = 1;
}
else
{
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v6 = 0;
}
v7 = CurrentThread->Tcb.gap0[2];
if( (v7 & 0x10) != 0 )
Prcb->TaggedCyclesStart = Prcb->StartCycles;
if( (v7 & 0x20) != 0 )
{
Domain = Prcb->PowerState.CheckContext.Domain;
Constraint = Prcb->PowerState.CheckContext.Constraint;
if( Domain && Constraint )
{
if( Constraint->Selection.Autonomous )
{
LatestFrequencyPercent = Constraint->LatestFrequencyPercent;
}
else
{
LatestFrequencyPercent = Constraint->Selection.SelectedPercent;
if( LatestFrequencyPercent >= Domain->GuaranteedPercent )
LatestFrequencyPercent = Domain->GuaranteedPercent;
}
}
else
{
LatestFrequencyPercent = 100;
}
if( LatestFrequencyPercent < 0x4B )
v11 = LatestFrequencyPercent / 0x19;
else
v11 = 3;
v12 = &Prcb->Cycles[v11][Prcb->PowerState.ArchitecturalEfficiencyClass];
*v12 += NetCycles;
}
if( (v7 & 0x40) != 0 )
{
SchedulerAssist = CurrentThread->Tcb.SchedulerAssist;
if( SchedulerAssist )
SchedulerAssist[64] = 1;
}
Prcb->NestingLevel = 0;
if( v6 )
{
if( (v7 & 0x36) == 0 )
{
_enable();
return;
}
if( CurrentThread->Tcb.WaitBlock[0].SparePtr )
KiBeginCounterAccumulation(&CurrentThread->Tcb, 1u);
_enable();
if( (CurrentThread->Tcb.gap0[2] & 4) != 0 )
{
v13 = *(&CurrentThread->Tcb.MiscFlags + 1);
if( (v13 & 0x800) == 0 )
{
if( (v13 & 0x600) != 0 )
return;
SchedulingGroup = CurrentThread->Tcb.SchedulingGroup;
if( !SchedulingGroup )
return;
v15 = (char *)SchedulingGroup + Prcb->ScbOffset;
if( !v15 )
return;
while( (v15[112] & 2) == 0 )
{
v15 = (char *)*((_QWORD *)v15 + 51);
if( !v15 )
return;
}
}
KiInsertDeferredPreemptionApc(Prcb, &CurrentThread->Tcb, 1u);
}
}
else if( (v7 & 2) != 0 )
{
KiBeginCounterAccumulation(&CurrentThread->Tcb, 0);
}
}Referenced by:
KiIpiInterrupt
KiSpuriousDispatchNoEOI
KiSwInterrupt
KxIsrLinkage
SwapContext