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