KeTryToFreezeThreadStack
VOID __fastcall KeTryToFreezeThreadStack(_ETHREAD *Thread, VOID **Token){
unsigned __int8 v4;
_KPRCB *v5;
UINT64 SpinCount;
_KPRCB *ControlPrcb;
_KSHARED_READY_QUEUE *ControlReadyQueue;
ControlPrcb = 0i64;
ControlReadyQueue = 0i64;
if( Thread->Tcb.Process != (_EPROCESS *)&KiInitialProcess )
{
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)&Thread->Tcb.ThreadLock, 0i64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( Thread->Tcb.ThreadLock );
}
KiAcquireThreadStateLock(Thread, &ControlPrcb, &ControlReadyQueue);
if( v4 <= 4u )
goto LABEL_10;
if( v4 == 5 )
{
if( !(unsigned int)KiIsKernelStackSwappable(&Thread->Tcb) )
goto LABEL_10;
LOBYTE(v5) = Thread->Tcb.Running;
if( (_BYTE)v5 )
goto LABEL_10;
}
else if( v4 == 7 || v4 == 9 )
{
LABEL_10:
KiReleaseThreadStateLock(v5, (_KSHARED_READY_QUEUE *)ControlPrcb);
KiReleaseThreadLockSafe((INT64)Thread);
return;
}
*Token = ControlPrcb;
}
}Referenced by:
MiSwapStackPage