KiIsThreadRankNonZero
UINT8 __stdcall KiIsThreadRankNonZero(_ETHREAD *Thread, _KPRCB *Prcb, _KPRCB *a3){
int v4;
unsigned __int8 CurrentIrql;
_KPRCB *CurrentPrcb;
_KSCHEDULING_GROUP *volatile SchedulingGroup;
_KSCB *v8;
int v9;
if( Thread->Tcb.Priority >= 16 || !Thread->Tcb.SchedulingGroup )
return 0;
v4 = 0;
if( Prcb )
{
CurrentIrql = 2;
CurrentPrcb = Prcb;
}
else
{
CurrentIrql = KeGetCurrentIrql();
__writecr8(2ui64);
CurrentPrcb = KeGetCurrentPrcb();
}
SchedulingGroup = Thread->Tcb.SchedulingGroup;
if( SchedulingGroup )
{
v8 = (_KSCB *)((char *)SchedulingGroup + CurrentPrcb->ScbOffset);
if( v8 )
{
if( Prcb )
{
KiGetThreadEffectiveRankNonZero(Thread, v8, 0i64, 0, 0i64);
v4 = v9;
}
else
{
do
{
v4 = (*((unsigned __int8 *)v8 + 112) >> 3) & 1;
if( v4 )
break;
v8 = v8->Parent;
}
while( v8 );
}
}
}
if( CurrentIrql < 2u )
__writecr8(CurrentIrql);
return v4 != 0;
}Referenced by:
KeDelayExecutionThread
KeQueryEffectiveBasePriorityThread
KeQueryEffectivePriorityThread
KeSetActualBasePriorityThread
KeTransitionProcessorParkState
KeUpdateThreadSchedulingProperties
KeYieldExecution
KiApplyForegroundBoostThread
KiCheckForEffectivePriorityChange
KiConfigureSchedulingInformation
KiDeferGroupSchedulingPreemption
KiDeferredReadySingleThread
KiDirectSwitchThread
KiGroupSchedulingGenerationEnd
KiGroupSchedulingQuantumEnd
KiQuantumEnd
KiRemoveBoostThread
KiSchedulerApc
KiSearchForNewThread
KiSearchForNewThreadOnProcessor
KiSelectNextThread
KiSetPriorityThread
KiSwapThread
KiTransitionSchedulingGroupGeneration
KiUpdateGlobalCpuSetConfiguration
KiUpdateThreadPriority