KiEvaluateGroupSchedulingPreemption
VOID __fastcall KiEvaluateGroupSchedulingPreemption(
_KPRCB *TargetPrcb,
_ETHREAD *SelectedThread,
_ETHREAD *NewThread,
_KSCB **NewScb){
int v4;
_KPRCB *v7;
bool v8;
_KSCB *SchedulingGroup;
_KSCB *v10;
int v11;
int v12;
int v13;
_KSCB *v14;
int v15;
UINT64 NewRank;
UINT64 Rank;
v4 = 0;
v7 = TargetPrcb;
LODWORD(Rank) = 0;
v8 = TargetPrcb->NextThread == SelectedThread || TargetPrcb == KeGetCurrentPrcb();
SchedulingGroup = (_KSCB *)SelectedThread->Tcb.SchedulingGroup;
if( SchedulingGroup )
{
SchedulingGroup = (_KSCB *)((char *)SchedulingGroup + TargetPrcb->ScbOffset);
if( SchedulingGroup )
{
KiGetThreadEffectiveRankNonZero(SelectedThread, SchedulingGroup, (_KPRCB *)NewThread, v8, 0i64);
LODWORD(Rank) = v12;
}
}
v10 = (_KSCB *)NewThread->Tcb.SchedulingGroup;
LODWORD(NewRank) = 0;
*NewScb = 0i64;
if( !v10 )
goto LABEL_5;
v10 = (_KSCB *)((char *)v10 + v7->ScbOffset);
if( !v10 )
goto LABEL_5;
KiGetThreadEffectiveRankNonZero(NewThread, v10, (_KPRCB *)NewThread, 1u, 0i64);
LODWORD(NewRank) = v13;
v11 = v13;
if( v13 )
{
*NewScb = v10;
goto LABEL_6;
}
v14 = v10;
do
{
v4 += v14->Rank;
v14 = v14->Parent;
}
while( v14 );
if( v4 )
{
v15 = *(&NewThread->Tcb.MiscFlags + 1);
if( (v15 & 0x200) == 0
&& NewThread->Tcb.Priority < 16
&& (v15 & 0xC00) == 0
&& KiShouldPreemptionBeDeferred(&NewThread->Tcb) )
{
_interlockedbittestandset((volatile signed __int32 *)&NewThread->Tcb.116 + 1, 0xBu);
LABEL_5:
v11 = NewRank;
}
}
LABEL_6:
if( SchedulingGroup && v10 && (_DWORD)Rank )
{
if( v11 )
KiGetComparisonRanks(SchedulingGroup, v10, &Rank, &NewRank);
}
}Referenced by:
KiDeferredReadySingleThread