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