KiDecrementProcessStackCount

VOID __stdcall KiDecrementProcessStackCount(_EPROCESS *Process){
  char v2; 
  unsigned __int8 CurrentIrql; 
  unsigned __int32 Value; 
  unsigned __int32 v5; 
  _SINGLE_LIST_ENTRY *p_SwapListEntry; 
  signed __int64 v7; 
  signed __int64 v8; 

  if( (_InterlockedExchangeAdd(&Process->Pcb.StackCount.Value, 0xFFFFFFF8) & 0xFFFFFFF8) == 8 )
  {
    v2 = 0;
    CurrentIrql = KeGetCurrentIrql();
    __writecr8(2ui64);
    KiAcquireKobjectLockSafe(Process);
    Value = Process->Pcb.StackCount.Value;
    if( (Value & 7) == 0 && Process->Pcb.ThreadListHead.Flink != &Process->Pcb.ThreadListHead )
    {
      while( Value < 8 )
      {
        v5 = Value;
        Value = _InterlockedCompareExchange(&Process->Pcb.StackCount.Value, Value & 0xFFFFFFF8 | 3, Value);
        if( v5 == Value )
        {
          v2 = 1;
          break;
        }
      }
    }
    _InterlockedAnd((volatile signed __int32 *)Process, 0xFFFFFF7F);
    if( v2 )
    {
      p_SwapListEntry = &Process->Pcb.SwapListEntry;
      _m_prefetchw(&KiProcessOutSwapListHead);
      v7 = KiProcessOutSwapListHead;
      do
      {
        p_SwapListEntry->Next = (_SINGLE_LIST_ENTRY *)v7;
        v8 = v7;
        v7 = _InterlockedCompareExchange64(&KiProcessOutSwapListHead, (signed __int64)p_SwapListEntry, v7);
      }
      while( v7 != v8 );
      if( !v7 )
        KeSetEvent((PRKEVENT)&KiSwapEvent, 10, 0);
    }
    __writecr8(CurrentIrql);
  }
}

Referenced by:

KeDeleteThread
KiCommitThreadWait
KiOutSwapKernelStacks
KiSuspendThread
KiUnstackDetachProcess