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; 
  __int64 v11; 
  _QWORD *v12; 
  bool v13; 
  __int64 v14; 
  struct _KPRCB *CurrentPrcb; 
  _DWORD *v17; 
  _KTHREAD *v18; 
  _ETHREAD *v19; 
  char v20; 
  __int64 v21; 
  INT64 v22; 
  bool v23; 
  UINT64 v24; 
  char v25; 
  _KTHREAD *v26; 
  _ETHREAD *v27; 
  char v28; 
  char v29; 
  __int64 v30; 
  INT64 v31; 
  bool v32; 
  __int64 v33; 
  _KPRCB *v34; 
  __int64 v35; 
  _KPRCB *ControlPrcb; 
  _KSHARED_READY_QUEUE *ControlReadyQueue; 
  v3 = 0;
  ControlPrcb = 0i64;
  ControlReadyQueue = 0i64;
  v6 = (char)KiComputePriorityFloor((__int64)Thread, Priority);
  if( *((char *)Thread + 195) == v6 )
    return 0;
  KiAcquireThreadStateLock(Thread, &ControlPrcb, &ControlReadyQueue);
  v8 = *((char *)Thread + 195);
  v9 = 0;
  if( v7 != 2 )
  {
    if( v7 == 1 )
    {
      v10 = ControlPrcb;
      KiRemoveThreadFromAnyReadyQueue(ControlPrcb, ControlReadyQueue, (_KTHREAD *)Thread, (unsigned int)v8);
      KiUpdateThreadPriority(0i64, (_KTHREAD *)Thread, v6, 0);
      KiPrepareReadyThreadForRescheduling((_KTHREAD *)Thread, v6, ReadyList);
    }
    else if( v7 == 3 )
    {
      v10 = ControlPrcb;
      KiUpdateThreadPriority(ControlPrcb, (_KTHREAD *)Thread, v6, 1u);
      if( (int)v6 < v8 )
      {
        v26 = (_ETHREAD *)KiSelectReadyThreadEx(v10, (_KTHREAD *)Thread, 0);
        v27 = v26;
        if( v26 )
        {
          if( (*((_BYTE *)v26 + 2) & 4) != 0 )
          {
            KiIsThreadRankNonZero(v26, v10);
            v28 = 1;
            if( !v29 )
              v28 = *((_BYTE *)v27 + 195);
          }
          else
          {
            v28 = *((_BYTE *)v26 + 195);
          }
          **((_BYTE **)v10 + 7) = v28;
          v30 = *((_QWORD *)v10 + 4247);
          if( v30 )
          {
            v31 = (unsigned int)KiVpThreadSystemWorkPriority;
            if( v27 != *((_ETHREAD **)v10 + 3) )
              v31 = (unsigned int)v28;
            KiSetSchedulerAssistPriority(*((volatile INT32 **)v10 + 4247), v31, 0);
            v30 = *((_QWORD *)v10 + 4247);
          }
          v32 = v27 == *((_ETHREAD **)v10 + 3);
          *((_QWORD *)v10 + 2) = v27;
          if( v30 )
            *(_BYTE *)(v30 + 16) = v32;
          if( *((_BYTE *)v27 + 388) == 1 )
            *((_DWORD *)v27 + 33) = *((_DWORD *)v27 + 33) - *((_DWORD *)v27 + 109) + KUSER_SHARED_DATA.TickCount.LowPart;
          *((_BYTE *)v27 + 388) = 3;
          KiInsertDeferredReadyList((INT64)ReadyList, (INT64)Thread);
          v10 = ControlPrcb;
        }
      }
      else
      {
        v3 = v6;
      }
    }
    else
    {
      KiUpdateThreadPriority(0i64, (_KTHREAD *)Thread, v6, 0);
      v10 = ControlPrcb;
    }
    goto LABEL_9;
  }
  v10 = ControlPrcb;
  v11 = *((_QWORD *)ControlPrcb + 2);
  v12 = (_QWORD *)((char *)ControlPrcb + 16);
  KiUpdateThreadPriority(ControlPrcb, (_KTHREAD *)Thread, v6, v11 == 0);
  v13 = (int)v6 <= v8;
  if( (int)v6 >= v8 )
    goto LABEL_4;
  if( v11 )
  {
    v13 = (int)v6 <= v8;
LABEL_4:
    if( v13 || v11 )
      goto LABEL_9;
    if( *((_BYTE *)Thread + 388) == 2 )
      v3 = v6;
    goto LABEL_8;
  }
  v10 = ControlPrcb;
  if( *((_BYTE *)Thread + 388) != 2 )
  {
    if( *((_DWORD *)ControlPrcb + 7942) >> (v6 + 1) )
      *((_BYTE *)Thread + 112) |= 0x10u;
    goto LABEL_9;
  }
  v18 = (_ETHREAD *)KiSelectReadyThreadEx(ControlPrcb, (_KTHREAD *)Thread, 0);
  v19 = v18;
  if( v18 )
  {
    if( (*((_BYTE *)v18 + 2) & 4) != 0 )
    {
      KiIsThreadRankNonZero(v18, v10);
      v20 = 1;
      if( !v25 )
        v20 = *((_BYTE *)v19 + 195);
    }
    else
    {
      v20 = *((_BYTE *)v18 + 195);
    }
    **((_BYTE **)v10 + 7) = v20;
    v21 = *((_QWORD *)v10 + 4247);
    if( v21 )
    {
      v22 = (unsigned int)KiVpThreadSystemWorkPriority;
      if( v19 != *((_ETHREAD **)v10 + 3) )
        v22 = (unsigned int)v20;
      KiSetSchedulerAssistPriority(*((volatile INT32 **)v10 + 4247), v22, 0);
      v21 = *((_QWORD *)v10 + 4247);
    }
    v23 = v19 == *((_ETHREAD **)v10 + 3);
    *v12 = v19;
    if( v21 )
      *(_BYTE *)(v21 + 16) = v23;
    if( *((_BYTE *)v19 + 388) == 1 )
      *((_DWORD *)v19 + 33) = *((_DWORD *)v19 + 33) - *((_DWORD *)v19 + 109) + KUSER_SHARED_DATA.TickCount.LowPart;
    *((_BYTE *)v19 + 388) = 3;
    v9 = 1;
LABEL_8:
    v10 = ControlPrcb;
  }
