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