MiReleaseCommitForResetPages

VOID __stdcall MiReleaseCommitForResetPages(_EPROCESS *Process){
  INT64 *SharedVm; 
  _ETHREAD *CurrentThread; 
  INT64 *v4; 
  INT64 v5; 
  _QWORD *v6; 
  unsigned __int64 i; 
  int v8; 
  _QWORD **v9; 
  unsigned __int64 v10; 
  _QWORD *v11; 
  UINT64 v12; 
  INT64 *v13; 
  KIRQL v14; 
  struct _KEVENT *v15; 
  unsigned __int64 v16; 
  UINT64 v17; 
  KeForceAttachProcess(Process);
  SharedVm = MiGetSharedVm((INT64)Process + 1664);
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  v4 = SharedVm;
  v5 = SharedVm[4];
  if( (*(_DWORD *)(v5 + 48) & 1) != 0 )
  {
    --*((_WORD *)CurrentThread + 243);
    ExAcquirePushLockExclusiveEx((UINT64)Process + 1224, 0i64);
    *((_BYTE *)CurrentThread + 1304) |= 1u;
    v6 = (_QWORD *)*((_QWORD *)Process + 251);
    i = 0i64;
    while( v6 )
    {
      i = (unsigned __int64)v6;
      v6 = (_QWORD *)*v6;
    }
    while( i )
    {
      --*((_WORD *)CurrentThread + 243);
      ExAcquirePushLockExclusiveEx(i + 40, 0i64);
      *((_BYTE *)CurrentThread + 1304) |= 0x80u;
      MiIsVadEligibleForCommitRelease((_MMVAD_SHORT *)i);
      if( v8 )
        MiWalkResetCommitPages(i);
      MiUnlockVad((__int64)CurrentThread, i);
      v9 = *(_QWORD ***)(i + 8);
      v10 = i;
      if( v9 )
      {
        v11 = *v9;
        for( i = *(_QWORD *)(i + 8); v11; v11 = (_QWORD *)*v11 )
          i = (unsigned __int64)v11;
      }
      else
      {
        while( 1 )
        {
          i = *(_QWORD *)(i + 16) & 0xFFFFFFFFFFFFFFFCui64;
          if( !i || *(_QWORD *)i == v10 )
            break;
          v10 = i;
        }
      }
    }
    UNLOCK_ADDRESS_SPACE((__int64)CurrentThread, (__int64)Process);
  }
  v12 = _InterlockedExchange64((volatile __int64 *)Process + 234, 0i64);
  if( v12 )
    MiReturnCommit(*(_MI_PARTITION **)(qword_140C4E388 + 8i64 * *((unsigned __int16 *)Process + 919)), v12);
  v13 = MiGetSharedVm((INT64)Process + 1664);
  v14 = ExAcquireSpinLockExclusive((PEX_SPIN_LOCK)v13);
  *((_DWORD *)v13 + 1) = 0;
  v15 = *(struct _KEVENT **)(v5 + 40);
  *(_QWORD *)(v5 + 40) = 0i64;
  v16 = *(_QWORD *)(v5 + 32);
  if( v16 <= v12 )
    v17 = 0i64;
  else
    v17 = v16 - v12;
  *(_QWORD *)(v5 + 32) = v17;
  v4[1] += v12;
  MiUnlockWorkingSetExclusive((INT64)Process + 1664, v14);
  MiLogResetPagesCommitRelease();
  KeForceDetachProcess(0i64, 0);
  KeSetEvent(v15, 0);
}

Referenced by:

MmOutSwapProcess