KiOutSwapProcesses
VOID __stdcall KiOutSwapProcesses(_SINGLE_LIST_ENTRY *SwapEntry){
_SINGLE_LIST_ENTRY *v2;
UINT8 CurrentIrql;
_SINGLE_LIST_ENTRY *v4;
_LIST_ENTRY *Next;
_SINGLE_LIST_ENTRY *v6;
_SINGLE_LIST_ENTRY *v7;
char v8;
unsigned int v9;
_QWORD *p_Next;
signed __int64 v11;
signed __int64 v12;
UINT64 SpinCount;
do
{
v2 = SwapEntry - 45;
SwapEntry = SwapEntry->Next;
CurrentIrql = KeGetCurrentIrql();
__writecr8(2ui64);
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset((volatile signed __int32 *)v2, 7u) )
{
do
KeYieldProcessorEx(&SpinCount);
while( (LODWORD(v2->Next) & 0x80u) != 0 );
}
v4 = v2 + 43;
Next = (_LIST_ENTRY *)v2[43].Next;
if( Next == (_LIST_ENTRY *)&v2[43] || ((__int64)v2[105].Next & 7) == 6 )
{
_InterlockedXor((volatile signed __int32 *)&v2[105], (__int64)v2[105].Next & 7 ^ 5);
_InterlockedAnd((volatile signed __int32 *)v2, 0xFFFFFF7F);
__writecr8(CurrentIrql);
MmOutSwapProcess((_KPROCESS *)v2);
v8 = 0;
KeGetCurrentIrql();
__writecr8(2ui64);
KiAcquireKobjectLockSafe(v2);
if( v4->Next == v4 )
{
v9 = 4;
}
else
{
p_Next = &v2[45].Next;
_m_prefetchw(&KiProcessInSwapListHead);
v11 = KiProcessInSwapListHead;
do
{
*p_Next = v11;
v12 = v11;
v11 = _InterlockedCompareExchange64(&KiProcessInSwapListHead, (signed __int64)p_Next, v11);
}
while( v11 != v12 );
if( !v11 )
v8 = 1;
v9 = 7;
}
_InterlockedXor((volatile signed __int32 *)&v2[105], v9);
_InterlockedAnd((volatile signed __int32 *)v2, 0xFFFFFF7F);
if( v8 )
{
KiAcquireKobjectLockSafe(&KiSwapEvent);
KiSwapEvent.Header.SignalState = 1;
_InterlockedAnd((volatile signed __int32 *)&KiSwapEvent, 0xFFFFFF7F);
}
__writecr8(CurrentIrql);
}
else
{
v6 = v4->Next;
v7 = v2[44].Next;
if( v4->Next[1].Next != v4 || v7->Next != v4 )
__fastfail(3u);
v7->Next = v6;
v6[1].Next = v7;
v2[44].Next = v2 + 43;
v4->Next = v4;
_InterlockedXor((volatile signed __int32 *)&v2[105], 3u);
_InterlockedAnd((volatile signed __int32 *)v2, 0xFFFFFF7F);
KiReadyOutSwappedThreads(Next, CurrentIrql);
}
}
while( SwapEntry );
}Referenced by:
KeSwapProcessOrStack