KiAbApplyWakeupBoost
VOID __stdcall KiAbApplyWakeupBoost(INT64 HandoffPriority, _KLOCK_ENTRY *TargetEntry, UINT64 SkipThreadDispatch){
int v3;
__int64 EntryOffset;
char *v6;
UINT8 CurrentIrql;
char v8;
char v9;
_KPRCB *CurrentPrcb;
UINT64 SpinCount;
_SINGLE_LIST_ENTRY ReadyList;
v3 = SkipThreadDispatch;
if( (TargetEntry->CrossThreadFlags & 1) == 0 || TargetEntry->WaiterTree.Root )
{
EntryOffset = TargetEntry->EntryOffset;
ReadyList.Next = 0i64;
v6 = (char *)TargetEntry - 16 * EntryOffset;
CurrentIrql = KeGetCurrentIrql();
__writecr8(2ui64);
v8 = HandoffPriority;
if( (char)HandoffPriority > 15 )
v8 = 15;
if( v6[563] < v8 && ((1 << (v8 - 1)) & 0x7FFF & TargetEntry->BoostBitmap._bf_0) == 0 )
{
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)v6 + 16, 0i64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( *((_QWORD *)v6 + 8) );
}
v9 = v6[v8 + 824];
if( v9 == -1 )
KeBugCheckEx(0x157u, v6, (PVOID)v8, (PVOID)1, 0i64);
v6[v8 + 824] = v9 + 1;
*((_DWORD *)v6 + 214) |= 1 << v8;
if( v6[195] < v8 )
KiSetPriorityThread((_KTHREAD *)v6, &ReadyList, (unsigned int)v8);
KiReleaseThreadLockSafe((INT64)v6);
TargetEntry->BoostBitmap._bf_0 ^= (TargetEntry->BoostBitmap._bf_0 ^ (TargetEntry->BoostBitmap._bf_0 & 0x7FFF | (1 << (v8 - 1)))) & 0x7FFF;
}
CurrentPrcb = KeGetCurrentPrcb();
if( v3 )
KiReadyDeferredReadyList(CurrentPrcb, &ReadyList);
else
KiProcessDeferredReadyList(CurrentPrcb, &ReadyList, CurrentIrql);
}
}Referenced by:
ExpWakePushLock
KeAbPreWakeupThread