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; 
  _ETHREAD *NextThread; 
  _ETHREAD **p_NextThread; 
  bool v13; 
  _KPRCB *v14; 
  struct _KPRCB *CurrentPrcb; 
  _DWORD *v17; 
  _ETHREAD *v18; 
  _KPRCB *v19; 
  _ETHREAD *v20; 
  char v21; 
  _BYTE *v22; 
  INT64 v23; 
  bool v24; 
  UINT64 Number; 
  UINT8 v26; 
  _ETHREAD *v27; 
  _KPRCB *v28; 
  _ETHREAD *v29; 
  char v30; 
  UINT8 IsThreadRankNonZero; 
  _BYTE *SchedulerAssist; 
  INT64 v33; 
  bool v34; 
  _DWORD *v35; 
  _KPRCB *v36; 
  __int64 v37; 
  _KPRCB *ControlPrcb; 
  _KSHARED_READY_QUEUE *ControlReadyQueue; 

  v3 = 0;
  ControlPrcb = 0i64;
  ControlReadyQueue = 0i64;
  v6 = KiComputePriorityFloor(&Thread->Tcb, Priority);
  if( Thread->Tcb.Priority == v6 )
    return 0;
  KiAcquireThreadStateLock(Thread, &ControlPrcb, &ControlReadyQueue);
  v8 = Thread->Tcb.Priority;
  v9 = 0;
  if( v7 != 2 )
  {
    if( v7 == 1 )
    {
      v10 = ControlPrcb;
      KiRemoveThreadFromAnyReadyQueue(ControlPrcb, ControlReadyQueue, (__int64)Thread, (unsigned int)v8);
      KiUpdateThreadPriority(0i64, &Thread->Tcb, v6, 0);
      KiPrepareReadyThreadForRescheduling(&Thread->Tcb, v6, ReadyList);
    }
    else if( v7 == 3 )
    {
      v10 = ControlPrcb;
      KiUpdateThreadPriority(ControlPrcb, &Thread->Tcb, v6, 1u);
      if( (int)v6 < v8 )
      {
        v27 = (_ETHREAD *)KiSelectReadyThreadEx(v10, &Thread->Tcb, 0);
        v29 = v27;
        if( v27 )
        {
          if( (v27->Tcb.gap0[2] & 4) != 0 )
          {
            IsThreadRankNonZero = KiIsThreadRankNonZero(&v27->Tcb, v10, v28);
            v30 = 1;
            if( !IsThreadRankNonZero )
              v30 = v29->Tcb.Priority;
          }
          else
          {
            v30 = v27->Tcb.Priority;
          }
          *v10->PriorityState = v30;
          SchedulerAssist = v10->SchedulerAssist;
          if( SchedulerAssist )
          {
            v33 = (unsigned int)KiVpThreadSystemWorkPriority;
            if( v29 != v10->IdleThread )
              v33 = (unsigned int)v30;
            KiSetSchedulerAssistPriority((INT32 *)v10->SchedulerAssist, v33, 0);
            SchedulerAssist = v10->SchedulerAssist;
          }
          v34 = v29 == v10->IdleThread;
          v10->NextThread = v29;
          if( SchedulerAssist )
            SchedulerAssist[16] = v34;
          if( v29->Tcb.WaitBlockFill6[68] == 1 )
            v29->Tcb.ReadyTime = v29->Tcb.ReadyTime
                               - v29->Tcb.WaitBlock[2].SpareLong
                               + KUSER_SHARED_DATA.TickCount.LowPart;
          v29->Tcb.WaitBlockFill6[68] = 3;
          KiInsertDeferredReadyList((INT64)ReadyList, (INT64)Thread);
          v10 = ControlPrcb;
        }
      }
      else
      {
        v3 = v6;
      }
    }
    else
    {
      KiUpdateThreadPriority(0i64, &Thread->Tcb, v6, 0);
      v10 = ControlPrcb;
    }
    goto LABEL_9;
  }
  v10 = ControlPrcb;
  NextThread = ControlPrcb->NextThread;
  p_NextThread = &ControlPrcb->NextThread;
  KiUpdateThreadPriority(ControlPrcb, &Thread->Tcb, v6, NextThread == 0i64);
  v13 = (int)v6 <= v8;
  if( (int)v6 >= v8 )
    goto LABEL_4;
  if( NextThread )
  {
    v13 = (int)v6 <= v8;
LABEL_4:
    if( v13 || NextThread )
      goto LABEL_9;
    if( Thread->Tcb.WaitBlockFill6[68] == 2 )
      v3 = v6;
    goto LABEL_8;
  }
  v10 = ControlPrcb;
  if( Thread->Tcb.WaitBlockFill6[68] != 2 )
  {
    if( ControlPrcb->ReadySummary >> (v6 + 1) )
      Thread->Tcb.WaitRegister.Flags |= 0x10u;
    goto LABEL_9;
  }
  v18 = (_ETHREAD *)KiSelectReadyThreadEx(ControlPrcb, &Thread->Tcb, 0);
  v20 = v18;
  if( v18 )
  {
    if( (v18->Tcb.gap0[2] & 4) != 0 )
    {
      v26 = KiIsThreadRankNonZero(&v18->Tcb, v10, v19);
      v21 = 1;
      if( !v26 )
        v21 = v20->Tcb.Priority;
    }
    else
    {
      v21 = v18->Tcb.Priority;
    }
    *v10->PriorityState = v21;
    v22 = v10->SchedulerAssist;
    if( v22 )
    {
      v23 = (unsigned int)KiVpThreadSystemWorkPriority;
      if( v20 != v10->IdleThread )
        v23 = (unsigned int)v21;
      KiSetSchedulerAssistPriority((INT32 *)v10->SchedulerAssist, v23, 0);
      v22 = v10->SchedulerAssist;
    }
    v24 = v20 == v10->IdleThread;
    *p_NextThread = v20;
    if( v22 )
      v22[16] = v24;
    if( v20->Tcb.WaitBlockFill6[68] == 1 )
      v20->Tcb.ReadyTime = v20->Tcb.ReadyTime - v20->Tcb.WaitBlock[2].SpareLong + KUSER_SHARED_DATA.TickCount.LowPart;
    v20->Tcb.WaitBlockFill6[68] = 3;
    v9 = 1;
LABEL_8:
    v10 = ControlPrcb;
  }
