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