KeAlertThreadByThreadId
UINT8 __stdcall KeAlertThreadByThreadId(_ETHREAD *Thread){
UINT8 OldIrql;
_KPRCB *CurrentPrcb;
UINT8 v4;
char v5;
UINT64 SpinCount;
OldIrql = KeGetCurrentIrql();
__writecr8(2ui64);
CurrentPrcb = KeGetCurrentPrcb();
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)&Thread->Tcb.ThreadLock, 0i64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( Thread->Tcb.ThreadLock );
}
if( (*(&Thread->Tcb.MiscFlags + 1) & 0x10) != 0 )
{
v4 = 0;
}
else
{
v4 = 1;
if( Thread->Tcb.WaitBlockFill6[68] != 5
|| (unsigned __int8)((Thread->Tcb.WaitRegister.Flags & 7) - 3) <= 1u
|| Thread->Tcb.WaitReason != 37
|| (KiSignalThread(CurrentPrcb, Thread, 257i64, 0i64), Thread->Tcb.WaitRegister.Flags |= 0x80u, !v5) )
{
_interlockedbittestandset((volatile signed __int32 *)&Thread->Tcb.116 + 1, 4u);
}
}
KiReleaseThreadLockSafe((INT64)Thread);
KiExitDispatcher(CurrentPrcb, 0i64, AdjustUnwait, 1i64, OldIrql);
return v4;
}Referenced by:
NtAlertThreadByThreadId
PsDispatchIumService
RtlRunOnceComplete
VslCallEnclave