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