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