KeRequestTerminationThread

VOID __stdcall KeRequestTerminationThread(_ETHREAD *Thread){
  char v2; 
  UINT8 OldIrql; 
  _KPRCB *CurrentPrcb; 
  UINT64 SpinCount[2]; 
  INT64 result[14]; 
  if( (*(_BYTE *)(*((_QWORD *)Thread + 68) + 992i64) & 1) != 0 )
  {
    memset((INT64)result, 0i64);
    result[1] = *((unsigned int *)Thread + 199);
    result[2] = (INT64)Thread;
    VslpEnterIumSecureMode(2u, 9, 0i64, (INT64)result);
  }
  if( !_interlockedbittestandset((volatile signed __int32 *)Thread + 30, 0xFu) )
  {
    v2 = 0;
    OldIrql = KeGetCurrentIrql();
    __writecr8(2ui64);
    LODWORD(SpinCount[0]) = 0;
    while( _interlockedbittestandset64((volatile signed __int32 *)Thread + 16, 0i64) )
    {
      do
        KeYieldProcessorEx(SpinCount);
      while( *((_QWORD *)Thread + 8) );
    }
    CurrentPrcb = KeGetCurrentPrcb();
    if( (*((_DWORD *)Thread + 29) & 0x4000) != 0 )
    {
      v2 = 1;
      if( !*((_BYTE *)Thread + 730) )
      {
        *((_BYTE *)Thread + 730) = 1;
        KiInsertQueueApc((_KAPC *)((char *)Thread + 648));
        KiSignalThreadForApc(CurrentPrcb, (_KAPC *)((char *)Thread + 648), OldIrql);
      }
    }
    KiReleaseThreadLockSafe((INT64)Thread);
    KiExitDispatcher(CurrentPrcb, 0i64, AdjustUnwait, 0i64, OldIrql);
    if( v2 )
    {
      KeAlertThread((__int64)Thread, 0);
      KeForceResumeThread((_KTHREAD *)Thread);
    }
  }
}

Referenced by:

KeRequestTerminationProcess
PspInsertThread
PspTerminateThreadByPointer