KiSetPriorityThread
UINT8 __stdcall KiSetPriorityThread(_ETHREAD *Thread, _SINGLE_LIST_ENTRY *ReadyList, INT64 Priority){
int v3;
unsigned int v6;
char v7;
int v8;
char v9;
_KPRCB *v10;
_ETHREAD *NextThread;
_ETHREAD **p_NextThread;
bool v13;
_KPRCB *v14;
struct _KPRCB *CurrentPrcb;
_DWORD *v17;
_ETHREAD *v18;
_KPRCB *v19;
_ETHREAD *v20;
char v21;
_BYTE *v22;
INT64 v23;
bool v24;
UINT64 Number;
UINT8 v26;
_ETHREAD *v27;
_KPRCB *v28;
_ETHREAD *v29;
char v30;
UINT8 IsThreadRankNonZero;
_BYTE *SchedulerAssist;
INT64 v33;
bool v34;
_DWORD *v35;
_KPRCB *v36;
__int64 v37;
_KPRCB *ControlPrcb;
_KSHARED_READY_QUEUE *ControlReadyQueue;
v3 = 0;
ControlPrcb = 0i64;
ControlReadyQueue = 0i64;
v6 = KiComputePriorityFloor(&Thread->Tcb, Priority);
if( Thread->Tcb.Priority == v6 )
return 0;
KiAcquireThreadStateLock(Thread, &ControlPrcb, &ControlReadyQueue);
v8 = Thread->Tcb.Priority;
v9 = 0;
if( v7 != 2 )
{
if( v7 == 1 )
{
v10 = ControlPrcb;
KiRemoveThreadFromAnyReadyQueue(ControlPrcb, ControlReadyQueue, (__int64)Thread, (unsigned int)v8);
KiUpdateThreadPriority(0i64, &Thread->Tcb, v6, 0);
KiPrepareReadyThreadForRescheduling(&Thread->Tcb, v6, ReadyList);
}
else if( v7 == 3 )
{
v10 = ControlPrcb;
KiUpdateThreadPriority(ControlPrcb, &Thread->Tcb, v6, 1u);
if( (int)v6 < v8 )
{
v27 = (_ETHREAD *)KiSelectReadyThreadEx(v10, &Thread->Tcb, 0);
v29 = v27;
if( v27 )
{
if( (v27->Tcb.gap0[2] & 4) != 0 )
{
IsThreadRankNonZero = KiIsThreadRankNonZero(&v27->Tcb, v10, v28);
v30 = 1;
if( !IsThreadRankNonZero )
v30 = v29->Tcb.Priority;
}
else
{
v30 = v27->Tcb.Priority;
}
*v10->PriorityState = v30;
SchedulerAssist = v10->SchedulerAssist;
if( SchedulerAssist )
{
v33 = (unsigned int)KiVpThreadSystemWorkPriority;
if( v29 != v10->IdleThread )
v33 = (unsigned int)v30;
KiSetSchedulerAssistPriority((INT32 *)v10->SchedulerAssist, v33, 0);
SchedulerAssist = v10->SchedulerAssist;
}
v34 = v29 == v10->IdleThread;
v10->NextThread = v29;
if( SchedulerAssist )
SchedulerAssist[16] = v34;
if( v29->Tcb.WaitBlockFill6[68] == 1 )
v29->Tcb.ReadyTime = v29->Tcb.ReadyTime
- v29->Tcb.WaitBlock[2].SpareLong
+ KUSER_SHARED_DATA.TickCount.LowPart;
v29->Tcb.WaitBlockFill6[68] = 3;
KiInsertDeferredReadyList((INT64)ReadyList, (INT64)Thread);
v10 = ControlPrcb;
}
}
else
{
v3 = v6;
}
}
else
{
KiUpdateThreadPriority(0i64, &Thread->Tcb, v6, 0);
v10 = ControlPrcb;
}
goto LABEL_9;
}
v10 = ControlPrcb;
NextThread = ControlPrcb->NextThread;
p_NextThread = &ControlPrcb->NextThread;
KiUpdateThreadPriority(ControlPrcb, &Thread->Tcb, v6, NextThread == 0i64);
v13 = (int)v6 <= v8;
if( (int)v6 >= v8 )
goto LABEL_4;
if( NextThread )
{
v13 = (int)v6 <= v8;
LABEL_4:
if( v13 || NextThread )
goto LABEL_9;
if( Thread->Tcb.WaitBlockFill6[68] == 2 )
v3 = v6;
goto LABEL_8;
}
v10 = ControlPrcb;
if( Thread->Tcb.WaitBlockFill6[68] != 2 )
{
if( ControlPrcb->ReadySummary >> (v6 + 1) )
Thread->Tcb.WaitRegister.Flags |= 0x10u;
goto LABEL_9;
}
v18 = (_ETHREAD *)KiSelectReadyThreadEx(ControlPrcb, &Thread->Tcb, 0);
v20 = v18;
if( v18 )
{
if( (v18->Tcb.gap0[2] & 4) != 0 )
{
v26 = KiIsThreadRankNonZero(&v18->Tcb, v10, v19);
v21 = 1;
if( !v26 )
v21 = v20->Tcb.Priority;
}
else
{
v21 = v18->Tcb.Priority;
}
*v10->PriorityState = v21;
v22 = v10->SchedulerAssist;
if( v22 )
{
v23 = (unsigned int)KiVpThreadSystemWorkPriority;
if( v20 != v10->IdleThread )
v23 = (unsigned int)v21;
KiSetSchedulerAssistPriority((INT32 *)v10->SchedulerAssist, v23, 0);
v22 = v10->SchedulerAssist;
}
v24 = v20 == v10->IdleThread;
*p_NextThread = v20;
if( v22 )
v22[16] = v24;
if( v20->Tcb.WaitBlockFill6[68] == 1 )
v20->Tcb.ReadyTime = v20->Tcb.ReadyTime - v20->Tcb.WaitBlock[2].SpareLong + KUSER_SHARED_DATA.TickCount.LowPart;
v20->Tcb.WaitBlockFill6[68] = 3;
v9 = 1;
LABEL_8:
v10 = ControlPrcb;
}
LABEL_9:
KiUpdateSharedReadyQueueAffinityThread(0i64, &Thread->Tcb);
KiReleaseThreadStateLock(v14, (_KSHARED_READY_QUEUE *)v10);
if( v9 )
{
Number = ControlPrcb->Number;
if( KeGetPcr()->Prcb.Number != (_DWORD)Number )
KiSendSoftwareInterrupt(Number, 2u);
}
if( v3 > 0 )
{
CurrentPrcb = KeGetCurrentPrcb();
if( (KiVelocityFlags & 2) != 0 )
{
v17 = ControlPrcb->SchedulerAssist;
if( v17 )
{
if( CurrentPrcb->SchedulerAssist
&& CurrentPrcb != ControlPrcb
&& v3 >= 8
&& ((*v17 & 0x100000) != 0 || (*v17 & 0x40000) != 0 && (unsigned __int8)*v17 < v3) )
{
v24 = HvlpVirtualProcessorsIdentityMapped == 0;
v35 = CurrentPrcb->SchedulerAssist;
v36 = ControlPrcb;
v35[3] = 2;
v37 = v36->Number;
if( v24 )
LODWORD(v37) = (unsigned __int8)HvlpVirtualProcessorMapping[2 * (unsigned int)v37 + 1] | ((unsigned __int8)HvlpVirtualProcessorMapping[2 * v37] << 6);
v35[2] = v37;
__writemsr(0x400000C2u, (unsigned int)v37);
}
}
}
}
return 1;
}Referenced by:
KeBoostPriorityThread
KeClearSystemPriority
KeRemovePriQueue
KeSetBasePriorityThread
KeSetPriorityAndQuantumProcess
KeSetPriorityBoost
KeSetPriorityThread
KeSetThreadSchedulerAssist
KiAbApplyWakeupBoost
KiAbSetMinimumThreadPriority
KiAbThreadUnboostCpuPriority
KiSetPriorityBoost
KiTryUnwaitThreadWithPriority
KiUpdateVpBackingThreadPriorityFromTopLevel
PsImpersonateContainerOfThread