KiAbApplyWakeupBoost
void __fastcall KiAbApplyWakeupBoost(char a1, __int64 a2, int a3){
__int64 v5;
__int64 v6;
unsigned __int8 CurrentIrql;
char v8;
char v9;
struct _KPRCB *CurrentPrcb;
UINT64 SpinCount;
_SINGLE_LIST_ENTRY ReadyList;
if( (*(_BYTE *)(a2 + 27) & 1) == 0 || *(_QWORD *)(a2 + 64) )
{
v5 = *(unsigned __int8 *)(a2 + 24);
ReadyList.Next = 0i64;
v6 = a2 - 16 * v5;
CurrentIrql = KeGetCurrentIrql();
__writecr8(2ui64);
v8 = a1;
if( a1 > 15 )
v8 = 15;
if( *(char *)(v6 + 563) < v8 && ((1 << (v8 - 1)) & 0x7FFF & *(_WORD *)(a2 + 88)) == 0 )
{
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)(v6 + 64), 0i64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( *(_QWORD *)(v6 + 64) );
}
v9 = *(_BYTE *)(v8 + v6 + 824);
if( v9 == -1 )
KeBugCheckEx(0x157u, v6, v8, 1ui64, 0i64);
*(_BYTE *)(v8 + v6 + 824) = v9 + 1;
*(_DWORD *)(v6 + 856) |= 1 << v8;
if( *(char *)(v6 + 195) < v8 )
KiSetPriorityThread((_KTHREAD *)v6, &ReadyList, (unsigned int)v8);
KiReleaseThreadLockSafe(v6);
*(_WORD *)(a2 + 88) ^= (*(_WORD *)(a2 + 88) ^ (*(_WORD *)(a2 + 88) & 0x7FFF | (1 << (v8 - 1)))) & 0x7FFF;
}
CurrentPrcb = KeGetCurrentPrcb();
if( a3 )
KiReadyDeferredReadyList(CurrentPrcb, &ReadyList);
else
KiProcessDeferredReadyList((__int64)CurrentPrcb, &ReadyList, CurrentIrql);
}
}Referenced by:
ExpWakePushLock
KeAbPreWakeupThread