KeRequestTerminationThread

VOID __stdcall KeRequestTerminationThread(_ETHREAD *Thread){
  char v2; 
  UINT8 OldIrql; 
  _KPRCB *CurrentPrcb; 
  __int64 SpinCount[2]; 
  INT64 v6[14]; 

  if( (*(_BYTE *)&Thread->Tcb.Process->Pcb.SecureState & 1) != 0 )
  {
    memset(v6, 0i64, 0x68u);
    v6[1] = Thread->Tcb.SecureThreadCookie;
    v6[2] = (INT64)Thread;
    VslpEnterIumSecureMode(2u, 9, 0i64, (INT64)v6);
  }
  if( !_interlockedbittestandset((volatile signed __int32 *)&Thread->Tcb.116 + 1, 0xFu) )
  {
    v2 = 0;
    OldIrql = KeGetCurrentIrql();
    __writecr8(2ui64);
    LODWORD(SpinCount[0]) = 0;
    while( _interlockedbittestandset64((volatile signed __int32 *)&Thread->Tcb.ThreadLock, 0i64) )
    {
      do
        KeYieldProcessorEx((UINT64 *)SpinCount);
      while( Thread->Tcb.ThreadLock );
    }
    CurrentPrcb = KeGetCurrentPrcb();
    if( (Thread->Tcb._bf_0 & 0x4000) != 0 )
    {
      v2 = 1;
      if( !Thread->Tcb.SchedulerApc.Inserted )
      {
        Thread->Tcb.SchedulerApc.Inserted = 1;
        KiInsertQueueApc(&Thread->Tcb.SchedulerApc);
        KiSignalThreadForApc(CurrentPrcb, &Thread->Tcb.SchedulerApc, OldIrql);
      }
    }
    KiReleaseThreadLockSafe((INT64)Thread);
    KiExitDispatcher(CurrentPrcb, 0i64, AdjustUnwait, 0i64, OldIrql);
    if( v2 )
    {
      KeAlertThread((INT64)Thread, 0);
      KeForceResumeThread(Thread);
    }
  }
}

Referenced by:

KeRequestTerminationProcess
PspInsertThread
PspTerminateThreadByPointer