LABEL_9:
  KiUpdateSharedReadyQueueAffinityThread(0i64, (_KTHREAD *)Thread);
  KiReleaseThreadStateLock(v14, (__int64)v10, (volatile signed __int64 *)ControlReadyQueue);
  if( v9 )
  {
    v24 = *((unsigned int *)ControlPrcb + 9);
    if( *((_DWORD *)KeGetPcr() + 105) != (_DWORD)v24 )
      KiSendSoftwareInterrupt(v24, 2u);
  }
  if( v3 > 0 )
  {
    CurrentPrcb = KeGetCurrentPrcb();
    if( (KiVelocityFlags & 2) != 0 )
    {
      v17 = (_DWORD *)*((_QWORD *)ControlPrcb + 4247);
      if( v17 )
      {
        if( *((_QWORD *)CurrentPrcb + 4247)
          && CurrentPrcb != ControlPrcb
          && v3 >= 8
          && ((*v17 & 0x100000) != 0 || (*v17 & 0x40000) != 0 && (unsigned __int8)*v17 < v3) )
        {
          v23 = HvlpVirtualProcessorsIdentityMapped == 0;
          v33 = *((_QWORD *)CurrentPrcb + 4247);
          v34 = ControlPrcb;
          *(_DWORD *)(v33 + 12) = 2;
          v35 = *((unsigned int *)v34 + 9);
          if( v23 )
            LODWORD(v35) = (unsigned __int8)HvlpVirtualProcessorMapping[2 * (unsigned int)v35 + 1] | ((unsigned __int8)HvlpVirtualProcessorMapping[2 * v35] << 6);
          *(_DWORD *)(v33 + 8) = v35;
          __writemsr(0x400000C2u, (unsigned int)v35);
        }
      }
    }
  }
  return 1;
}

Referenced by:

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