KiPriQueueThreadPriorityChanged
VOID __fastcall KiPriQueueThreadPriorityChanged(volatile INT32 *a1, INT64 a2){
__int64 v2;
int v4;
bool v5;
__int64 v6;
int v8;
__int64 v9;
bool v10;
_KTHREAD *v11;
struct _KPRCB *CurrentPrcb;
v2 = *(char *)(a2 + 563);
v4 = *(_DWORD *)(a2 + 540);
v5 = 0;
v6 = (unsigned __int8)v4;
if( (unsigned __int8)v4 == (_DWORD)v2 )
goto LABEL_2;
v8 = v4 & 0x100;
if( !v8 )
{
v9 = *(_QWORD *)(a2 + 232);
_InterlockedDecrement((volatile signed __int32 *)(v9 + 4 * v6 + 536));
_InterlockedAdd((volatile signed __int32 *)(v9 + 4 * v2 + 536), 1u);
v5 = (int)v2 < (int)v6;
}
*(_DWORD *)(a2 + 540) = v8 | (unsigned __int8)v2;
if( !v5 )
{
LABEL_2:
KiReleaseThreadLockSafe(a2);
}
else
{
v10 = !_interlockedbittestandset(a1, 7u);
KiReleaseThreadLockSafe(a2);
if( v10 )
KiActivateWaiterPriQueue((_KPRIQUEUE *)a1, (_KTHREAD *)v11);
else
KiActivateWaiterQueueWithNoLocks((_ETHREAD *)a2, (_DISPATCHER_HEADER *)a1, 0i64);
CurrentPrcb = KeGetCurrentPrcb();
if( *((_QWORD *)CurrentPrcb + 1441) )
KiProcessThreadWaitList((struct KPRCB *)CurrentPrcb, 1, 0);
}
}Referenced by:
KeSetActualBasePriorityThread
KeSetBasePriorityThread
KeSetPriorityAndQuantumProcess