KeSetPriorityAndQuantumProcess

VOID __fastcall KeSetPriorityAndQuantumProcess(
        _EPROCESS *Process,
        INT64 NewBase,
        CHAR QuantumReset,
        UINT64 ResetForegroundBoost,
        UINT64 ApplyForegroundBoost){
  int BasePriority; 
  int v6; 
  unsigned int v7; 
  int v9; 
  unsigned int v10; 
  char v11; 
  char v12; 
  _LIST_ENTRY *Flink; 
  INT64 p_Blink; 
  int v15; 
  int v16; 
  char v17; 
  int v18; 
  UINT64 updated; 
  UINT64 v20; 
  unsigned int v21; 
  char v22; 
  char v23; 
  _KPRIQUEUE *v24; 
  _KPRCB *v25; 
  unsigned int v26; 
  INT64 v27; 
  unsigned int v28; 
  int v29; 
  char v30; 
  bool v31; 
  UINT64 v32; 
  UINT64 v33; 
  _KPRIQUEUE *v34; 
  unsigned int NewPriority; 
  unsigned int NewPrioritya; 
  unsigned int NewPriority_4; 
  int v38; 
  _LIST_ENTRY **p_Flink; 
  int v40; 
  int v41; 
  _KPRCB *Prcb; 
  _SINGLE_LIST_ENTRY ReadyList; 
  UINT64 SpinCount; 
  _ETHREAD *CurrentThread; 
  _LIST_ENTRY *p_ThreadListHead; 
  INT64 *SpinLock; 
  UINT8 a3[8]; 
  INT64 NewBasea; 
  char v50; 
  char v51; 

  v51 = QuantumReset;
  BasePriority = Process->Pcb.BasePriority;
  v6 = ApplyForegroundBoost;
  LODWORD(NewBasea) = 0;
  v7 = ResetForegroundBoost;
  if( BasePriority == (_DWORD)NewBase
    && ((_DWORD)ResetForegroundBoost == (_DWORD)ApplyForegroundBoost || (int)NewBase >= 16) )
  {
    if( QuantumReset )
      KeSetQuantumProcess(&Process->Pcb, QuantumReset);
  }
  else if( Process != (_EPROCESS *)&KiInitialProcess )
  {
    NewPriority = 0;
    v9 = 1;
    NewPriority_4 = 0;
    if( (_DWORD)NewBase )
      v9 = NewBase;
    v50 = 0;
    ReadyList.Next = 0i64;
    v41 = *(_WORD *)(&PerfGlobalGroupMask + 1) & 0x2000;
    v10 = 0;
    v11 = 0;
    *(_QWORD *)a3 = KeGetCurrentIrql();
    __writecr8(2ui64);
    Prcb = KeGetCurrentPrcb();
    CurrentThread = Prcb->CurrentThread;
    SpinLock = (INT64 *)&Process->Pcb.ProcessLock;
    ExAcquireSpinLockExclusiveAtDpcLevel((INT64 *)&Process->Pcb.ProcessLock);
    v12 = v51;
    if( v51 )
      Process->Pcb.QuantumReset = v51;
    v38 = Process->Pcb.BasePriority;
    v40 = v9 - v38;
    Process->Pcb.BasePriority = v9;
    KeFlushProcessWriteBuffers(1u);
    Flink = Process->Pcb.ThreadListHead.Flink;
    p_ThreadListHead = &Process->Pcb.ThreadListHead;
    p_Flink = &Flink->Flink;
    if( Flink != &Process->Pcb.ThreadListHead )
    {
      if( v9 < 16 )
      {
        while( 1 )
        {
          p_Blink = (INT64)&Flink[-48].Blink;
          if( v12 )
            *(_BYTE *)(p_Blink + 651) = v12;
          HIDWORD(SpinCount) = 0;
          while( _interlockedbittestandset64((volatile signed __int32 *)(p_Blink + 64), 0i64) )
          {
            do
              KeYieldProcessorEx((UINT64 *)((char *)&SpinCount + 4));
            while( *(_QWORD *)(p_Blink + 64) );
          }
          v15 = *(char *)(p_Blink + 563);
          if( v15 <= v38 || v15 < 16 )
            break;
          KiReleaseThreadLockSafe(p_Blink);
LABEL_42:
          v12 = v51;
          Flink = *p_Flink;
          p_Flink = &Flink->Flink;
          if( Flink == p_ThreadListHead )
            goto LABEL_43;
        }
        v16 = v15 + v40;
        if( v15 + v40 >= 16 )
        {
          LODWORD(NewBasea) = 15;
        }
        else
        {
          if( v16 <= 0 )
            v16 = 1;
          LODWORD(NewBasea) = v16;
        }
        v17 = *(_BYTE *)(p_Blink + 645);
        if( !v17 )
          goto LABEL_24;
        if( v38 < 16 )
        {
          KiReleaseThreadLockSafe(p_Blink);
          v22 = 0;
LABEL_41:
          if( v41 )
          {
            if( v50 )
            {
              v50 = 0;
              EtwTracePriority((_KTHREAD *)p_Blink, 0x530ui64, NewPriority_4, NewPriority, 0i64);
            }
            if( v22 && v15 != (_DWORD)NewBasea )
              EtwTracePriority((_KTHREAD *)p_Blink, 0x531ui64, (unsigned int)v15, (unsigned int)NewBasea, &NewBasea);
          }
          goto LABEL_42;
        }
        if( v17 > 0 )
        {
          LODWORD(NewBasea) = 15;
        }
        else
        {
LABEL_24:
          v18 = NewBasea;
          if( v17 < 0 )
            v18 = 1;
          LODWORD(NewBasea) = v18;
        }
        if( (_ETHREAD *)p_Blink != CurrentThread || Prcb->NestingLevel )
        {
          updated = *(_QWORD *)(p_Blink + 72);
        }
        else
        {
          _disable();
          updated = KiUpdateTotalCyclesCurrentThread(Prcb, (_KTHREAD *)p_Blink, 0i64);
          _enable();
        }
        v20 = updated + KiCyclesPerClockQuantum * (unsigned int)*(unsigned __int8 *)(p_Blink + 651);
        if( (*(_DWORD *)(p_Blink + 120) & 0x20) != 0 )
          _interlockedbittestandreset((volatile signed __int32 *)(p_Blink + 120), 5u);
        *(_QWORD *)(p_Blink + 32) = v20;
        if( v6 && (v22 = 0, (_DWORD)NewBasea == v15) )
        {
          v21 = NewPriority;
        }
        else
        {
          v21 = KiSetBasePriorityAndClearDecrement((_KTHREAD *)p_Blink, &NewBasea, v7);
          NewPriority = v21;
          v22 = 1;
        }
        v23 = 0;
        if( v6 )
          KiApplyForegroundBoostThread((_ETHREAD *)p_Blink, &ReadyList);
        if( !v22 )
          goto LABEL_40;
        if( !v23 )
        {
          NewPriority_4 = *(char *)(p_Blink + 195);
          if( KiSetPriorityThread((_KTHREAD *)p_Blink, &ReadyList, v21) )
          {
            NewPriority = *(char *)(p_Blink + 195);
            v50 = 1;
          }
        }
        v24 = *(_KPRIQUEUE **)(p_Blink + 232);
        if( v24 && (*(_BYTE *)v24 & 0x7F) == 21 )
          KiPriQueueThreadPriorityChanged(v24, (_KTHREAD *)p_Blink);
        else
LABEL_40:
          KiReleaseThreadLockSafe(p_Blink);
        goto LABEL_41;
      }
      v26 = 0;
      while( 1 )
      {
        v27 = (INT64)&Flink[-48].Blink;
        if( v12 )
          *(_BYTE *)(v27 + 651) = v12;
        LODWORD(SpinCount) = 0;
        while( _interlockedbittestandset64((volatile signed __int32 *)(v27 + 64), 0i64) )
        {
          do
            KeYieldProcessorEx(&SpinCount);
          while( *(_QWORD *)(v27 + 64) );
        }
        v28 = *(char *)(v27 + 563);
        v29 = v28 + v40;
        if( (int)(v28 + v40) >= 16 )
        {
          if( v29 > 31 )
            v29 = 31;
          LODWORD(NewBasea) = v29;
        }
        else
        {
          v29 = 16;
          LODWORD(NewBasea) = 16;
        }
        v30 = *(_BYTE *)(v27 + 645);
        v25 = Prcb;
        v31 = v30 < 0;
        if( !v30 )
          goto LABEL_74;
        if( v38 < 16 )
          break;
        KiReleaseThreadLockSafe(v27);
LABEL_90:
        if( v41 )
        {
          if( v50 )
          {
            v50 = 0;
            EtwTracePriority((_KTHREAD *)v27, 0x530ui64, NewPriority_4, v26, 0i64);
          }
          if( v11 )
          {
            v11 = 0;
            if( v10 != v29 )
              EtwTracePriority((_KTHREAD *)v27, 0x531ui64, v10, (unsigned int)v29, &NewBasea);
          }
        }
        v12 = v51;
        Flink = *p_Flink;
        p_Flink = &Flink->Flink;
        if( Flink == p_ThreadListHead )
          goto LABEL_44;
      }
      v31 = v30 < 0;
      if( v30 <= 0 )
      {
LABEL_74:
        if( v31 )
          v29 = 16;
        LODWORD(NewBasea) = v29;
      }
      else
      {
        LODWORD(NewBasea) = 31;
      }
      v10 = v28;
      if( (_ETHREAD *)v27 != CurrentThread || Prcb->NestingLevel )
      {
        v32 = *(_QWORD *)(v27 + 72);
      }
      else
      {
        _disable();
        v32 = KiUpdateTotalCyclesCurrentThread(Prcb, (_KTHREAD *)v27, 0i64);
        _enable();
      }
      v33 = v32 + KiCyclesPerClockQuantum * (unsigned int)*(unsigned __int8 *)(v27 + 651);
      if( (*(_DWORD *)(v27 + 120) & 0x20) != 0 )
        _interlockedbittestandreset((volatile signed __int32 *)(v27 + 120), 5u);
      *(_QWORD *)(v27 + 32) = v33;
      NewPrioritya = KiSetBasePriorityAndClearDecrement((_KTHREAD *)v27, &NewBasea, 0i64);
      NewPriority_4 = *(char *)(v27 + 195);
      v11 = 1;
      if( KiSetPriorityThread((_KTHREAD *)v27, &ReadyList, NewPrioritya) )
      {
        NewPrioritya = *(char *)(v27 + 195);
        v50 = 1;
      }
      v34 = *(_KPRIQUEUE **)(v27 + 232);
      if( v34 && (*(_BYTE *)v34 & 0x7F) == 21 )
        KiPriQueueThreadPriorityChanged(v34, (_KTHREAD *)v27);
      else
        KiReleaseThreadLockSafe(v27);
      v26 = NewPrioritya;
      v29 = NewBasea;
      goto LABEL_90;
    }
LABEL_43:
    v25 = Prcb;
LABEL_44:
    ExReleaseSpinLockExclusiveFromDpcLevel(SpinLock);
    KiProcessDeferredReadyList(v25, &ReadyList, a3[0]);
  }
}

Referenced by:

NtSetInformationProcess
PspSetProcessPriorityByClass