KiOutSwapProcesses
VOID __stdcall KiOutSwapProcesses(_SINGLE_LIST_ENTRY *SwapEntry){
_EPROCESS *v2;
UINT8 CurrentIrql;
_LIST_ENTRY *p_ReadyListHead;
_LIST_ENTRY *Flink;
_LIST_ENTRY *v6;
_LIST_ENTRY *Blink;
char v8;
unsigned int v9;
_QWORD *p_Next;
signed __int64 v11;
signed __int64 v12;
UINT64 SpinCount;
do
{
v2 = (_EPROCESS *)&SwapEntry[-45];
SwapEntry = SwapEntry->Next;
CurrentIrql = KeGetCurrentIrql();
__writecr8(2ui64);
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset((volatile signed __int32 *)v2, 7u) )
{
do
KeYieldProcessorEx(&SpinCount);
while( (*(_DWORD *)v2->Pcb.gap0 & 0x80u) != 0 );
}
p_ReadyListHead = &v2->Pcb.ReadyListHead;
Flink = v2->Pcb.ReadyListHead.Flink;
if( Flink == &v2->Pcb.ReadyListHead || (v2->Pcb.StackCount.Value & 7) == 6 )
{
_InterlockedXor(&v2->Pcb.StackCount.Value, v2->Pcb.StackCount.Value & 7 ^ 5);
_InterlockedAnd((volatile signed __int32 *)v2, 0xFFFFFF7F);
__writecr8(CurrentIrql);
MmOutSwapProcess(&v2->Pcb);
v8 = 0;
KeGetCurrentIrql();
__writecr8(2ui64);
KiAcquireKobjectLockSafe(v2);
if( p_ReadyListHead->Flink == p_ReadyListHead )
{
v9 = 4;
}
else
{
p_Next = &v2->Pcb.SwapListEntry.Next;
_m_prefetchw((char *)&KiSwapEvent + 24);
v11 = *(&KiSwapEvent + 3);
do
{
*p_Next = v11;
v12 = v11;
v11 = _InterlockedCompareExchange64((_QWORD *)&KiSwapEvent + 3, (signed __int64)p_Next, v11);
}
while( v11 != v12 );
if( !v11 )
v8 = 1;
v9 = 7;
}
_InterlockedXor(&v2->Pcb.StackCount.Value, v9);
_InterlockedAnd((volatile signed __int32 *)v2, 0xFFFFFF7F);
if( v8 )
{
KiAcquireKobjectLockSafe(&KiSwapEvent);
*(&KiSwapEvent + 1) = 1;
_InterlockedAnd((volatile signed __int32 *)&KiSwapEvent, 0xFFFFFF7F);
}
__writecr8(CurrentIrql);
}
else
{
v6 = p_ReadyListHead->Flink;
Blink = v2->Pcb.ReadyListHead.Blink;
if( p_ReadyListHead->Flink->Blink != p_ReadyListHead || Blink->Flink != p_ReadyListHead )
__fastfail(3u);
Blink->Flink = v6;
v6->Blink = Blink;
v2->Pcb.ReadyListHead.Blink = &v2->Pcb.ReadyListHead;
p_ReadyListHead->Flink = p_ReadyListHead;
_InterlockedXor(&v2->Pcb.StackCount.Value, 3u);
_InterlockedAnd((volatile signed __int32 *)v2, 0xFFFFFF7F);
KiReadyOutSwappedThreads(Flink, CurrentIrql);
}
}
while( SwapEntry );
}Referenced by:
KeSwapProcessOrStack