KiPriQueueThreadPriorityChanged
VOID __stdcall KiPriQueueThreadPriorityChanged(_KPRIQUEUE *PriQueue, _ETHREAD *Thread){
__int64 BasePriority;
int QueuePriority;
bool v5;
__int64 v6;
int v8;
_DISPATCHER_HEADER *volatile Queue;
bool v10;
_ETHREAD *v11;
struct _KPRCB *CurrentPrcb;
BasePriority = Thread->Tcb.BasePriority;
QueuePriority = Thread->Tcb.QueuePriority;
v5 = 0;
v6 = (unsigned __int8)QueuePriority;
if( (unsigned __int8)QueuePriority == (_DWORD)BasePriority )
goto LABEL_2;
v8 = QueuePriority & 0x100;
if( !v8 )
{
Queue = Thread->Tcb.Queue;
_InterlockedDecrement((volatile signed __int32 *)Queue + v6 + 134);
_InterlockedAdd((volatile signed __int32 *)Queue + BasePriority + 134, 1u);
v5 = (int)BasePriority < (int)v6;
}
Thread->Tcb.QueuePriority = v8 | (unsigned __int8)BasePriority;
if( !v5 )
{
LABEL_2:
KiReleaseThreadLockSafe((INT64)Thread);
}
else
{
v10 = !_interlockedbittestandset((volatile signed __int32 *)PriQueue, 7u);
KiReleaseThreadLockSafe((INT64)Thread);
if( v10 )
KiActivateWaiterPriQueue((ULONG_PTR)PriQueue, v11);
else
KiActivateWaiterQueueWithNoLocks(&Thread->Tcb, (_DISPATCHER_HEADER *)PriQueue, 0i64);
CurrentPrcb = KeGetCurrentPrcb();
if( CurrentPrcb->DeferredReadyListHead.Next )
KiProcessThreadWaitList(CurrentPrcb, AdjustUnwait, 0i64, 0i64);
}
}Referenced by:
KeSetActualBasePriorityThread
KeSetBasePriorityThread
KeSetPriorityAndQuantumProcess