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