KiApplyForegroundBoostThread

VOID __fastcall KiApplyForegroundBoostThread(_ETHREAD *Thread, _SINGLE_LIST_ENTRY *ReadyList){
  char v3; 
  char v5; 
  UINT64 Priority; 
  _KPRCB *v7; 
  char v8; 
  int v9; 
  _KPRCB *v10; 
  int *v11; 
  int v12; 
  int v13; 
  __int64 v14; 
  __int64 Number; 
  unsigned int v16; 
  _ETHREAD *v17; 
  _KPRCB *v18; 
  _ETHREAD *v19; 
  char v20; 
  _BYTE *v21; 
  INT64 v22; 
  bool v23; 
  UINT8 v24; 
  _ETHREAD **p_NextThread; 
  _ETHREAD *NextThread; 
  bool v27; 
  _ETHREAD *v28; 
  _KPRCB *v29; 
  _ETHREAD *v30; 
  char v31; 
  _BYTE *SchedulerAssist; 
  INT64 v33; 
  bool v34; 
  UINT8 IsThreadRankNonZero; 
  int v36; 
  int v37; 
  _KSHARED_READY_QUEUE *ControlReadyQueue; 
  char v39; 
  _KPRCB *ControlPrcb; 

  ControlPrcb = 0i64;
  ControlReadyQueue = 0i64;
  v3 = 0;
  KiAcquireThreadStateLock(Thread, &ControlPrcb, &ControlReadyQueue);
  if( (unsigned __int8)(v5 - 1) > 2u && v5 != 7 || Thread->Tcb.Process->Vm.Instance.Flags.MemoryPriority != 2 )
  {
    v7 = ControlPrcb;
LABEL_4:
    KiReleaseThreadStateLock((_KPRCB *)Priority, (_KSHARED_READY_QUEUE *)v7);
    return;
  }
  if( Thread->Tcb.PriorityDecrement )
    goto LABEL_13;
  if( (*(&Thread->Tcb.MiscFlags + 1) & 8) != 0 )
    goto LABEL_13;
  Priority = (unsigned int)Thread->Tcb.Priority;
  if( Thread->Tcb.Priority <= 0 )
    goto LABEL_13;
  v8 = PsPrioritySeparation + Thread->Tcb.BasePriority;
  if( v8 >= 16 )
    v8 = 15;
  if( v8 <= Thread->Tcb.Priority )
  {
LABEL_13:
    v7 = ControlPrcb;
    goto LABEL_14;
  }
  v9 = 0;
  v36 = v8;
  v37 = Thread->Tcb.Priority;
  v39 = 0;
  Thread->Tcb.PriorityDecrement = (v8 - Thread->Tcb.Priority) & 0xF;
  if( v5 == 1 )
  {
    v7 = ControlPrcb;
    KiRemoveThreadFromAnyReadyQueue(ControlPrcb, ControlReadyQueue, (__int64)Thread, (unsigned int)Priority);
    KiUpdateThreadPriority(0i64, &Thread->Tcb, (unsigned int)v36, 0);
    KiPrepareReadyThreadForRescheduling(&Thread->Tcb, (unsigned int)v36, ReadyList);
    goto LABEL_17;
  }
  if( v5 == 2 )
  {
    v7 = ControlPrcb;
    p_NextThread = &ControlPrcb->NextThread;
    NextThread = ControlPrcb->NextThread;
    KiUpdateThreadPriority(ControlPrcb, &Thread->Tcb, (unsigned int)v8, NextThread == 0i64);
    v27 = v36 <= v37;
    if( v36 < v37 )
    {
      if( !NextThread )
      {
        v7 = ControlPrcb;
        if( Thread->Tcb.WaitBlockFill6[68] == 2 )
        {
          v28 = (_ETHREAD *)KiSelectReadyThreadEx(ControlPrcb, &Thread->Tcb, 0);
          v30 = v28;
          if( !v28 )
            goto LABEL_17;
          if( (v28->Tcb.gap0[2] & 4) != 0 )
          {
            IsThreadRankNonZero = KiIsThreadRankNonZero(&v28->Tcb, v7, v29);
            v31 = 1;
            if( !IsThreadRankNonZero )
              v31 = v30->Tcb.Priority;
          }
          else
          {
            v31 = v28->Tcb.Priority;
          }
          *v7->PriorityState = v31;
          SchedulerAssist = v7->SchedulerAssist;
          if( SchedulerAssist )
          {
            v33 = (unsigned int)KiVpThreadSystemWorkPriority;
            if( v30 != v7->IdleThread )
              v33 = (unsigned int)v31;
            KiSetSchedulerAssistPriority((INT32 *)v7->SchedulerAssist, v33, 0);
            SchedulerAssist = v7->SchedulerAssist;
          }
          v34 = v30 == v7->IdleThread;
          *p_NextThread = v30;
          if( SchedulerAssist )
            SchedulerAssist[16] = v34;
          if( v30->Tcb.WaitBlockFill6[68] == 1 )
            v30->Tcb.ReadyTime = v30->Tcb.ReadyTime
                               - v30->Tcb.WaitBlock[2].SpareLong
                               + KUSER_SHARED_DATA.TickCount.LowPart;
          v30->Tcb.WaitBlockFill6[68] = 3;
          v39 = 1;
          goto LABEL_48;
        }
        if( ControlPrcb->ReadySummary >> (v36 + 1) )
          Thread->Tcb.WaitRegister.Flags |= 0x10u;
        goto LABEL_17;
      }
      v27 = v36 <= v37;
    }
    if( v27 )
      goto LABEL_17;
    if( NextThread )
      goto LABEL_17;
    v7 = ControlPrcb;
    if( Thread->Tcb.WaitBlockFill6[68] != 2 )
      goto LABEL_17;
LABEL_16:
    v9 = v36;
    goto LABEL_17;
  }
  if( v5 != 3 )
  {
    KiUpdateThreadPriority(0i64, &Thread->Tcb, (unsigned int)v8, 0);
LABEL_48:
    v7 = ControlPrcb;
    goto LABEL_17;
  }
  v7 = ControlPrcb;
  KiUpdateThreadPriority(ControlPrcb, &Thread->Tcb, (unsigned int)v8, 1u);
  if( v36 >= v37 )
    goto LABEL_16;
  v17 = (_ETHREAD *)KiSelectReadyThreadEx(v7, &Thread->Tcb, 0);
  v19 = v17;
  if( v17 )
  {
    if( (v17->Tcb.gap0[2] & 4) != 0 )
    {
      v24 = KiIsThreadRankNonZero(&v17->Tcb, v7, v18);
      v20 = 1;
      if( !v24 )
        v20 = v19->Tcb.Priority;
    }
    else
    {
      v20 = v17->Tcb.Priority;
    }
    *v7->PriorityState = v20;
    v21 = v7->SchedulerAssist;
    if( v21 )
    {
      v22 = (unsigned int)KiVpThreadSystemWorkPriority;
      if( v19 != v7->IdleThread )
        v22 = (unsigned int)v20;
      KiSetSchedulerAssistPriority((INT32 *)v7->SchedulerAssist, v22, 0);
      v21 = v7->SchedulerAssist;
    }
    v23 = v19 == v7->IdleThread;
    v7->NextThread = v19;
    if( v21 )
      v21[16] = v23;
    if( v19->Tcb.WaitBlockFill6[68] == 1 )
      v19->Tcb.ReadyTime = v19->Tcb.ReadyTime - v19->Tcb.WaitBlock[2].SpareLong + KUSER_SHARED_DATA.TickCount.LowPart;
    v19->Tcb.WaitBlockFill6[68] = 3;
    KiInsertDeferredReadyList((INT64)ReadyList, (INT64)Thread);
    goto LABEL_48;
  }
LABEL_17:
  KiUpdateSharedReadyQueueAffinityThread(0i64, &Thread->Tcb);
  KiReleaseThreadStateLock(v10, (_KSHARED_READY_QUEUE *)v7);
  if( v39 )
  {
    v7 = ControlPrcb;
    Priority = ControlPrcb->Number;
    if( KeGetPcr()->Prcb.Number != (_DWORD)Priority )
      KiSendSoftwareInterrupt(Priority, 2u);
  }
  if( v9 <= 0 )
    goto LABEL_21;
  Priority = (UINT64)KeGetCurrentPrcb();
  if( (KiVelocityFlags & 2) != 0 )
  {
    v7 = ControlPrcb;
    v11 = (int *)ControlPrcb->SchedulerAssist;
    if( !v11 || !*(_QWORD *)(Priority + 33976) || (_KPRCB *)Priority == ControlPrcb || v9 < 8 )
      goto LABEL_21;
    v12 = *v11;
    v13 = *v11 & 0x40000;
    if( (v12 & 0x100000) != 0 || v13 && (unsigned __int8)v12 < v9 )
    {
      v23 = HvlpVirtualProcessorsIdentityMapped == 0;
      v14 = *(_QWORD *)(Priority + 33976);
      v7 = ControlPrcb;
      *(_DWORD *)(v14 + 12) = 2;
      Number = v7->Number;
      if( v23 )
        LODWORD(Number) = (unsigned __int8)HvlpVirtualProcessorMapping[2 * (unsigned int)Number + 1] | ((unsigned __int8)HvlpVirtualProcessorMapping[2 * Number] << 6);
      *(_DWORD *)(v14 + 8) = Number;
      v16 = Number;
      Priority = 1073742018i64;
      __writemsr(0x400000C2u, v16);
      goto LABEL_21;
    }
  }
  v7 = ControlPrcb;
LABEL_21:
  v3 = 1;
LABEL_14:
  if( !v3 )
    goto LABEL_4;
}

Referenced by:

KeSetPriorityAndQuantumProcess