KeBoostPriorityThread
VOID __stdcall KeBoostPriorityThread(_ETHREAD *Thread, INT64 Increment){
int v2;
unsigned __int8 CurrentIrql;
struct _KPRCB *CurrentPrcb;
_ETHREAD *CurrentThread;
int Priority;
int v8;
unsigned int v9;
unsigned __int64 CycleTime;
unsigned __int64 v11;
_ETHREAD *v12;
INT64 v13;
_ETHREAD *NextThread;
char v15;
_BYTE *DynamicPriority;
INT64 v17;
_SINGLE_LIST_ENTRY ReadyList;
UINT64 SpinCount;
UINT64 v20;
int v21;
v2 = Increment;
if( Thread->Tcb.Process != (_EPROCESS *)&KiInitialProcess )
{
ReadyList.Next = 0i64;
CurrentIrql = KeGetCurrentIrql();
__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 );
}
Priority = Thread->Tcb.Priority;
v21 = Priority;
if( Priority < 16 && !Thread->Tcb.PriorityDecrement )
{
v8 = v2 + Thread->Tcb.BasePriority;
if( v8 > Priority )
{
v9 = v2 + Thread->Tcb.BasePriority;
if( v8 >= 16 )
v9 = 15;
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;
KiSetPriorityThread(&Thread->Tcb, &ReadyList, v9);
}
}
KiReleaseThreadLockSafe((INT64)Thread);
KiReadyDeferredReadyList(CurrentPrcb, &ReadyList);
if( CurrentIrql < 2u )
{
v12 = CurrentPrcb->CurrentThread;
if( CurrentPrcb->NextThread )
{
KiAbProcessContextSwitch(&CurrentPrcb->CurrentThread->Tcb, 0i64);
LODWORD(v20) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)&CurrentPrcb->PrcbLock, 0i64) )
{
do
KeYieldProcessorEx(&v20);
while( CurrentPrcb->PrcbLock );
}
NextThread = CurrentPrcb->NextThread;
CurrentPrcb->NextThread = 0i64;
_disable();
KiEndThreadCycleAccumulation(
(INT64)CurrentPrcb,
(INT64)v12,
0i64,
v13,
(INT64)DynamicPriority,
v17,
(INT64)ReadyList.Next);
_enable();
CurrentPrcb->CurrentThread = NextThread;
if( NextThread->Tcb.WaitBlockFill6[68] == 1 )
NextThread->Tcb.ReadyTime = NextThread->Tcb.ReadyTime
- NextThread->Tcb.WaitBlock[2].SpareLong
+ KUSER_SHARED_DATA.TickCount.LowPart;
NextThread->Tcb.WaitBlockFill6[68] = 2;
v12->Tcb.WaitReason = 32;
v12->Tcb.WaitIrql = CurrentIrql;
KiQueueReadyThread(CurrentPrcb, &v12->Tcb);
KiSwapContext();
if( !v15 )
goto LABEL_17;
}
else if( (v12->Tcb._bf_0 & 0x40) == 0 )
{
LABEL_17:
__writecr8(CurrentIrql);
return;
}
__writecr8(1ui64);
v12->Tcb._bf_0 &= ~0x40u;
KiDeliverApc(0, 0i64, 0i64);
goto LABEL_17;
}
if( CurrentPrcb->NextThread && !CurrentPrcb->DpcRoutineActive )
KiRequestSoftwareInterrupt(CurrentPrcb, 2);
}
}Referenced by:
ExpCreateWorkerThread
NtSetInformationProcess