KeTestAlertThread

UINT8 __stdcall KeTestAlertThread(INT8 AlertMode){
  _ETHREAD *CurrentThread; 
  __int64 v2; 
  unsigned __int8 CurrentIrql; 
  UINT8 v4; 
  UINT64 SpinCount; 
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  v2 = AlertMode;
  CurrentIrql = KeGetCurrentIrql();
  __writecr8(2ui64);
  LODWORD(SpinCount) = 0;
  while( _interlockedbittestandset64((volatile signed __int32 *)CurrentThread + 16, 0i64) )
  {
    do
      KeYieldProcessorEx(&SpinCount);
    while( *((_QWORD *)CurrentThread + 8) );
  }
  v4 = *((_BYTE *)CurrentThread + v2 + 114);
  if( v4 )
  {
    *((_BYTE *)CurrentThread + v2 + 114) = 0;
  }
  else if( (_BYTE)v2 == 1 && *((_ETHREAD **)CurrentThread + 21) != (_ETHREAD *)((char *)CurrentThread + 168) )
  {
    *((_BYTE *)CurrentThread + 194) |= 2u;
  }
  KiReleaseThreadLockSafe((INT64)CurrentThread);
  __writecr8(CurrentIrql);
  return v4;
}

Referenced by:

DbgkpSendErrorMessage
KiContinueEx
KiDeliverApc
NtTestAlert