MiRemoveMappedPtes
void __fastcall MiRemoveMappedPtes(__int64 a1, __int64 a2){
int v2;
__int64 v3;
int v4;
unsigned __int64 v6;
INT64 v7;
__int64 v8;
unsigned __int64 v9;
char *v10;
int v11;
volatile INT64 *v12;
UINT64 v13;
UINT8 v14;
_MI_PARTITION *v15;
__int64 v16;
UINT64 v17;
INT64 v18;
INT64 v19;
ULONG_PTR v20;
int v21;
__int64 v22;
BOOL v23;
KIRQL v24;
UINT64 v25;
INT64 v26;
INT64 v27;
int v28;
_SUBSECTION *SubsectionNode;
int v30;
__int64 *BugCheckParameter2;
UINT64 PteOffset;
CHAR a7[8];
_MI_PARTITION *Partition;
volatile INT64 *a1a;
INT64 v36;
INT64 v37[2];
__int128 v38;
UINT8 v40;
unsigned int v41;
__int64 v42;
v2 = *(_DWORD *)(a1 + 56);
v3 = 0i64;
v4 = 4;
PteOffset = 0i64;
v42 = 0i64;
if( (v2 & 4) != 0 )
v4 = 24;
v6 = *(_QWORD *)(a1 + 88);
v7 = **(_QWORD **)(a1 + 48);
v41 = v4;
v8 = *(_QWORD *)(a1 + 32) >> 12;
BugCheckParameter2 = *(__int64 **)(a1 + 48);
Partition = *(_MI_PARTITION **)(qword_140C4E388 + 8i64 * *(unsigned __int16 *)(a2 + 174));
v36 = v7;
v9 = (unsigned __int64)MmGetPteBase() + ((v6 >> 9) & 0x7FFFFFFFF8i64);
*(_OWORD *)v37 = 0i64;
v10 = 0i64;
v38 = 0i64;
v11 = *(_DWORD *)(v7 + 56);
if( (v11 & 0x400) != 0 )
v12 = (volatile INT64 *)&MiSystemPartition;
else
v12 = *(volatile INT64 **)(qword_140C4E388 + 8i64 * (*(_WORD *)(v7 + 60) & 0x3FF));
a1a = v12;
if( (v11 & 0x420) != 0 )
{
v13 = 0i64;
*(_QWORD *)a7 = 0i64;
}
else
{
v13 = *(_QWORD *)(a1 + 24) << 12;
BugCheckParameter2 = (__int64 *)MiOffsetToProtos((_CONTROL_AREA *)v7, v13, &PteOffset);
*(_QWORD *)a7 = v8 + PteOffset;
}
if( (v2 & 0x18) != 24 )
{
SubsectionNode = MiLocateSubsectionNode((_CONTROL_AREA *)v7, v13 + (v8 << 12) - 1, 0i64);
v20 = (ULONG_PTR)BugCheckParameter2;
MiDecrementLargeSubsections(BugCheckParameter2, (__int64)SubsectionNode);
v19 = 0i64;
goto LABEL_23;
}
v40 = MiLockWorkingSetShared(a2);
v14 = v40;
if( !v8 )
goto LABEL_20;
v15 = Partition;
v16 = 0i64;
do
{
if( !v10 || (v9 & 0xFFF) == 0 )
{
v16 += MiTerminateWsleCluster((INT64)v37);
if( v10 )
MiUnlockPageTableInternal(a2, (UINT64)v10);
v10 = (char *)MmGetPteBase() + ((v9 >> 9) & 0x7FFFFFFFF8i64);
MiLockPageTableInternal(a2, (UINT64)v10, 0i64);
}
v17 = *(_QWORD *)v9;
if( *(_QWORD *)v9 )
{
if( (v17 & 1) != 0 )
{
if( (_DWORD)dword_140C4E568 )
MI_WSLE_LOG_ACCESS(a2, v9);
MiAppendWsleCluster((INT64)v37, a2, (UINT64 *)v9);
}
else
{
if( (v17 & 0x400) != 0 )
{
v18 = ZeroPte;
}
else if( (v17 & 0x800) != 0 )
{
v30 = MiTryDeleteTransitionPte((UINT64 *)v9);
if( v30 == 1 )
continue;
if( v30 == 3 )
++v16;
v18 = ZeroPte;
}
else
{
MiReleasePageFileSpace(v15, v17, 1i64);
v18 = ZeroPte;
}
*(_QWORD *)v9 = v18;
v14 = v40;
}
}
v9 += 8i64;
--v8;
if( (v9 & 0x78) == 0 )
{
if( MiWorkingSetIsContended(a2)
|| (MiPageTableLockIsContended(a2, (UINT64)v10, v26, v27, (INT64)BugCheckParameter2, PteOffset, a7[0]), v28)
|| KeShouldYieldProcessor() )
{
v16 += MiTerminateWsleCluster((INT64)v37);
MiUnlockPageTableInternal(a2, (UINT64)v10);
MiUnlockWorkingSetShared(a2, v14);
v10 = 0i64;
MiLockWorkingSetShared(a2);
}
}
}
while( v8 );
v7 = v36;
v42 = v16;
LABEL_20:
v19 = MiTerminateWsleCluster((INT64)v37) + v42;
if( v10 )
MiUnlockPageTableInternal(a2, (UINT64)v10);
MiUnlockWorkingSetShared(a2, v14);
v20 = (ULONG_PTR)BugCheckParameter2;
LABEL_23:
v21 = *(_DWORD *)(v7 + 56);
if( (v21 & 0x20) != 0 || (v21 & 0x400) != 0 )
{
v22 = a1;
v20 = 0i64;
if( (v21 & 0x20) != 0 && (*(_BYTE *)(a1 + 56) & 4) != 0 )
MiReturnCrossPartitionControlAreaCharges(v7);
}
else
{
v22 = a1;
}
v23 = *(_QWORD *)(v7 + 64) != 0i64;
v24 = ExAcquireSpinLockExclusive((PEX_SPIN_LOCK)(v7 + 72));
if( v20 )
v3 = MiRemoveViewsFromSection(v20, *(unsigned __int64 *)a7, v41);
--*(_QWORD *)(v7 + 48);
--*(_QWORD *)(v7 + 40);
MiCheckControlArea((_CONTROL_AREA *)v7, v24);
v25 = *(_QWORD *)(v22 + 40);
if( v25 )
{
if( v19 )
v25 -= v19;
if( v25 )
MiReturnCommit(Partition, v25);
}
if( v3 )
MiReturnCrossPartitionSectionCharges(a1a, v23, v3);
}Referenced by:
MiRemoveFromSystemSpace