KiUpdateThreadPriority
VOID __stdcall KiUpdateThreadPriority(_KPRCB *Prcb, _ETHREAD *Thread, INT64 NewPriority, UINT8 UpdateMatrix){
_KPRCB *CurrentPrcb;
char v7;
INT32 *SchedulerAssist;
bool v10;
char Priority;
_SINGLE_LIST_ENTRY *p_PropagateBoostsEntry;
INT64 v13;
CurrentPrcb = KeGetCurrentPrcb();
v7 = NewPriority;
if( (char)NewPriority > Thread->Tcb.Priority )
{
if( Thread->Tcb.AbWaitEntryCount )
{
p_PropagateBoostsEntry = &Thread->Tcb.PropagateBoostsEntry;
if( p_PropagateBoostsEntry->Next == (_SINGLE_LIST_ENTRY *)1 )
{
NewPriority = (INT64)&CurrentPrcb->AbPropagateBoostsList;
if( CurrentPrcb != (_KPRCB *)-34680i64 )
{
p_PropagateBoostsEntry->Next = *(_SINGLE_LIST_ENTRY **)NewPriority;
*(_QWORD *)NewPriority = p_PropagateBoostsEntry;
_InterlockedIncrement16(&Thread->Tcb.KeReferenceCount);
KiAbQueueAutoBoostDpc(CurrentPrcb);
}
}
}
}
Thread->Tcb.Priority = v7;
if( UpdateMatrix )
{
if( (Thread->Tcb.gap0[2] & 4) != 0 )
{
v10 = KiIsThreadRankNonZero(&Thread->Tcb, Prcb, (_KPRCB *)NewPriority) == 0;
Priority = 1;
if( v10 )
Priority = Thread->Tcb.Priority;
v7 = Priority;
}
*Prcb->PriorityState = v7;
SchedulerAssist = (INT32 *)Prcb->SchedulerAssist;
if( SchedulerAssist )
{
v13 = (unsigned int)KiVpThreadSystemWorkPriority;
if( Thread != Prcb->IdleThread )
v13 = (unsigned int)v7;
KiSetSchedulerAssistPriority(SchedulerAssist, v13, 0);
}
}
if( (*(&Thread->Tcb.MiscFlags + 1) & 0x400000) != 0 )
KiSetSchedulerAssistPriority((INT32 *)Thread->Tcb.SchedulerAssist, (unsigned int)Thread->Tcb.Priority, 1);
}Referenced by:
KeSetActualBasePriorityThread
KeStartThread
KeTransitionProcessorParkState
KeYieldExecution
KiApplyForegroundBoostThread
KiCompleteKernelInit
KiDeferredReadySingleThread
KiDirectSwitchThread
KiQuantumEnd
KiQueueReadyThread
KiSetPriorityBoost
KiSetPriorityThread
KiUpdateVPBackingThreadPriority