KeBoostPriorityThread
char __fastcall KeBoostPriorityThread(__int64 a1, int a2){
__int64 *v2;
unsigned __int8 CurrentIrql;
struct _KPRCB *CurrentPrcb;
__int64 v7;
int v8;
int v9;
unsigned int v10;
UINT64 updated;
UINT64 v12;
ULONG_PTR v13;
__int64 v14;
__int64 v15;
_SINGLE_LIST_ENTRY ReadyList;
UINT64 SpinCount;
UINT64 v19;
int v20;
v2 = KiInitialProcess;
if( *(__int64 **)(a1 + 544) != KiInitialProcess )
{
ReadyList.Next = 0i64;
CurrentIrql = KeGetCurrentIrql();
__writecr8(2ui64);
CurrentPrcb = KeGetCurrentPrcb();
LODWORD(SpinCount) = 0;
v7 = *((_QWORD *)CurrentPrcb + 1);
while( _interlockedbittestandset64((volatile signed __int32 *)(a1 + 64), 0i64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( *(_QWORD *)(a1 + 64) );
}
v8 = *(char *)(a1 + 195);
v20 = v8;
if( v8 < 16 && !*(_BYTE *)(a1 + 564) )
{
v9 = a2 + *(char *)(a1 + 563);
if( v9 > v8 )
{
v10 = a2 + *(char *)(a1 + 563);
if( v9 >= 16 )
v10 = 15;
if( a1 != v7 || *((_BYTE *)CurrentPrcb + 32) )
{
updated = *(_QWORD *)(a1 + 72);
}
else
{
_disable();
updated = KiUpdateTotalCyclesCurrentThread((__int64)CurrentPrcb, a1, 0i64);
_enable();
}
v12 = updated + KiCyclesPerClockQuantum * (unsigned int)*(unsigned __int8 *)(a1 + 651);
if( (*(_DWORD *)(a1 + 120) & 0x20) != 0 )
_interlockedbittestandreset((volatile signed __int32 *)(a1 + 120), 5u);
*(_QWORD *)(a1 + 32) = v12;
KiSetPriorityThread((_KTHREAD *)a1, &ReadyList, v10);
}
}
KiReleaseThreadLockSafe(a1);
LOBYTE(v2) = (unsigned __int8)KiReadyDeferredReadyList(CurrentPrcb, &ReadyList);
if( CurrentIrql < 2u )
{
v13 = *((_QWORD *)CurrentPrcb + 1);
if( *((_QWORD *)CurrentPrcb + 2) )
{
KiAbProcessContextSwitch(*((_KTHREAD **)CurrentPrcb + 1), 0i64);
LODWORD(v19) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)CurrentPrcb + 12, 0i64) )
{
do
KeYieldProcessorEx(&v19);
while( *((_QWORD *)CurrentPrcb + 6) );
}
v14 = *((_QWORD *)CurrentPrcb + 2);
*((_QWORD *)CurrentPrcb + 2) = 0i64;
_disable();
KiEndThreadCycleAccumulation(CurrentPrcb, (_KTHREAD *)v13, 0i64);
_enable();
*((_QWORD *)CurrentPrcb + 1) = v14;
if( *(_BYTE *)(v14 + 388) == 1 )
{
v15 = (unsigned int)(*(_DWORD *)(v14 + 132) - *(_DWORD *)(v14 + 436));
*(_DWORD *)(v14 + 132) = v15 + KUSER_SHARED_DATA.TickCount.LowPart;
}
*(_BYTE *)(v14 + 388) = 2;
*(_BYTE *)(v13 + 643) = 32;
*(_BYTE *)(v13 + 390) = CurrentIrql;
KiQueueReadyThread((__int64)CurrentPrcb, v13, v15);
if( !KiSwapContext((PKTHREAD)v13, (PKTHREAD)v14) )
goto LABEL_17;
}
else if( (*(_DWORD *)(v13 + 116) & 0x40) == 0 )
{
LABEL_17:
LOBYTE(v2) = CurrentIrql;
__writecr8(CurrentIrql);
return(char)v2;
}
__writecr8(1ui64);
*(_DWORD *)(v13 + 116) &= ~0x40u;
KiDeliverApc(0, 0i64, 0i64);
goto LABEL_17;
}
if( *((_QWORD *)CurrentPrcb + 2) )
{
LOBYTE(v2) = *((_BYTE *)CurrentPrcb + 12586);
if( !(_BYTE)v2 )
LOBYTE(v2) = KiRequestSoftwareInterrupt(CurrentPrcb, 2);
}
}
return(char)v2;
}Referenced by:
ExpCreateWorkerThread
NtSetInformationProcess