MiPurgeFileOnlyPfn
NTSTATUS __stdcall MiPurgeFileOnlyPfn(INT64 a1){
__int64 v1;
__int64 v2;
__int64 v3;
_MMPTE *v4;
_MMPFN *v5;
ULONG_PTR v6;
_MMPFN *v7;
unsigned __int64 v8;
void *BugCheckParameter4;
NTSTATUS result;
_MMPFN *PfnDb;
char v12;
__int128 v13[2];
__int64 v14;
UINT8 PageIrql;
v1 = *(_QWORD *)(a1 + 16);
memset(v13, 0, sizeof(v13));
v14 = 0i64;
if( *(&stru_140C4DB30 + 42) && (v1 & 0x10) == 0 )
v1 &= ~*(&stru_140C4DB30 + 42);
v2 = *(_QWORD *)(a1 + 8);
v3 = v1 >> 16;
PageIrql = 17;
v4 = (_MMPTE *)(v2 | 0x8000000000000000ui64);
MiChangingSubsectionProtos(v3);
v5 = MiCheckProtoPtePageState(v4, &PageIrql);
v6 = (unsigned int)v5;
if( v5 )
{
v7 = MiLockLeafPage(v4, 0i64);
if( v7 )
{
LODWORD(v8) = MI_READ_PTE_LOCK_FREE((INT64)v4);
BugCheckParameter4 = (void *)v8;
if( (v8 & 1) != 0 )
goto LABEL_7;
if( *(&stru_140C4DB30 + 42) )
{
if( (v8 & 0x10) != 0 )
v8 &= ~0x10ui64;
else
v8 &= ~*(&stru_140C4DB30 + 42);
}
PfnDb = MmGetPfnDb();
if( v7 != &PfnDb[(v8 >> 12) & 0xFFFFFFFFFi64] )
goto LABEL_7;
if( (*(_DWORD *)(&v7->3 + 1) & 0x401) != 1024i64 || (_MMPTE *)(v7->PteLong | 0x8000000000000000ui64) != v4 )
KeBugCheckEx(0xDEu, (PVOID)2, v4, v7->ListEntry.Blink, BugCheckParameter4);
v12 = *((_BYTE *)&v7->u3 + 2);
if( (v12 & 8) != 0 )
{
LABEL_7:
_InterlockedAnd64(&v7->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
}
else
{
if( (v12 & 0x10) != 0 )
{
if( *((char *)&v7->u3 + 3) >= 0 )
{
MiPersistPage(v7 - PfnDb);
v12 = *((_BYTE *)&v7->u3 + 2);
}
*((_BYTE *)&v7->u3 + 2) = v12 & 0xEF;
}
MiDeleteTransitionPte(v4, v7, 2u, 1ui64);
}
}
}
if( PageIrql != 17 )
MiUnlockProtoPoolPage(v6, PageIrql);
MiSubsectionProtosCreated((_SUBSECTION *)v3, (_MI_CONTROL_AREA_WAIT_BLOCK *)v13);
return result;
}Referenced by:
MiPurgeBadFileOnlyPages