KeSetPriorityBoost
VOID __stdcall KeSetPriorityBoost(_ETHREAD *TargetThread, INT64 BoostPriority){
int v2;
char v4;
unsigned __int8 CurrentIrql;
struct _KPRCB *CurrentPrcb;
unsigned __int64 v7;
struct _KPRCB *v8;
int v9;
unsigned __int64 v10;
__int64 v11;
UINT64 SpinCount;
_SINGLE_LIST_ENTRY ReadyList;
v2 = BoostPriority;
if( *((__int64 **)TargetThread + 68) != KiInitialProcess )
{
v4 = 0;
ReadyList.Next = 0i64;
CurrentIrql = KeGetCurrentIrql();
__writecr8(2ui64);
CurrentPrcb = KeGetCurrentPrcb();
if( *((char *)TargetThread + 195) <= 0 || *((char *)TargetThread + 195) >= (int)BoostPriority )
goto LABEL_17;
v7 = *((_QWORD *)TargetThread + 9);
v8 = KeGetCurrentPrcb();
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)TargetThread + 16, 0i64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( *((_QWORD *)TargetThread + 8) );
v11 = *((_QWORD *)v8 + 4247);
if( v11 && *((_BYTE *)v8 + 32) <= 1u )
++*(_DWORD *)(v11 + 24);
}
v9 = *((char *)TargetThread + 195);
if( *((char *)TargetThread + 195) > 0 && v9 < v2 )
{
v4 = 1;
*((_BYTE *)TargetThread + 564) += 16 * (v2 - v9);
KiSetPriorityThread((_KTHREAD *)TargetThread, &ReadyList, (unsigned int)(char)v2);
v10 = *((_QWORD *)TargetThread + 4);
if( v7 > v10 || v10 - v7 < (unsigned int)KiLockQuantumTarget )
*((_QWORD *)TargetThread + 4) = v7 + (unsigned int)KiLockQuantumTarget;
}
*((_QWORD *)TargetThread + 8) = 0i64;
if( v4 )
KiProcessDeferredReadyList((__int64)CurrentPrcb, &ReadyList, CurrentIrql);
else
LABEL_17:
__writecr8(CurrentIrql);
}
}Referenced by:
ExpApplyPriorityBoost
FsRtlpDoBoost
KeGenericProcessorCallback