MiActivePageClaimCandidate
UINT64 __stdcall MiActivePageClaimCandidate(_MI_PARTITION *Partition, _MMPFN *Pfn1, UINT64 PageLockHeld, UINT64 Pass){
int v4;
UINT64 v7;
__int64 v8;
__int64 v9;
unsigned __int64 v10;
unsigned __int64 v11;
_MMPFN *BaseResidentPage;
int PfnPageSizeIndex;
__int64 v14;
unsigned int v15;
__int64 *v16;
const signed __int64 **v17;
UNICODE_STRING *v18;
UINT8 v19;
WCHAR *v20;
int v21;
INT64 v22;
__int64 v23;
unsigned __int64 v24;
unsigned __int64 v25;
unsigned __int64 PteBase;
unsigned __int64 v27;
unsigned __int64 v28;
__int16 v29;
unsigned __int64 PdeBase;
unsigned __int64 v31;
int v32;
__int64 v33;
unsigned __int64 v34;
unsigned __int64 v35;
INT64 v37;
INT64 v38;
LODWORD(v38) = Pass;
v4 = PageLockHeld;
v7 = 1i64;
v8 = *((_QWORD *)Pfn1 + 1);
v9 = (unsigned __int128)((Pfn1 - MmGetPfnDb()) * (__int128)0x2AAAAAAAAAAAAAABi64) >> 64;
v10 = ((unsigned __int64)v9 >> 63) + (v9 >> 3);
v11 = v8 | 0x8000000000000000ui64;
if( (*((_BYTE *)Pfn1 + 35) & 8) == 0 )
{
if( (*((_QWORD *)Pfn1 + 5) & 0x1000000000i64) == 0 )
goto LABEL_9;
if( (_DWORD)PageLockHeld == 1 )
{
BaseResidentPage = MiGetBaseResidentPage(Pfn1);
PfnPageSizeIndex = MiGetPfnPageSizeIndex((INT64)BaseResidentPage);
if( (_MMPFN *)v14 != Pfn1 )
_InterlockedAnd64((volatile signed __int64 *)(v14 + 24), 0x7FFFFFFFFFFFFFFFui64);
}
else
{
LODWORD(v37) = 0;
LODWORD(v38) = 0;
PfnPageSizeIndex = MiGetPfnPageSizeIndexUnsynchronized((INT64)Pfn1, &v37, &v38);
}
if( PfnPageSizeIndex == -1 )
{
LABEL_9:
if( *(_MI_PARTITION **)(qword_140C4E388 + 8 * ((*((_QWORD *)Pfn1 + 5) >> 39) & 0x3FFi64)) == Partition )
{
if( *((_BYTE *)Partition + 4830) )
{
v15 = 0;
v16 = MiLargePageSizes;
v17 = (const signed __int64 **)((char *)Partition + 5064);
while( !*v17 || !_bittest64(v17[1], v10 / *v16) )
{
++v15;
v17 += 2;
++v16;
if( v15 >= 2 )
goto LABEL_15;
}
return MiLargePageSizes[v15];
}
else
{
LABEL_15:
if( !MiIsPfnFromSlabAllocation((INT64)Pfn1) )
{
LOBYTE(v21) = MI_PFN_IS_PROTO((UNICODE_STRING *)Pfn1, v18, v19, v20);
if( v21 )
{
v23 = *((_QWORD *)Pfn1 + 3);
if( (v23 & 0x4000000000000000i64) == 0
&& v11 != ProtoPte
&& v11 != qword_140C4DB80
&& (v4 != 1 || !MiIsPfnFileOnly(v22)) )
{
v24 = *((unsigned __int16 *)Pfn1 + 16);
if( (unsigned int)v24 <= 1
&& v24 <= (v23 & 0x3FFFFFFFFFFFFFFFui64)
&& (*(_BYTE *)Pfn1 & 1) != 0
&& ((*((_QWORD *)Pfn1 + 5) & 0x1000000000i64) != 0 || *((__int64 *)Pfn1 + 1) <= 0) )
{
return 0i64;
}
}
}
else if( v11 != -8i64 && (unsigned int)MiGetSystemRegionType(v11) != 5 )
{
v25 = *((_QWORD *)Pfn1 + 5);
if( ((v25 >> 60) & 7) != 1 && (v25 & 0xFFFFFFFFFi64) != 0xFFFFFFFFDi64 )
{
PteBase = (unsigned __int64)MmGetPteBase();
if( v11 >= PteBase && v11 <= (unsigned __int64)MmGetPteLimit() )
{
v27 = (__int64)((v11 << 25) - (PteBase << 25)) >> 16;
if( (*(_BYTE *)Pfn1 & 1) != 0 )
{
if( !PsInitialSystemProcess || v10 != *((_QWORD *)PsInitialSystemProcess + 5) >> 12 )
{
PdeBase = (unsigned __int64)MmGetPdeBase();
v31 = PdeBase + 536870904;
v32 = 0;
while( v11 < PdeBase || v11 > v31 )
{
PdeBase = PteBase + ((PdeBase >> 9) & 0x7FFFFFFFF8i64);
v31 = PteBase + ((v31 >> 9) & 0x7FFFFFFFF8i64);
if( (unsigned int)++v32 >= 3 )
{
if( (v25 & 0xFFFFFFFFFi64) == v10 )
{
v7 = 0i64;
if( (_MMPTE *)v11 != MmGetPxeSelfRef() || *((_WORD *)Pfn1 + 16) > 1u )
return 1i64;
}
else
{
v33 = *((_QWORD *)Pfn1 + 3);
v34 = v33 & 0x3FFFFFFFFFFFFFFFi64;
if( (v33 & 0x3FFFFFFFFFFFFFFFui64) <= 1 )
{
if( (v33 & 0xFFFFFFFFFi64) != 0
&& (v27 < qword_140C4DB20 || v27 >= qword_140C4DB20 + 4096) )
{
v35 = *((unsigned __int16 *)Pfn1 + 16);
if( (unsigned int)v35 <= 1 && v35 <= v34 )
return 0i64;
}
}
else if( (unsigned int)MiGetSystemRegionType(v27) == 6 )
{
if( *((_WORD *)Pfn1 + 16) <= 1u && v34 < 0x10000 )
return 0i64;
}
else if( (unsigned int)MiHyperPage((INT64)Pfn1) && *((_WORD *)Pfn1 + 16) <= 1u )
{
return 0i64;
}
}
return v7;
}
}
if( *((_WORD *)Pfn1 + 16) <= 1u && (*((_QWORD *)Pfn1 + 3) & 0x3FFFFFFFFFFFFFFFui64) < 0x10000 )
return 0i64;
}
}
else if( (unsigned int)MiHyperPage((INT64)Pfn1) )
{
v28 = *((unsigned __int16 *)Pfn1 + 16);
if( (unsigned int)v28 <= 1 && v28 <= (*((_QWORD *)Pfn1 + 3) & 0x3FFFFFFFFFFFFFFFui64) )
return 0i64;
}
else
{
if( MiVaIsPageFileHash(*(_QWORD *)(qword_140C4E388 + 8 * ((v25 >> 39) & 0x3FF)), v27) )
return 0i64;
if( (unsigned int)MiGetSystemRegionType(v27) == 5
&& (*((_BYTE *)Pfn1 + 35) & 0x10) == 0
&& *((_WORD *)Pfn1 + 16) <= 1u
&& (MiFlags & 0x800) == 0 )
{
if( v4 != 1 )
return 0i64;
v29 = MI_READ_PTE_LOCK_FREE(v11);
if( (v29 & 1) != 0 && (v29 & 0x200) == 0 )
return 0i64;
}
}
}
}
}
}
}
}
}
else
{
return MiLargePageSizes[PfnPageSizeIndex];
}
}
return v7;
}Referenced by:
MiCheckContiguityTradeEligible
MiPfnsWorthTrying
MiTradePage