MiRemoveMappedPtes

VOID __stdcall MiRemoveMappedPtes(_MMVIEW *View, _MMSUPPORT_INSTANCE *Ws){
  _MMVIEW v2; 
  UINT64 v3; 
  unsigned __int64 v5; 
  INT64 v6; 
  __int64 v7; 
  unsigned __int64 v8; 
  char *v9; 
  int v10; 
  _MI_CROSS_PARTITION_CHARGES *v11; 
  UINT64 v12; 
  _MMPTE *v13; 
  unsigned __int8 v14; 
  unsigned __int8 v15; 
  _MI_PARTITION *v16; 
  __int64 v17; 
  _MMPTE v18; 
  union {unsigned __int64 Long;volatile unsigned __int64 VolatileLong;_MMPTE_HARDWARE Hard;_MMPTE_PROTOTYPE Proto;_MMPTE_SOFTWARE Soft;_MMPTE_TIMESTAMP TimeStamp;_MMPTE_TRANSITION Trans;_MMPTE_SUBSECTION Subsect;_MMPTE_LIST List;} v19; 
  int v20; 
  __int64 v21; 
  __int64 v22; 
  _SUBSECTION *v23; 
  int v24; 
  _MMVIEW *v25; 
  _BOOL8 v26; 
  UINT8 v27; 
  UINT64 v28; 
  UINT64 v29; 
  int v30; 
  __int64 v31; 
  __int64 v32; 
  _SUBSECTION *SubsectionNode; 
  _MI_PAGE_DELETE_RESULT v34; 
  int v35; 
  int v36; 
  _SUBSECTION *Subsection; 
  UINT64 PteOffset; 
  UINT64 LastPteOffset; 
  _MI_PARTITION *Partition; 
  _MI_CROSS_PARTITION_CHARGES *ChargeInfo; 
  INT64 v42; 
  INT64 v43[2]; 
  __int128 v44; 
  unsigned __int8 v46; 
  __int64 v47; 

  v2 = View[14];
  v3 = 0i64;
  PteOffset = 0i64;
  v47 = 0i64;
  v5 = *((_QWORD *)View + 11);
  v6 = **((_QWORD **)View + 6);
  v7 = *((_QWORD *)View + 4) >> 12;
  Subsection = (_SUBSECTION *)*((_QWORD *)View + 6);
  Partition = *(_MI_PARTITION **)(*(&stru_140C4DB30 + 267) + 8i64 * Ws->PartitionId);
  v42 = v6;
  v8 = (unsigned __int64)MmGetPteBase() + ((v5 >> 9) & 0x7FFFFFFFF8i64);
  *(_OWORD *)v43 = 0i64;
  v9 = 0i64;
  v44 = 0i64;
  v10 = *(_DWORD *)(v6 + 56);
  if( (v10 & 0x400) != 0 )
    v11 = (_MI_CROSS_PARTITION_CHARGES *)&Irp;
  else
    v11 = *(_MI_CROSS_PARTITION_CHARGES **)(*(&stru_140C4DB30 + 267) + 8i64 * (*(_WORD *)(v6 + 60) & 0x3FF));
  ChargeInfo = v11;
  if( (v10 & 0x420) != 0 )
  {
    v12 = 0i64;
    LastPteOffset = 0i64;
  }
  else
  {
    v12 = *((_QWORD *)View + 3) << 12;
    Subsection = MiOffsetToProtos((_CONTROL_AREA *)v6, v12, &PteOffset);
    LastPteOffset = v7 + PteOffset;
  }
  if( (v2 & 0x18) != 24 )
  {
    SubsectionNode = MiLocateSubsectionNode((_CONTROL_AREA *)v6, v12 + (v7 << 12) - 1, 0i64);
    v23 = Subsection;
    MiDecrementLargeSubsections(&Subsection->ControlArea, (INT64)SubsectionNode);
    v22 = 0i64;
    goto LABEL_21;
  }
  MiLockWorkingSetShared();
  v46 = v14;
  v15 = v14;
  if( !v7 )
    goto LABEL_18;
  v16 = Partition;
  v17 = 0i64;
  do
  {
    if( !v9 || (v8 & 0xFFF) == 0 )
    {
      LODWORD(v32) = MiTerminateWsleCluster((INT64)v43);
      v17 += v32;
      if( v9 )
        MiUnlockPageTableInternal((INT64)Ws, (UINT64)v9);
      v9 = (char *)MmGetPteBase() + ((v8 >> 9) & 0x7FFFFFFFF8i64);
      MiLockPageTableInternal((INT64)Ws, (UINT64)v9, 0i64);
    }
    v18.u.Long = *(_QWORD *)v8;
    if( !*(_QWORD *)v8 )
      goto LABEL_15;
    if( (v18.u.Long & 1) != 0 )
    {
      if( *(&stru_140C4DB30 + 654) )
        MI_WSLE_LOG_ACCESS(Ws, (_MMWSLE *)v8, v13);
      MiAppendWsleCluster((INT64)v43, (INT64)Ws, (UINT64 *)v8);
      goto LABEL_15;
    }
    if( (v18.u.Long & 0x400) == 0 )
    {
      if( (v18.u.Long & 0x800) != 0 )
      {
        v34 = MiTryDeleteTransitionPte((_MMPTE *)v8);
        if( v34 == PageChangedState )
          continue;
        if( v34 == PageStillReferenced )
          ++v17;
        v19.Long = ZeroPte.u.Long;
        LOBYTE(v35) = MiPteInShadowRange(v8);
        if( !v35 )
          goto LABEL_14;
LABEL_48:
        if( (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) == 0 || (v19.Long & 1) == 0 )
          goto LABEL_14;
      }
      else
      {
        MiReleasePageFileSpace(v16, v18, 1ui64);
        v19.Long = ZeroPte.u.Long;
        LOBYTE(v36) = MiPteInShadowRange(v8);
        if( !v36 || (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) == 0 || (ZeroPte.u.Long & 1) == 0 )
          goto LABEL_14;
      }
      v19.Long |= 0x8000000000000000ui64;
      goto LABEL_14;
    }
    v19.Long = ZeroPte.u.Long;
    LOBYTE(v20) = MiPteInShadowRange(v8);
    if( v20 )
      goto LABEL_48;
LABEL_14:
    *(union {unsigned __int64 Long;volatile unsigned __int64 VolatileLong;_MMPTE_HARDWARE Hard;_MMPTE_PROTOTYPE Proto;_MMPTE_SOFTWARE Soft;_MMPTE_TIMESTAMP TimeStamp;_MMPTE_TRANSITION Trans;_MMPTE_SUBSECTION Subsect;_MMPTE_LIST List;} *)v8 = (union {unsigned __int64 Long;volatile unsigned __int64 VolatileLong;_MMPTE_HARDWARE Hard;_MMPTE_PROTOTYPE Proto;_MMPTE_SOFTWARE Soft;_MMPTE_TIMESTAMP TimeStamp;_MMPTE_TRANSITION Trans;_MMPTE_SUBSECTION Subsect;_MMPTE_LIST List;})v19.Long;
    v15 = v46;
LABEL_15:
    v8 += 8i64;
    --v7;
    if( (v8 & 0x78) == 0 )
    {
      LOBYTE(v30) = MiWorkingSetIsContended((INT64)Ws);
      if( v30
        || (unsigned int)MiPageTableLockIsContended((__int64)Ws, (UINT64)v9)
        || (unsigned int)KeShouldYieldProcessor() )
      {
        LODWORD(v31) = MiTerminateWsleCluster((INT64)v43);
        v17 += v31;
        MiUnlockPageTableInternal((INT64)Ws, (UINT64)v9);
        MiUnlockWorkingSetShared(Ws, v15);
        v9 = 0i64;
        MiLockWorkingSetShared();
      }
    }
  }
  while( v7 );
  v6 = v42;
  v47 = v17;
LABEL_18:
  LODWORD(v21) = MiTerminateWsleCluster((INT64)v43);
  v22 = v21 + v47;
  if( v9 )
    MiUnlockPageTableInternal((INT64)Ws, (UINT64)v9);
  MiUnlockWorkingSetShared(Ws, v15);
  v23 = Subsection;
LABEL_21:
  v24 = *(_DWORD *)(v6 + 56);
  if( (v24 & 0x20) != 0 || (v24 & 0x400) != 0 )
  {
    v25 = View;
    v23 = 0i64;
    if( (v24 & 0x20) != 0 && (View[14] & 4) != 0 )
      MiReturnCrossPartitionControlAreaCharges(v6);
  }
  else
  {
    v25 = View;
  }
  v26 = *(_QWORD *)(v6 + 64) != 0i64;
  v27 = ExAcquireSpinLockExclusive((INT64 *)(v6 + 72));
  if( v23 )
  {
    LODWORD(v28) = MiRemoveViewsFromSection(v23, LastPteOffset);
    v3 = v28;
  }
  --*(_QWORD *)(v6 + 48);
  --*(_QWORD *)(v6 + 40);
  MiCheckControlArea((_CONTROL_AREA *)v6, v27);
  v29 = *((_QWORD *)v25 + 5);
  if( v29 )
  {
    if( v22 )
      v29 -= v22;
    if( v29 )
      MiReturnCommit(Partition, v29);
  }
  if( v3 )
    MiReturnCrossPartitionSectionCharges(ChargeInfo, v26, v3);
}

Referenced by:

MiRemoveFromSystemSpace