KeSetActualBasePriorityThread
NTSTATUS __stdcall KeSetActualBasePriorityThread(_ETHREAD *Thread, INT64 NewBase){
UINT8 CurrentIrql;
struct _KPRCB *CurrentPrcb;
_ETHREAD *CurrentThread;
NTSTATUS BasePriority;
NTSTATUS v7;
_KPRCB *v8;
char PriorityDecrement;
unsigned __int64 CycleTime;
unsigned __int64 v11;
unsigned int v12;
char v13;
int v14;
int Priority;
_KPRCB *v16;
_ETHREAD *NextThread;
bool v18;
_ETHREAD *v19;
_KPRCB *v20;
_ETHREAD *v21;
char v22;
_KPRCB *v23;
_KPRIQUEUE *Queue;
struct _KPRCB *v26;
int *v27;
_SINGLE_LIST_ENTRY *p_IoSelfBoostsEntry;
_SINGLE_LIST_ENTRY *p_AbSelfIoBoostsList;
UINT64 Number;
UINT8 IsThreadRankNonZero;
char v32;
INT32 *v33;
INT64 v34;
bool v35;
_ETHREAD *v36;
_KPRCB *v37;
_ETHREAD *v38;
UINT8 v39;
char v40;
_DWORD *SchedulerAssist;
_BYTE *v42;
INT64 v43;
bool v44;
int v45;
int v46;
_DWORD *v47;
_KPRCB *v48;
__int64 v49;
UINT8 v50;
_KSHARED_READY_QUEUE *ControlReadyQueue;
_SINGLE_LIST_ENTRY a2;
_ETHREAD **p_NextThread;
NTSTATUS v54;
int DynamicPriority;
UINT64 SpinCount;
_KPRCB *ControlPrcb;
DynamicPriority = NewBase;
if( Thread->Tcb.Process == (_EPROCESS *)&KiInitialProcess )
return 1;
a2.Next = 0i64;
CurrentIrql = KeGetCurrentIrql();
v50 = CurrentIrql;
__writecr8(2ui64);
CurrentPrcb = KeGetCurrentPrcb();
LODWORD(SpinCount) = 0;
CurrentThread = CurrentPrcb->CurrentThread;
while( _interlockedbittestandset64((volatile signed __int32 *)&Thread->Tcb.ThreadLock, 0i64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( Thread->Tcb.ThreadLock );
SchedulerAssist = CurrentPrcb->SchedulerAssist;
if( SchedulerAssist && CurrentPrcb->NestingLevel <= 1u )
++SchedulerAssist[6];
}
BasePriority = Thread->Tcb.BasePriority;
Thread->Tcb.Saturation = 0;
v7 = BasePriority;
v8 = KeGetCurrentPrcb();
v54 = BasePriority;
if( (char)DynamicPriority < (char)BasePriority )
{
if( Thread->Tcb.AbOwnedEntryCount )
{
p_IoSelfBoostsEntry = &Thread->Tcb.IoSelfBoostsEntry;
if( Thread->Tcb.IoSelfBoostsEntry.Next == (_SINGLE_LIST_ENTRY *)1 )
{
p_AbSelfIoBoostsList = &v8->AbSelfIoBoostsList;
if( v8 != (_KPRCB *)-34672i64 )
{
p_IoSelfBoostsEntry->Next = p_AbSelfIoBoostsList->Next;
p_AbSelfIoBoostsList->Next = p_IoSelfBoostsEntry;
_InterlockedIncrement16(&Thread->Tcb.KeReferenceCount);
KiAbQueueAutoBoostDpc(v8);
}
}
}
}
Thread->Tcb.BasePriority = DynamicPriority;
PriorityDecrement = Thread->Tcb.PriorityDecrement;
if( PriorityDecrement )
{
if( (PriorityDecrement & 0xF) != 0 )
Thread->Tcb.ForegroundLossTime = KUSER_SHARED_DATA.TickCount.LowPart;
Thread->Tcb.PriorityDecrement = 0;
}
if( DynamicPriority != Thread->Tcb.Priority )
{
if( Thread != CurrentThread || CurrentPrcb->NestingLevel )
{
CycleTime = Thread->Tcb.CycleTime;
}
else
{
_disable();
CycleTime = KiUpdateTotalCyclesCurrentThread(CurrentPrcb, &Thread->Tcb, 0i64);
_enable();
}
v11 = CycleTime + KiCyclesPerClockQuantum * (unsigned int)Thread->Tcb.SchedulerApc.SpareByte1;
if( (*(&Thread->Tcb.MiscFlags + 1) & 0x20) != 0 )
_interlockedbittestandreset((volatile signed __int32 *)&Thread->Tcb.116 + 1, 5u);
Thread->Tcb.QuantumTarget = v11;
ControlPrcb = 0i64;
ControlReadyQueue = 0i64;
v12 = KiComputePriorityFloor(&Thread->Tcb, DynamicPriority);
if( Thread->Tcb.Priority != v12 )
{
KiAcquireThreadStateLock(Thread, &ControlPrcb, &ControlReadyQueue);
v14 = 0;
Priority = Thread->Tcb.Priority;
switch( v13 )
{
case 2:
v16 = ControlPrcb;
NextThread = ControlPrcb->NextThread;
p_NextThread = &ControlPrcb->NextThread;
KiUpdateThreadPriority(ControlPrcb, &Thread->Tcb, v12, NextThread == 0i64);
v18 = (int)v12 <= Priority;
if( (int)v12 < Priority )
{
if( !NextThread )
{
v16 = ControlPrcb;
if( Thread->Tcb.WaitBlockFill6[68] != 2 )
{
v7 = v54;
if( ControlPrcb->ReadySummary >> (v12 + 1) )
Thread->Tcb.WaitRegister.Flags |= 0x10u;
goto LABEL_19;
}
v19 = (_ETHREAD *)KiSelectReadyThreadEx(ControlPrcb, &Thread->Tcb, 0);
v21 = v19;
if( v19 )
{
if( (v19->Tcb.gap0[2] & 4) != 0 )
{
IsThreadRankNonZero = KiIsThreadRankNonZero(&v19->Tcb, v16, v20);
v32 = 1;
if( !IsThreadRankNonZero )
v32 = v21->Tcb.Priority;
}
else
{
v32 = v19->Tcb.Priority;
}
*v16->PriorityState = v32;
v33 = (INT32 *)v16->SchedulerAssist;
if( v33 )
{
if( v21 == v16->IdleThread )
v34 = (unsigned int)KiVpThreadSystemWorkPriority;
else
v34 = (unsigned int)v32;
KiSetSchedulerAssistPriority(v33, v34, 0);
v33 = (INT32 *)v16->SchedulerAssist;
}
v35 = v21 == v16->IdleThread;
*p_NextThread = v21;
if( v33 )
*((_BYTE *)v33 + 16) = v35;
if( v21->Tcb.WaitBlockFill6[68] == 1 )
v21->Tcb.ReadyTime = v21->Tcb.ReadyTime
- v21->Tcb.WaitBlock[2].SpareLong
+ KUSER_SHARED_DATA.TickCount.LowPart;
v16 = ControlPrcb;
v7 = v54;
v21->Tcb.WaitBlockFill6[68] = 3;
v22 = 1;
goto LABEL_20;
}
goto LABEL_18;
}
v18 = (int)v12 <= Priority;
}
if( v18 || NextThread )
{
LABEL_18:
v7 = v54;
LABEL_19:
v22 = 0;
LABEL_20:
KiUpdateSharedReadyQueueAffinityThread(0i64, &Thread->Tcb);
KiReleaseThreadStateLock(v23, (_KSHARED_READY_QUEUE *)v16);
if( v22 )
{
Number = ControlPrcb->Number;
if( KeGetPcr()->Prcb.Number != (_DWORD)Number )
KiSendSoftwareInterrupt(Number, 2u);
}
if( v14 > 0 )
{
v26 = KeGetCurrentPrcb();
if( (KiVelocityFlags & 2) != 0 )
{
v27 = (int *)ControlPrcb->SchedulerAssist;
if( v27 )
{
if( v26->SchedulerAssist )
{
if( v26 != ControlPrcb && v14 >= 8 )
{
v45 = *v27;
v46 = *v27 & 0x40000;
if( (v45 & 0x100000) != 0 || v46 && (unsigned __int8)v45 < v14 )
{
v35 = HvlpVirtualProcessorsIdentityMapped == 0;
v47 = v26->SchedulerAssist;
v48 = ControlPrcb;
v47[3] = 2;
v49 = v48->Number;
if( v35 )
LODWORD(v49) = (unsigned __int8)HvlpVirtualProcessorMapping[2 * (unsigned int)v49 + 1] | ((unsigned __int8)HvlpVirtualProcessorMapping[2 * v49] << 6);
v47[2] = v49;
__writemsr(0x400000C2u, (unsigned int)v49);
}
}
}
}
}
}
CurrentIrql = v50;
goto LABEL_23;
}
v16 = ControlPrcb;
v7 = v54;
if( Thread->Tcb.WaitBlockFill6[68] != 2 )
goto LABEL_19;
break;
case 1:
v16 = ControlPrcb;
KiRemoveThreadFromAnyReadyQueue(ControlPrcb, ControlReadyQueue, (__int64)Thread, (unsigned int)Priority);
KiUpdateThreadPriority(0i64, &Thread->Tcb, v12, 0);
KiPrepareReadyThreadForRescheduling(&Thread->Tcb, v12, &a2);
goto LABEL_19;
case 3:
v16 = ControlPrcb;
KiUpdateThreadPriority(ControlPrcb, &Thread->Tcb, v12, 1u);
if( (int)v12 < Priority )
{
v36 = (_ETHREAD *)KiSelectReadyThreadEx(v16, &Thread->Tcb, 0);
v38 = v36;
if( v36 )
{
if( (v36->Tcb.gap0[2] & 4) != 0 )
{
v39 = KiIsThreadRankNonZero(&v36->Tcb, v16, v37);
v40 = 1;
if( !v39 )
v40 = v38->Tcb.Priority;
}
else
{
v40 = v36->Tcb.Priority;
}
*v16->PriorityState = v40;
v42 = v16->SchedulerAssist;
if( v42 )
{
v43 = (unsigned int)KiVpThreadSystemWorkPriority;
if( v38 != v16->IdleThread )
v43 = (unsigned int)v40;
KiSetSchedulerAssistPriority((INT32 *)v16->SchedulerAssist, v43, 0);
v42 = v16->SchedulerAssist;
}
v44 = v38 == v16->IdleThread;
v16->NextThread = v38;
if( v42 )
v42[16] = v44;
if( v38->Tcb.WaitBlockFill6[68] == 1 )
v38->Tcb.ReadyTime = v38->Tcb.ReadyTime
- v38->Tcb.WaitBlock[2].SpareLong
+ KUSER_SHARED_DATA.TickCount.LowPart;
v38->Tcb.WaitBlockFill6[68] = 3;
KiInsertDeferredReadyList((INT64)&a2, (INT64)Thread);
v16 = ControlPrcb;
}
goto LABEL_19;
}
break;
default:
KiUpdateThreadPriority(0i64, &Thread->Tcb, v12, 0);
v16 = ControlPrcb;
goto LABEL_19;
}
v14 = v12;
goto LABEL_19;
}
}
LABEL_23:
Queue = (_KPRIQUEUE *)Thread->Tcb.Queue;
if( Queue && (*(_BYTE *)Queue & 0x7F) == 21 )
KiPriQueueThreadPriorityChanged(Queue, &Thread->Tcb);
else
Thread->Tcb.ThreadLock = 0i64;
KiProcessDeferredReadyList(CurrentPrcb, &a2, CurrentIrql);
return v7;
}Referenced by:
EtwpLogger
ExpWorkQueueManagerThread
IoApplyPriorityInfoThread
IopCreatePassiveInterruptRealtimeThreads
MiDeletePartitionResources
MiFlushAllHintedStorePages
MiMappedPageWriter
MiModifiedPageWriter
MiSetZeroPageThreadPriority
MiStoreUpdateMemoryConditions
MiWakeModifiedPageWriter
MiZeroLargePages
NtSetInformationThread
NtSetSystemInformation
PfpServiceMainThreadBoost
PfpServiceMainThreadUnboost
PopCreatePowerThread
PopFxEmergencyWorker
SMKM_STORE::SmStReadThread
SMKM_STORE::SmStWorkItemGet
SMKM_STORE::SmStWorkItemQueue
SMKM_STORE::SmStWorker
SMKM_STORE_MGR::SmCompressContextUpdateMemoryCondition
SMKM_STORE_MGR::SmCompressCtxBalancerThread
SMKM_STORE_MGR::SmCompressCtxWorkerThread
SMKM_STORE_MGR::SmUpdateMemoryConditions
SmKmStoreHelperWorker