KeTryToFreezeThreadStack
UINT8 __stdcall KeTryToFreezeThreadStack(_ETHREAD *Thread, PVOID *Token){
unsigned __int8 v4;
__int64 v5;
UINT8 result;
UINT64 SpinCount;
_KPRCB *ControlPrcb;
_KSHARED_READY_QUEUE *ControlReadyQueue;
ControlPrcb = 0i64;
ControlReadyQueue = 0i64;
if( *((__int64 **)Thread + 68) == KiInitialProcess )
return 0;
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)Thread + 16, 0i64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( *((_QWORD *)Thread + 8) );
}
KiAcquireThreadStateLock(Thread, &ControlPrcb, &ControlReadyQueue);
if( v4 <= 4u )
{
LABEL_10:
KiReleaseThreadStateLock(v5, (__int64)ControlPrcb, (volatile signed __int64 *)ControlReadyQueue);
KiReleaseThreadLockSafe((INT64)Thread);
return 0;
}
if( v4 == 5 )
{
if( !(unsigned int)KiIsKernelStackSwappable((__int64)Thread) )
goto LABEL_10;
LOBYTE(v5) = *((_BYTE *)Thread + 113);
if( (_BYTE)v5 )
goto LABEL_10;
}
else if( v4 == 7 || v4 == 9 )
{
goto LABEL_10;
}
result = 1;
*Token = ControlPrcb;
return result;
}Referenced by:
MiSwapStackPage