MiMakeVaRangePhysicallyContiguous
INT64 __fastcall MiMakeVaRangePhysicallyContiguous(INT64 a1, UINT64 a2, INT64 a3, _MMPFN *a4){
_MMPTE *PteBase;
unsigned __int64 v7;
unsigned __int64 v8;
UINT64 v9;
char v10;
unsigned __int64 v11;
INT64 v12;
unsigned __int64 v13;
_MMPFN *v14;
__int64 v15;
_MMPFN *v16;
INT64 v17;
INT64 v18;
INT64 v19;
INT64 a5;
INT64 v22;
INT64 v23;
INT64 v24;
INT64 v25;
INT64 v26;
INT64 v27;
INT64 v28;
UINT64 SpinCount;
int a6;
UINT64 v31;
a6 = 0;
PteBase = MmGetPteBase();
v7 = (unsigned __int64)PteBase + ((a2 >> 9) & 0x7FFFFFFFF8i64);
v8 = (unsigned __int64)PteBase + (((a2 + 0x1FFFFF) >> 9) & 0x7FFFFFFFF8i64);
v9 = 0i64;
v10 = MiLockWorkingSetShared(a1);
if( v7 <= v8 )
{
do
{
if( !v9 )
goto LABEL_37;
if( (v7 & 0xFFF) == 0 )
{
MiUnlockPageTableInternal(a1, v9);
v9 = 0i64;
}
if( !v9 )
{
LABEL_37:
MiGetNextPageTable(v7, v8, 0i64, v10, 1, &a6);
if( !v11 )
break;
v9 = (UINT64)PteBase + ((v11 >> 9) & 0x7FFFFFFFF8i64);
if( v11 != v7 )
break;
}
v12 = MI_READ_PTE_LOCK_FREE(v7);
v31 = v12;
v13 = v12;
if( (v12 & 1) != 0 )
{
MiPteInShadowRange((UINT64)&v31);
v14 = (_MMPFN *)((char *)MmGetPfnDb() + 48 * ((v13 >> 12) & 0xFFFFFFFFFi64));
}
else
{
if( (v12 & 0x400) != 0 )
break;
if( (v12 & 0x800) == 0 )
break;
v14 = MiLockTransitionLeafPage((_MMPTE *)v7, 0i64);
if( !v14 )
break;
}
if( !(unsigned int)MiCheckContiguityTradeEligible((INT64)v14) )
break;
v15 = *((_QWORD *)a4 + 3) & 0xFFFFFFFFFi64;
v16 = a4;
if( v15 == 0xFFFFFFFFFi64 )
a4 = 0i64;
else
a4 = (_MMPFN *)((char *)MmGetPfnDb() + 48 * v15);
if( (*((_BYTE *)v14 + 34) & 7) == 6 )
{
MiTradeActivePage(
(ULONG_PTR)v14,
(__int64)v16,
(__int64)((v7 << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16,
1u,
0,
v22);
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)v14 + 6, 0x3Fui64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( *((__int64 *)v14 + 3) < 0 );
}
}
else
{
MiReplaceTransitionPage((ULONG_PTR)v14, (__int64)v16, 0, 0i64);
}
*((_QWORD *)v14 + 2) = ZeroPte;
MiSetOriginalPtePfnFromFreeList((UINT64 *)v14 + 2);
MiReturnFreeZeroPage((INT64)v14);
_InterlockedAnd64((volatile signed __int64 *)v14 + 3, 0x7FFFFFFFFFFFFFFFui64);
if( (v7 & 0x78) == 0 && MiWorkingSetIsContended(a1) || KeShouldYieldProcessor() )
{
if( v9 )
{
MiUnlockPageTableInternal(a1, v9);
v9 = 0i64;
}
MiUnlockWorkingSetShared(a1, v10);
MiLockWorkingSetShared(a1);
}
v7 += 8i64;
PteBase = MmGetPteBase();
}
while( v7 <= v8 );
if( v9 )
MiUnlockPageTableInternal(a1, v9);
}
MiUnlockWorkingSetShared(a1, v10);
if( a4 )
MiFreePageChain((INT64)a4, v17, v18, v19, a5, v22, v23, v24, v25, v26, v27, v28);
return a4 != 0i64 ? 0xC0000001 : 0;
}Referenced by:
MiProcessVaContiguityInformation