MmOutSwapProcess
VOID __stdcall MmOutSwapProcess(_EPROCESS *Process){
LONG *v1;
__int64 v2;
char v4;
char v5;
_QWORD *v6;
__int64 v7;
_QWORD *v8;
UINT64 *v9;
UINT64 v10;
char *v11;
__int64 v12;
INT64 *v13;
UINT64 v14;
INT64 TransitionPte;
unsigned __int64 v16;
struct _KLOCK_QUEUE_HANDLE LockHandle;
__int16 PcValue;
char v19;
char v20;
int v21;
__int64 v22[2];
UINT8 OldIrql;
UINT64 SpinCount;
UINT64 v25;
v1 = &dword_140C4F4C0;
v2 = *((_BYTE *)Process + 1848) & 7;
v20 = 0;
OldIrql = 0;
memset(&LockHandle, 0, sizeof(LockHandle));
if( (_BYTE)v2 != 2 )
v1 = (LONG *)((char *)Process + 1856);
_InterlockedOr((volatile signed __int32 *)Process + 281, 0x40u);
v4 = *((_BYTE *)Process + 1851);
if( (v4 & 0x60) == 32 )
{
MiReleaseOutSwappedProcessCommit(Process);
}
else if( (v4 & 0x60) == 64 && *(_QWORD *)(*((_QWORD *)v1 + 4) + 40i64) )
{
MiReleaseCommitForResetPages(Process);
}
if( *((_QWORD *)Process + 225) == 1i64 && (*((_BYTE *)Process + 1851) & 2) == 0 )
{
PcValue = 263;
v22[1] = (__int64)v22;
v19 = 6;
v22[0] = (__int64)v22;
v21 = 0;
KeAcquireInStackQueuedSpinLock(&WorkerRoutine, &LockHandle);
while( 1 )
{
v5 = *((_BYTE *)Process + 1849) >> 4;
if( (*((_BYTE *)Process + 1849) & 6) == 0 && !v5 )
break;
if( v5 )
{
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
v16 = LockHandle.OldIrql;
goto LABEL_31;
}
*((_QWORD *)Process + 221) = &PcValue;
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
__writecr8(LockHandle.OldIrql);
KeWaitForGate(&PcValue, 18);
KeAcquireInStackQueuedSpinLock(&WorkerRoutine, &LockHandle);
*((_QWORD *)Process + 221) = 0i64;
}
_InterlockedOr((volatile signed __int32 *)Process + 281, 0x80u);
v6 = (_QWORD *)((char *)Process + 1688);
v7 = *((_QWORD *)Process + 211);
v8 = (_QWORD *)*((_QWORD *)Process + 212);
if( *(_EPROCESS **)(v7 + 8) != (_EPROCESS *)((char *)Process + 1688) || (_QWORD *)*v8 != v6 )
__fastfail(3u);
*v8 = v7;
*(_QWORD *)(v7 + 8) = v8;
*v6 = 0i64;
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
__writecr8(LockHandle.OldIrql);
v9 = (UINT64 *)*((_QWORD *)v1 + 5);
if( v9 )
{
MiEmptyPageAccessLog(v9);
*((_QWORD *)v1 + 5) = 0i64;
}
LODWORD(SpinCount) = 0;
while( !(unsigned int)KeIsEmptyAffinityEx((_WORD *)Process + 184) )
KeYieldProcessorEx(&SpinCount);
KeFlushProcessTb(*((_QWORD *)Process + 5));
if( *((_QWORD *)Process + 241) )
KeFlushProcessTb(*((_QWORD *)Process + 113));
v10 = *((_QWORD *)Process + 5) >> 12;
v11 = (char *)MmGetPfnDb() + 48 * v10;
LODWORD(v12) = MiMapPageInHyperSpaceWorker(v10, &OldIrql, 0x80000000ui64);
v13 = (INT64 *)(v12 + 8i64 * ((*((_DWORD *)v11 + 2) >> 3) & 0x1FF));
TransitionPte = MiMakeTransitionPte(v10, 4ui64, v14);
*v13 = TransitionPte;
MiUnmapPageInHyperSpaceWorker(v13, OldIrql, 0x80000000ui64);
MiLockAndDecrementShareCount((UINT64)v11, 0);
KeAcquireInStackQueuedSpinLock(&WorkerRoutine, &LockHandle);
LODWORD(v25) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)v11 + 6, 0x3Fui64) )
{
do
KeYieldProcessorEx(&v25);
while( *((__int64 *)v11 + 3) < 0 );
}
*((_QWORD *)v11 + 1) = (char *)Process + 1432;
*((_QWORD *)Process + 179) = TransitionPte;
*((_QWORD *)Process + 223) = 0i64;
*((_QWORD *)Process + 224) = 0i64;
*((_QWORD *)Process + 225) = 0i64;
*((_QWORD *)Process + 226) = 0i64;
MiDecrementShareCount((UINT64)v11);
_InterlockedAnd64((volatile signed __int64 *)v11 + 3, 0x7FFFFFFFFFFFFFFFui64);
KeReleaseInStackQueuedSpinLockFromDpcLevel(&LockHandle);
v16 = LockHandle.OldIrql;
LABEL_31:
__writecr8(v16);
}
}Referenced by:
KiOutSwapProcesses