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