MiDeleteTransitionPte
_MI_PAGE_DELETE_RESULT __stdcall MiDeleteTransitionPte(
_MMPTE *PointerPte,
_MMPFN *Pfn1,
UINT8 PageIrql,
UINT64 ReleasePageFileInfo){
__int64 v6;
UINT64 v7;
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;
__int64 v9;
_MMINPAGE_SUPPORT *v10;
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;} v11;
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;} v12;
__int64 v13;
unsigned __int64 v14;
_MI_PAGE_DELETE_RESULT v15;
int v16;
INT64 v17;
UINT64 v18;
_MMPFN *v19;
__int64 v20;
UINT8 v21;
char v23;
PVOID BugCheckParameter4;
UINT64 v25;
UINT64 SpinCount;
_MI_PARTITION *Partition;
UINT8 v28;
int v29;
v29 = ReleasePageFileInfo;
v28 = PageIrql;
v6 = (unsigned __int128)(((char *)Pfn1 - (char *)MmGetPfnDb()) * (__int128)0x2AAAAAAAAAAAAAABi64) >> 64;
v7 = ((unsigned __int64)v6 >> 63) + (v6 >> 3);
if( (_MMPTE *)(Pfn1->PteLong | 0x8000000000000000ui64) != PointerPte )
KeBugCheckEx(0x1Au, (PVOID)0x402, PointerPte, (PVOID)PointerPte->u.Long, Pfn1->ListEntry.Blink);
v8.Long = (unsigned __int64)Pfn1->OriginalPte.u;
v9 = Pfn1->u4._bf_0 & 0xFFFFFFFFFi64;
v10 = 0i64;
Partition = 0i64;
v11.Long = 0i64;
if( (v8.Long & 0x400) != 0 )
{
if( *(&stru_140C4DB30 + 42) && (v8.Long & 0x10) == 0 )
v8.Long &= ~*(&stru_140C4DB30 + 42);
MiDereferenceControlAreaPfnList(
*(_CONTROL_AREA **)(v8.Hard._bf_0 >> 16),
(_SUBSECTION *)(v8.Hard._bf_0 >> 16),
PageIrql,
2ui64);
v12.Long = (unsigned __int64)Pfn1->OriginalPte.u;
v13 = -2049i64;
if( (v12.Long & 0x400) == 0 )
v13 = -9i64;
v14 = v13 & Pfn1->OriginalPte.u.Long;
if( (v12.Long & 0x400) == 0 )
v14 &= 0xFFFFFFFFFFFFFFF9ui64;
}
else
{
v14 = 0i64;
}
if( Pfn1->u3.ReferenceCount )
{
Pfn1->u2._bf_0 |= 0x4000000000000000ui64;
v23 = *((_BYTE *)&Pfn1->u3 + 2);
if( (v23 & 0x20) != 0 && (v23 & 8) == 0 )
{
v10 = (_MMINPAGE_SUPPORT *)(Pfn1->u1.$976DF529DAC3D73085C9E386D94B91E6::$E228DCF3D8940E384DBC5EFCA756D8B6::_bf_0
- 32);
if( v10->ListHead[0].Flink == v10->ListHead )
v10 = 0i64;
}
v15 = PageStillReferenced;
}
else
{
MiUnlinkPageFromList(Pfn1, 0i64);
if( (*(_DWORD *)(&Pfn1->3 + 1) & 0x400i64) == 0 )
{
v11.Long = MiCapturePageFileInfoInline(&Pfn1->OriginalPte, 0i64, 1ui64).u.Long;
Partition = *(_MI_PARTITION **)(*(&stru_140C4DB30 + 267) + 8 * (((unsigned __int64)Pfn1->u4._bf_0 >> 39) & 0x3FF));
}
v15 = PageInserted;
}
LOBYTE(v16) = MiPteInShadowRange((UINT64)PointerPte);
if( v16 && (KeGetCurrentThread()->ApcState.Process->Flags3 & 0x1000) != 0 && (v14 & 1) != 0 )
v14 |= 0x8000000000000000ui64;
PointerPte->u.Long = v14;
if( v15 == PageInserted )
MiInsertPageInFreeOrZeroedList(v7, 2ui64, v17, v18, (UINT64)BugCheckParameter4, v25);
_InterlockedAnd64(&Pfn1->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
v19 = &MmGetPfnDb()[v9];
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)&v19->u2, 0x3Fui64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( v19->u2._bf_0 < 0 );
}
v20 = v19->u2._bf_0 & 0x3FFFFFFFFFFFFFFFi64;
if( (*(_BYTE *)(&v19->u3 + 1) & 7) != 6 )
KeBugCheckEx(
0x4Eu,
(PVOID)0x99,
(PVOID)(48 * v9 / 48),
(PVOID)(*(_BYTE *)(&v19->u3 + 1) & 7),
(PVOID)(v19->u2._bf_0 & 0x3FFFFFFFFFFFFFFFi64));
v19->u2._bf_0 ^= ((v20 - 1) ^ v19->u2._bf_0) & 0x3FFFFFFFFFFFFFFFi64;
if( v20 == 1 )
MiPfnShareCountIsZero(v19, 0i64);
_InterlockedAnd64(&v19->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
v21 = v28;
if( v28 != 17 )
__writecr8(v28);
if( v10 )
MiInvalidateCollidedIos(v10);
if( v11.Long && v29 )
MiReleasePageFileInfo(Partition, (_MMPTE)v11.Long, v21 == 17);
return v15;
}Referenced by:
MiDecommitPages
MiDeletePerSessionProtos
MiDeleteSubsectionPages
MiDeleteSystemPagableVm
MiPurgeFileOnlyPfn
MiTryDeleteTransitionPte
MiWalkEntireImage
MmPurgeSection