MiPurgeSubsection
NTSTATUS __stdcall MiPurgeSubsection(_MSUBSECTION *MappedSubsection){
unsigned __int64 SubsectionBase;
__int64 PtesInSubsection;
_CONTROL_AREA *ControlArea;
UINT8 v5;
NTSTATUS v6;
_MMPFN *v7;
_MMPFN *v8;
unsigned __int64 v9;
UINT64 v10;
unsigned __int64 v11;
__int64 v12;
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;} v13;
int v14;
INT64 v15;
UINT64 v16;
unsigned __int64 v17;
PVOID BugCheckParameter4;
UINT64 v20;
UINT8 PageIrql;
UINT64 SpinCount;
_CONTROL_AREA *v23;
unsigned __int64 v24;
SubsectionBase = (unsigned __int64)MappedSubsection->Core.SubsectionBase;
PtesInSubsection = MappedSubsection->Core.PtesInSubsection;
ControlArea = MappedSubsection->Core.ControlArea;
v5 = 17;
v23 = MappedSubsection->Core.ControlArea;
v6 = 1;
PageIrql = 17;
v7 = 0i64;
v24 = SubsectionBase + 8 * PtesInSubsection;
if( SubsectionBase >= v24 )
return v6;
while( (SubsectionBase & 0xFFF) == 0 || v5 == 17 )
{
if( v5 != 17 )
MiUnlockProtoPoolPage((ULONG_PTR)v7, v5);
v7 = MiCheckProtoPtePageState((VOID *)SubsectionBase, &PageIrql);
if( v7 )
{
ExAcquireSpinLockExclusiveAtDpcLevel((INT64 *)&ControlArea->ControlAreaLock);
if( MappedSubsection->NumberOfMappedViews != 1 || (MappedSubsection->Core.u.LongFlags & 1) != 0 )
{
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)&ControlArea->ControlAreaLock);
MiUnlockProtoPoolPage((ULONG_PTR)v7, PageIrql);
return 0;
}
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)&ControlArea->ControlAreaLock);
v5 = PageIrql;
break;
}
SubsectionBase = (SubsectionBase & 0xFFFFFFFFFFFFF000ui64) + 4096;
LABEL_30:
v5 = PageIrql;
LABEL_31:
if( SubsectionBase >= v24 )
goto LABEL_35;
}
v8 = MiLockLeafPage((_MMPTE *)SubsectionBase, 0i64);
LODWORD(v9) = MI_READ_PTE_LOCK_FREE(SubsectionBase);
v11 = v9;
if( !v8 )
{
if( (v9 & 0xC00) == 0 && v9 )
KeBugCheckEx(0xDEu, (PVOID)4, MappedSubsection, (PVOID)SubsectionBase, (PVOID)v9);
SubsectionBase += 8i64;
goto LABEL_31;
}
if( (v9 & 1) == 0 )
{
if( *(&stru_140C4DB30 + 42) )
{
if( (v9 & 0x10) != 0 )
v11 = v9 & 0xFFFFFFFFFFFFFFEFui64;
else
v11 = ~*(&stru_140C4DB30 + 42) & v9;
}
v12 = (v11 >> 12) & 0xFFFFFFFFFi64;
v8 = &MmGetPfnDb()[v12];
if( (*(_BYTE *)(&v8->u3 + 1) & 0x10) == 0 && !v8->u3.ReferenceCount )
{
MiDereferenceControlAreaPfnList(ControlArea, &MappedSubsection->Core, v10, 2ui64);
v13.Long = (unsigned __int64)v8->OriginalPte.u;
LOBYTE(v14) = MiPteInShadowRange(SubsectionBase);
if( v14 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (v13.Long & 1) != 0 )
v13.Long |= 0x8000000000000000ui64;
*(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;} *)SubsectionBase = (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;})v13.Long;
MiUnlinkPageFromList(v8, 0i64);
MiInsertPageInFreeOrZeroedList(v12, 2ui64, v15, v16, (UINT64)BugCheckParameter4, v20);
_InterlockedAnd64(&v8->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)&v7->u2, 0x3Fui64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( v7->u2._bf_0 < 0 );
}
MiDecrementShareCount(v7);
_InterlockedAnd64(&v7->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
ControlArea = v23;
SubsectionBase += 8i64;
goto LABEL_30;
}
}
_InterlockedAnd64(&v8->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
v5 = PageIrql;
v6 = 0;
LABEL_35:
if( v5 != 17 )
MiUnlockProtoPoolPage((ULONG_PTR)v7, v5);
if( !v6 )
{
v17 = (unsigned __int8)ExAcquireSpinLockExclusive((INT64 *)&ControlArea->ControlAreaLock);
MappedSubsection->Core.u.SubsectionFlags._bf_0 |= 1u;
ExReleaseSpinLockExclusiveFromDpcLevel((INT64 *)&ControlArea->ControlAreaLock);
__writecr8(v17);
}
return v6;
}Referenced by:
MiDeleteCachedSubsection