LABEL_9:
  KiUpdateSharedReadyQueueAffinityThread(0i64, &Thread->Tcb);
  KiReleaseThreadStateLock(v14, (_KSHARED_READY_QUEUE *)v10);
  if( v9 )
  {
    Number = ControlPrcb->Number;
    if( KeGetPcr()->Prcb.Number != (_DWORD)Number )
      KiSendSoftwareInterrupt(Number, 2u);
  }
  if( v3 > 0 )
  {
    CurrentPrcb = KeGetCurrentPrcb();
    if( (KiVelocityFlags & 2) != 0 )
    {
      v17 = ControlPrcb->SchedulerAssist;
      if( v17 )
      {
        if( CurrentPrcb->SchedulerAssist
          && CurrentPrcb != ControlPrcb
          && v3 >= 8
          && ((*v17 & 0x100000) != 0 || (*v17 & 0x40000) != 0 && (unsigned __int8)*v17 < v3) )
        {
          v24 = HvlpVirtualProcessorsIdentityMapped == 0;
          v35 = CurrentPrcb->SchedulerAssist;
          v36 = ControlPrcb;
          v35[3] = 2;
          v37 = v36->Number;
          if( v24 )
            LODWORD(v37) = (unsigned __int8)HvlpVirtualProcessorMapping[2 * (unsigned int)v37 + 1] | ((unsigned __int8)HvlpVirtualProcessorMapping[2 * v37] << 6);
          v35[2] = v37;
          __writemsr(0x400000C2u, (unsigned int)v37);
        }
      }
    }
  }
  return 1;
}

Referenced by:

KeBoostPriorityThread
KeClearSystemPriority
KeRemovePriQueue
KeSetBasePriorityThread
KeSetPriorityAndQuantumProcess
KeSetPriorityBoost
KeSetPriorityThread
KeSetThreadSchedulerAssist
KiAbApplyWakeupBoost
KiAbSetMinimumThreadPriority
KiAbThreadUnboostCpuPriority
KiSetPriorityBoost
KiTryUnwaitThreadWithPriority
KiUpdateVpBackingThreadPriorityFromTopLevel
PsImpersonateContainerOfThread