KiComputeNewPriority
INT8 __stdcall KiComputeNewPriority(_ETHREAD *Thread, INT8 Adjustment){
INT8 result;
unsigned __int8 v5;
char BasePriority;
INT8 v7;
unsigned int PriorityFloorSummary;
int v9;
char v10;
unsigned __int8 PriorityDecrement;
char v12;
INT8 v13;
result = Thread->Tcb.Priority;
if( result < 16 )
{
if( KiForegrounBoostVelocityFlag
&& Thread->Tcb.Process->Vm.Instance.Flags.MemoryPriority == 2
&& (v10 = Thread->Tcb.PriorityDecrement, (v10 & 0xF) != 0 && (Thread->Tcb._bf_4 & 8) == 0) )
{
PriorityDecrement = Thread->Tcb.PriorityDecrement;
v12 = v10 & 0xF;
Thread->Tcb.PriorityDecrement = v12;
v13 = result - (PriorityDecrement >> 4) - Adjustment;
v7 = v12 + Thread->Tcb.BasePriority;
if( v13 >= v7 )
v7 = v13;
}
else
{
v5 = Thread->Tcb.PriorityDecrement;
BasePriority = Thread->Tcb.BasePriority;
if( (char)(result - (v5 >> 4) - (v5 & 0xF) - Adjustment) >= BasePriority )
BasePriority = result - (v5 >> 4) - (v5 & 0xF) - Adjustment;
v7 = BasePriority;
if( v5 )
{
if( (v5 & 0xF) != 0 )
Thread->Tcb.ForegroundLossTime = KUSER_SHARED_DATA.TickCount.LowPart;
Thread->Tcb.PriorityDecrement = 0;
}
}
PriorityFloorSummary = Thread->Tcb.PriorityFloorSummary;
if( PriorityFloorSummary )
{
_BitScanReverse((unsigned int *)&v9, PriorityFloorSummary);
if( v7 < v9 )
return v9;
}
return v7;
}
return result;
}Referenced by:
KeDelayExecutionThread
KeSetBasePriorityThread
KeYieldExecution
KiDeferredReadySingleThread
KiQuantumEnd
KiQueueReadyThread