KeRetryOutswapProcess
VOID __stdcall KeRetryOutswapProcess(_EPROCESS *Process){
unsigned __int8 CurrentIrql;
int v3;
_SINGLE_LIST_ENTRY *p_SwapListEntry;
signed __int64 v5;
signed __int64 v6;
CurrentIrql = KeGetCurrentIrql();
__writecr8(2ui64);
KiAcquireKobjectLockSafe(Process);
v3 = Process->Pcb.StackCount.Value & 7;
if( v3 == 1 )
_InterlockedXor(&Process->Pcb.StackCount.Value, 7u);
_InterlockedAnd((volatile signed __int32 *)Process, 0xFFFFFF7F);
__writecr8(CurrentIrql);
if( v3 == 1 )
{
p_SwapListEntry = &Process->Pcb.SwapListEntry;
_m_prefetchw(&KiProcessOutSwapListHead);
v5 = KiProcessOutSwapListHead;
do
{
p_SwapListEntry->Next = (_SINGLE_LIST_ENTRY *)v5;
v6 = v5;
v5 = _InterlockedCompareExchange64(&KiProcessOutSwapListHead, (signed __int64)p_SwapListEntry, v5);
}
while( v5 != v6 );
if( !v5 )
KeSetEvent((PRKEVENT)&KiSwapEvent, 10, 0);
}
}Referenced by:
MiProcessWorkingSets
MmReleaseCommitForMemResetPages