KiRequestProcessInSwap
VOID __stdcall KiRequestProcessInSwap(_ETHREAD *Thread, _EPROCESS *Process){
struct _KPRCB *CurrentPrcb;
char v4;
_EPROCESS *v6;
_EPROCESS **v7;
signed __int64 *v8;
signed __int64 v9;
signed __int64 v10;
__int64 v11;
UINT64 SpinCount;
*((_DWORD *)Thread + 109) = KUSER_SHARED_DATA.TickCount.LowPart;
CurrentPrcb = KeGetCurrentPrcb();
v4 = 0;
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)Thread + 16, 0i64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( *((_QWORD *)Thread + 8) );
v11 = *((_QWORD *)CurrentPrcb + 4247);
if( v11 && *((_BYTE *)CurrentPrcb + 32) <= 1u )
++*(_DWORD *)(v11 + 24);
}
*((_BYTE *)Thread + 388) = 9;
if( (*((_DWORD *)Thread + 30) & 0x1000) != 0 )
_interlockedbittestandreset((volatile signed __int32 *)Thread + 30, 0xCu);
*((_QWORD *)Thread + 8) = 0i64;
v6 = (_EPROCESS *)((char *)Thread + 216);
v7 = (_EPROCESS **)*((_QWORD *)Process + 44);
if( *v7 != (_EPROCESS *)((char *)Process + 344) )
__fastfail(3u);
*(_QWORD *)v6 = (char *)Process + 344;
*((_QWORD *)v6 + 1) = v7;
*v7 = v6;
*((_QWORD *)Process + 44) = v6;
if( (*((_DWORD *)Process + 210) & 7) == 1 )
{
_InterlockedXor((volatile signed __int32 *)Process + 210, 3u);
v4 = 1;
}
_InterlockedAnd((volatile signed __int32 *)Process, 0xFFFFFF7F);
if( v4 )
{
MmNotifyProcessInSwapTrigger((__int64)Process);
v8 = (signed __int64 *)((char *)Process + 360);
_m_prefetchw(&KiProcessInSwapListHead);
v9 = KiProcessInSwapListHead;
do
{
*v8 = v9;
v10 = v9;
v9 = _InterlockedCompareExchange64(&KiProcessInSwapListHead, (signed __int64)v8, v9);
}
while( v9 != v10 );
if( !v9 )
KeSetEvent(&KiSwapEvent, 10);
}
}Referenced by:
KiExitDispatcher
KiInSwapSingleProcess
KiReadyThread