KeSetPriorityBoost
VOID __stdcall KeSetPriorityBoost(_ETHREAD *TargetThread, INT64 BoostPriority){
int v2;
char v4;
UINT8 CurrentIrql;
_KPRCB *CurrentPrcb;
volatile unsigned __int64 CycleTime;
struct _KPRCB *v8;
int Priority;
unsigned __int64 QuantumTarget;
_DWORD *SchedulerAssist;
UINT64 SpinCount;
_SINGLE_LIST_ENTRY ReadyList;
v2 = BoostPriority;
if( TargetThread->Tcb.Process != (_EPROCESS *)&KiInitialProcess )
{
v4 = 0;
ReadyList.Next = 0i64;
CurrentIrql = KeGetCurrentIrql();
__writecr8(2ui64);
CurrentPrcb = KeGetCurrentPrcb();
if( TargetThread->Tcb.Priority <= 0 || TargetThread->Tcb.Priority >= (int)BoostPriority )
goto LABEL_17;
CycleTime = TargetThread->Tcb.CycleTime;
v8 = KeGetCurrentPrcb();
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)&TargetThread->Tcb.ThreadLock, 0i64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( TargetThread->Tcb.ThreadLock );
SchedulerAssist = v8->SchedulerAssist;
if( SchedulerAssist && v8->NestingLevel <= 1u )
++SchedulerAssist[6];
}
Priority = TargetThread->Tcb.Priority;
if( TargetThread->Tcb.Priority > 0 && Priority < v2 )
{
v4 = 1;
TargetThread->Tcb.PriorityDecrement += 16 * (v2 - Priority);
KiSetPriorityThread(&TargetThread->Tcb, &ReadyList, (unsigned int)(char)v2);
QuantumTarget = TargetThread->Tcb.QuantumTarget;
if( CycleTime > QuantumTarget || QuantumTarget - CycleTime < (unsigned int)KiLockQuantumTarget )
TargetThread->Tcb.QuantumTarget = CycleTime + (unsigned int)KiLockQuantumTarget;
}
TargetThread->Tcb.ThreadLock = 0i64;
if( v4 )
KiProcessDeferredReadyList(CurrentPrcb, &ReadyList, CurrentIrql);
else
LABEL_17:
__writecr8(CurrentIrql);
}
}Referenced by:
ExpApplyPriorityBoost
FsRtlpDoBoost
KeGenericProcessorCallback