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