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