MiTrimSharedPage
_MI_STEAL_TYPE __stdcall MiTrimSharedPage(_MMPFN *Pfn1, UINT8 PageIrql, UINT64 Flags){
_LIST_ENTRY *Blink;
unsigned __int64 v4;
_MMPTE *v6;
unsigned int v7;
int v8;
int v9;
int v10;
int v11;
unsigned int v12;
_CONTROL_AREA *v13;
_CONTROL_AREA *ControlArea;
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;} v15;
__int64 v16;
_MI_CONTROL_AREA_WAIT_BLOCK *v17;
_SUBSECTION *v19;
_MI_CONTROL_AREA_WAIT_BLOCK *v20;
_MI_FLUSH_RANGE FlushRange[2];
_MMPTE *v22;
_MMPTE *v23;
__int64 v24;
__int64 v25;
int v26;
int v27;
_MI_CONTROL_AREA_WAIT_BLOCK *Gate;
INT64 v29;
Blink = Pfn1->ListEntry.Blink;
v4 = PageIrql;
v27 = 0;
v6 = (_MMPTE *)((unsigned __int64)Blink | 0x8000000000000000ui64);
Gate = 0i64;
v29 = 0i64;
v7 = ((unsigned int)Flags >> 18) & 1 | 2;
if( (Flags & 0x80000) == 0 )
v7 = ((unsigned int)Flags >> 18) & 1;
v8 = v7 | 4;
if( (Flags & 0x20000) == 0 )
v8 = v7;
v9 = v8 | 8;
if( (Flags & 0x10000000) == 0 )
v9 = v8;
v10 = v9 | 0x10;
v11 = Flags & 0x800000;
if( (Flags & 0x800000) == 0 )
v10 = v9;
v12 = v10 | 0x40;
if( (Flags & 0x3000000) == 0 )
v12 = v10;
if( (*(_DWORD *)(&Pfn1->3 + 1) & 0x400i64) == 0 )
{
_InterlockedAnd64(&Pfn1->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
__writecr8(v4);
v19 = MiReferencePfBackedSection(v6);
v16 = (__int64)v19;
if( v19 )
{
ControlArea = v19->ControlArea;
if( !v11 || ControlArea->u.Flags._bf_0 >= 0 || MiClusterVadFull(Pfn1, v19) != 1 )
goto LABEL_17;
v20 = MiDecrementModifiedWriteCount(ControlArea, 0i64);
if( v20 )
MiReleaseControlAreaWaiters(v20);
}
MiLockPageInline(Pfn1);
return 0;
}
LODWORD(v13) = MiPreventControlAreaDeletion((INT64)Pfn1, 0i64, &v29, (INT64 **)&Gate);
ControlArea = v13;
if( !v13 )
return 0;
v15.Long = (unsigned __int64)Pfn1->OriginalPte.u;
if( *(&stru_140C4DB30 + 42) && (v15.Long & 0x10) == 0 )
v15.Long &= ~*(&stru_140C4DB30 + 42);
v16 = v15.Hard._bf_0 >> 16;
_InterlockedAnd64(&Pfn1->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
__writecr8(v4);
MiReleaseControlAreaWaiters(Gate);
LABEL_17:
v26 = 0;
*(_QWORD *)FlushRange = ControlArea;
v22 = v6;
v23 = v6;
v24 = v16;
v25 = v16;
if( MiTrimSection(FlushRange, 1ui64, v12) || (*(_BYTE *)(&Pfn1->u3 + 1) & 7) == 6 )
MiTrimSection(FlushRange, 1ui64, v12);
if( v29 )
MiDecrementSubsection((PVOID)v29);
v17 = MiDecrementModifiedWriteCount(ControlArea, 0i64);
if( v17 )
MiReleaseControlAreaWaiters(v17);
MiLockPageInline(Pfn1);
if( (*(_BYTE *)(&Pfn1->u3 + 1) & 7) != 6 )
return 2;
return 0;
}Referenced by:
MiMarkFileOnlyPfnBad
MiTradePage
MiWalkEntireImage