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;
__int64 v11;
_QWORD *v12;
bool v13;
__int64 v14;
struct _KPRCB *CurrentPrcb;
_DWORD *v17;
_KTHREAD *v18;
_ETHREAD *v19;
char v20;
__int64 v21;
INT64 v22;
bool v23;
UINT64 v24;
char v25;
_KTHREAD *v26;
_ETHREAD *v27;
char v28;
char v29;
__int64 v30;
INT64 v31;
bool v32;
__int64 v33;
_KPRCB *v34;
__int64 v35;
_KPRCB *ControlPrcb;
_KSHARED_READY_QUEUE *ControlReadyQueue;
v3 = 0;
ControlPrcb = 0i64;
ControlReadyQueue = 0i64;
v6 = (char)KiComputePriorityFloor((__int64)Thread, Priority);
if( *((char *)Thread + 195) == v6 )
return 0;
KiAcquireThreadStateLock(Thread, &ControlPrcb, &ControlReadyQueue);
v8 = *((char *)Thread + 195);
v9 = 0;
if( v7 != 2 )
{
if( v7 == 1 )
{
v10 = ControlPrcb;
KiRemoveThreadFromAnyReadyQueue(ControlPrcb, ControlReadyQueue, (_KTHREAD *)Thread, (unsigned int)v8);
KiUpdateThreadPriority(0i64, (_KTHREAD *)Thread, v6, 0);
KiPrepareReadyThreadForRescheduling((_KTHREAD *)Thread, v6, ReadyList);
}
else if( v7 == 3 )
{
v10 = ControlPrcb;
KiUpdateThreadPriority(ControlPrcb, (_KTHREAD *)Thread, v6, 1u);
if( (int)v6 < v8 )
{
v26 = (_ETHREAD *)KiSelectReadyThreadEx(v10, (_KTHREAD *)Thread, 0);
v27 = v26;
if( v26 )
{
if( (*((_BYTE *)v26 + 2) & 4) != 0 )
{
KiIsThreadRankNonZero(v26, v10);
v28 = 1;
if( !v29 )
v28 = *((_BYTE *)v27 + 195);
}
else
{
v28 = *((_BYTE *)v26 + 195);
}
**((_BYTE **)v10 + 7) = v28;
v30 = *((_QWORD *)v10 + 4247);
if( v30 )
{
v31 = (unsigned int)KiVpThreadSystemWorkPriority;
if( v27 != *((_ETHREAD **)v10 + 3) )
v31 = (unsigned int)v28;
KiSetSchedulerAssistPriority(*((volatile INT32 **)v10 + 4247), v31, 0);
v30 = *((_QWORD *)v10 + 4247);
}
v32 = v27 == *((_ETHREAD **)v10 + 3);
*((_QWORD *)v10 + 2) = v27;
if( v30 )
*(_BYTE *)(v30 + 16) = v32;
if( *((_BYTE *)v27 + 388) == 1 )
*((_DWORD *)v27 + 33) = *((_DWORD *)v27 + 33) - *((_DWORD *)v27 + 109) + KUSER_SHARED_DATA.TickCount.LowPart;
*((_BYTE *)v27 + 388) = 3;
KiInsertDeferredReadyList((INT64)ReadyList, (INT64)Thread);
v10 = ControlPrcb;
}
}
else
{
v3 = v6;
}
}
else
{
KiUpdateThreadPriority(0i64, (_KTHREAD *)Thread, v6, 0);
v10 = ControlPrcb;
}
goto LABEL_9;
}
v10 = ControlPrcb;
v11 = *((_QWORD *)ControlPrcb + 2);
v12 = (_QWORD *)((char *)ControlPrcb + 16);
KiUpdateThreadPriority(ControlPrcb, (_KTHREAD *)Thread, v6, v11 == 0);
v13 = (int)v6 <= v8;
if( (int)v6 >= v8 )
goto LABEL_4;
if( v11 )
{
v13 = (int)v6 <= v8;
LABEL_4:
if( v13 || v11 )
goto LABEL_9;
if( *((_BYTE *)Thread + 388) == 2 )
v3 = v6;
goto LABEL_8;
}
v10 = ControlPrcb;
if( *((_BYTE *)Thread + 388) != 2 )
{
if( *((_DWORD *)ControlPrcb + 7942) >> (v6 + 1) )
*((_BYTE *)Thread + 112) |= 0x10u;
goto LABEL_9;
}
v18 = (_ETHREAD *)KiSelectReadyThreadEx(ControlPrcb, (_KTHREAD *)Thread, 0);
v19 = v18;
if( v18 )
{
if( (*((_BYTE *)v18 + 2) & 4) != 0 )
{
KiIsThreadRankNonZero(v18, v10);
v20 = 1;
if( !v25 )
v20 = *((_BYTE *)v19 + 195);
}
else
{
v20 = *((_BYTE *)v18 + 195);
}
**((_BYTE **)v10 + 7) = v20;
v21 = *((_QWORD *)v10 + 4247);
if( v21 )
{
v22 = (unsigned int)KiVpThreadSystemWorkPriority;
if( v19 != *((_ETHREAD **)v10 + 3) )
v22 = (unsigned int)v20;
KiSetSchedulerAssistPriority(*((volatile INT32 **)v10 + 4247), v22, 0);
v21 = *((_QWORD *)v10 + 4247);
}
v23 = v19 == *((_ETHREAD **)v10 + 3);
*v12 = v19;
if( v21 )
*(_BYTE *)(v21 + 16) = v23;
if( *((_BYTE *)v19 + 388) == 1 )
*((_DWORD *)v19 + 33) = *((_DWORD *)v19 + 33) - *((_DWORD *)v19 + 109) + KUSER_SHARED_DATA.TickCount.LowPart;
*((_BYTE *)v19 + 388) = 3;
v9 = 1;
LABEL_8:
v10 = ControlPrcb;
}
LABEL_9:
KiUpdateSharedReadyQueueAffinityThread(0i64, (_KTHREAD *)Thread);
KiReleaseThreadStateLock(v14, (__int64)v10, (volatile signed __int64 *)ControlReadyQueue);
if( v9 )
{
v24 = *((unsigned int *)ControlPrcb + 9);
if( *((_DWORD *)KeGetPcr() + 105) != (_DWORD)v24 )
KiSendSoftwareInterrupt(v24, 2u);
}
if( v3 > 0 )
{
CurrentPrcb = KeGetCurrentPrcb();
if( (KiVelocityFlags & 2) != 0 )
{
v17 = (_DWORD *)*((_QWORD *)ControlPrcb + 4247);
if( v17 )
{
if( *((_QWORD *)CurrentPrcb + 4247)
&& CurrentPrcb != ControlPrcb
&& v3 >= 8
&& ((*v17 & 0x100000) != 0 || (*v17 & 0x40000) != 0 && (unsigned __int8)*v17 < v3) )
{
v23 = HvlpVirtualProcessorsIdentityMapped == 0;
v33 = *((_QWORD *)CurrentPrcb + 4247);
v34 = ControlPrcb;
*(_DWORD *)(v33 + 12) = 2;
v35 = *((unsigned int *)v34 + 9);
if( v23 )
LODWORD(v35) = (unsigned __int8)HvlpVirtualProcessorMapping[2 * (unsigned int)v35 + 1] | ((unsigned __int8)HvlpVirtualProcessorMapping[2 * v35] << 6);
*(_DWORD *)(v33 + 8) = v35;
__writemsr(0x400000C2u, (unsigned int)v35);
}
}
}
}
return 1;
}Referenced by:
KeBoostPriorityThread
KeClearSystemPriority
KeRemovePriQueue
KeSetBasePriorityThread
KeSetPriorityAndQuantumProcess
KeSetPriorityBoost
KeSetPriorityThread
KeSetThreadSchedulerAssist
KiAbApplyWakeupBoost
KiAbSetMinimumThreadPriority
KiAbThreadUnboostCpuPriority
KiSetPriorityBoost
KiTryUnwaitThreadWithPriority
KiUpdateVpBackingThreadPriorityFromTopLevel
PsImpersonateContainerOfThread