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