KiEvaluateGroupSchedulingPreemption
VOID __stdcall KiEvaluateGroupSchedulingPreemption(
_KPRCB *TargetPrcb,
_ETHREAD *SelectedThread,
_ETHREAD *NewThread,
_KSCB **NewScb){
int v4;
_KPRCB *v7;
bool v8;
_KSCB *v9;
_KSCB *v10;
int v11;
int v12;
int v13;
_KSCB *v14;
int v15;
UINT64 NewRank;
UINT64 Rank;
v4 = 0;
v7 = TargetPrcb;
LODWORD(Rank) = 0;
v8 = *((_ETHREAD **)TargetPrcb + 2) == SelectedThread || TargetPrcb == KeGetCurrentPrcb();
v9 = (_KSCB *)*((_QWORD *)SelectedThread + 13);
if( v9 )
{
v9 = (_KSCB *)((char *)v9 + *((unsigned int *)TargetPrcb + 54));
if( v9 )
{
KiGetThreadEffectiveRankNonZero(SelectedThread, v9, (_KPRCB *)NewThread, v8, 0i64);
LODWORD(Rank) = v12;
}
}
v10 = (_KSCB *)*((_QWORD *)NewThread + 13);
LODWORD(NewRank) = 0;
*NewScb = 0i64;
if( !v10 )
goto LABEL_5;
v10 = (_KSCB *)((char *)v10 + *((unsigned int *)v7 + 54));
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 = *((_DWORD *)NewThread + 30);
if( (v15 & 0x200) == 0
&& *((char *)NewThread + 195) < 16
&& (v15 & 0xC00) == 0
&& KiShouldPreemptionBeDeferred((__int64)NewThread) )
{
_interlockedbittestandset((volatile signed __int32 *)NewThread + 30, 0xBu);
LABEL_5:
v11 = NewRank;
}
}
LABEL_6:
if( v9 && v10 && (_DWORD)Rank )
{
if( v11 )
KiGetComparisonRanks(v9, v10, &Rank, &NewRank);
}
}Referenced by:
KiDeferredReadySingleThread