MmCleanProcessAddressSpace
void __fastcall MmCleanProcessAddressSpace(ULONG_PTR a1, __int64 a2){
int v3;
unsigned int v4;
_ETHREAD *CurrentThread;
__int64 v6;
_MI_PARTITION *v7;
_MI_PARTITION *v8;
int v9;
_QWORD *v10;
__int64 i;
_QWORD **v12;
CHAR *v13;
__int64 v14;
_QWORD *v15;
BOOL v16;
INT64 v17;
_QWORD *v18;
ULONG_PTR v19;
__int64 v20;
bool v21;
INT64 v22;
signed __int32 v23;
signed __int32 v24;
__int64 v25;
struct _KEVENT Event;
int v27;
v3 = *(_DWORD *)(a1 + 1124);
memset(&Event, 0, sizeof(Event));
if( (v3 & 0x20) == 0 )
{
v4 = v3 & 0xC00;
if( v4 > 0x400 )
{
if( v4 != 2048 )
goto LABEL_4;
PsReturnProcessQuota(a1, a2, *(_QWORD *)(a1 + 1776) - 4i64);
MiGetProcessPartition((_EPROCESS *)a1);
MiReturnResident(v22, *(_QWORD *)(a1 + 1776) - 4i64);
v23 = *(_DWORD *)(a1 + 1124);
do
{
v24 = v23;
v23 = _InterlockedCompareExchange((volatile signed __int32 *)(a1 + 1124), v23 & 0xFFFFF3FF | 0x400, v23);
}
while( v24 != v23 );
v21 = (*(_DWORD *)(a1 + 1124) & 0x10000) == 0;
LABEL_39:
if( !v21 )
MiDereferenceSession();
return;
}
LABEL_38:
v21 = (v3 & 0x10000) == 0;
goto LABEL_39;
}
if( (*(_BYTE *)(a1 + 1851) & 0x60) != 96 )
goto LABEL_38;
LABEL_4:
KeInitializeEvent(&Event, NotificationEvent, 0);
CurrentThread = (_ETHREAD *)KeGetCurrentThread();
v27 = MiBeginProcessClean((__int64)CurrentThread, a1);
MiGetProcessPartition((_EPROCESS *)a1);
v6 = *(_QWORD *)(a1 + 1680);
v8 = v7;
LABEL_5:
while( 1 )
{
v9 = 0;
LOCK_ADDRESS_SPACE_SHARED(CurrentThread, (_EPROCESS *)a1);
v10 = *(_QWORD **)(a1 + 2008);
i = 0i64;
while( v10 )
{
i = (__int64)v10;
v10 = (_QWORD *)*v10;
}
if( !i )
break;
MiReferenceVad(i);
while( 1 )
{
v12 = *(_QWORD ***)(i + 8);
v13 = (CHAR *)i;
v14 = i;
if( v12 )
{
v15 = *v12;
for( i = *(_QWORD *)(i + 8); v15; v15 = (_QWORD *)*v15 )
i = (__int64)v15;
}
else
{
while( 1 )
{
i = *(_QWORD *)(i + 16) & 0xFFFFFFFFFFFFFFFCui64;
if( !i || *(_QWORD *)i == v14 )
break;
v14 = i;
}
}
if( i )
MiReferenceVad(i);
UNLOCK_ADDRESS_SPACE_SHARED((__int64)CurrentThread, a1);
MiLockVad((__int64)CurrentThread, (__int64)v13);
if( (unsigned int)MiCleanVad(v13) )
v9 = 1;
LOCK_ADDRESS_SPACE_SHARED(CurrentThread, (_EPROCESS *)a1);
if( !i )
break;
MiLockVad((__int64)CurrentThread, i);
if( (unsigned int)MiVadDeleted(i) )
{
MiUnlockVad((__int64)CurrentThread, i);
UNLOCK_ADDRESS_SPACE_SHARED((__int64)CurrentThread, a1);
MiLockVad((__int64)CurrentThread, i);
MiCleanVad((CHAR *)i);
goto LABEL_5;
}
MiUnlockVad((__int64)CurrentThread, i);
}
if( !v9 )
break;
UNLOCK_ADDRESS_SPACE_SHARED((__int64)CurrentThread, a1);
}
*(_QWORD *)(v6 + 312) = &Event;
v16 = _InterlockedAdd((volatile signed __int32 *)(v6 + 280), 0xFFFFFFFF) != 0;
UNLOCK_ADDRESS_SPACE_SHARED((__int64)CurrentThread, a1);
if( v16 )
KeWaitForSingleObject(&Event, Executive, 0, 0, 0i64);
if( (*(_BYTE *)(a1 + 1851) & 0x60) == 96 )
MiClearCommitReleaseState((_MMSUPPORT_INSTANCE *)(a1 + 1664));
ExFreeSvmAsid();
MiCleanCfg();
LOCK_ADDRESS_SPACE((__int64)CurrentThread, a1);
*(_QWORD *)(v6 + 312) = 0i64;
v17 = *(_QWORD *)(*(_QWORD *)(a1 + 1680) + 392i64);
if( v17 )
{
v25 = MiDeleteAweInfoPages(v17);
if( v25 )
{
*(_QWORD *)(a1 + 2032) = 0i64;
MiReturnProcessCommitment(a1, v25);
}
}
v18 = *(_QWORD **)(a1 + 1408);
if( v18 && *v18 )
*v18 = 0i64;
MiDeleteCloneZombies(a1, 0i64);
v19 = MiCleanWorkingSet((_EPROCESS *)a1);
UNLOCK_ADDRESS_SPACE((__int64)CurrentThread, a1);
PsReturnProcessQuota(a1, v20, v19);
MiReturnResident((INT64)v8, v19);
if( (*(_DWORD *)(a1 + 1124) & 0x10000) != 0 )
MiDereferenceSession();
if( v27 )
MiContractWsSwapPageFile(v8);
}Referenced by:
PspRundownSingleProcess