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