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