KeAlertThread
char __fastcall KeAlertThread(__int64 a1, char a2){
__int64 v2;
UINT8 OldIrql;
_KPRCB *CurrentPrcb;
char v6;
char v8;
UINT64 SpinCount;
v2 = a2;
OldIrql = KeGetCurrentIrql();
__writecr8(2ui64);
CurrentPrcb = KeGetCurrentPrcb();
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)(a1 + 64), 0i64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( *(_QWORD *)(a1 + 64) );
}
v6 = *(_BYTE *)(v2 + a1 + 114);
if( !v6 )
{
if( *(_BYTE *)(a1 + 388) != 5
|| (unsigned __int8)((*(_BYTE *)(a1 + 112) & 7) - 3) <= 1u
|| (*(_DWORD *)(a1 + 116) & 0x10) == 0
|| (char)v2 > *(char *)(a1 + 391)
|| (KiSignalThread(CurrentPrcb, (_ETHREAD *)a1, 257i64, 0i64), *(_BYTE *)(a1 + 112) |= 0x80u, !v8) )
{
*(_BYTE *)(v2 + a1 + 114) = 1;
}
}
KiReleaseThreadLockSafe(a1);
KiExitDispatcher(CurrentPrcb, 0i64, AdjustUnwait, 2i64, OldIrql);
return v6;
}Referenced by:
IoDecrementKeepAliveCount
IopCancelIrpsInCurrentThreadListSpecialApc
KeAlertResumeThread
KeRequestTerminationThread
NtAlertThread