MiMakeVaRangePhysicallyContiguous
NTSTATUS __fastcall MiMakeVaRangePhysicallyContiguous(_MMSUPPORT_INSTANCE *Vm, UINT64 a2, INT64 a3, _MMPFN *a4){
_MMPTE *PteBase;
unsigned __int64 v7;
_MMPTE *v8;
UINT64 v9;
UINT64 v10;
UINT8 v11;
UINT8 v12;
_MMPTE *NextPageTable;
UINT64 v14;
UINT64 v15;
_MMPFN *v16;
__int64 v17;
_MMPFN *v18;
int v19;
UINT64 PageTableFlags;
UINT64 v22;
UINT64 SpinCount;
UINT64 LargePage;
UINT64 v25;
LODWORD(LargePage) = 0;
PteBase = MmGetPteBase();
v7 = (unsigned __int64)PteBase + ((a2 >> 9) & 0x7FFFFFFFF8i64);
v8 = (_MMPTE *)((char *)PteBase + (((a2 + 0x1FFFFF) >> 9) & 0x7FFFFFFFF8i64));
v9 = 0i64;
MiLockWorkingSetShared();
v12 = v11;
if( v7 <= (unsigned __int64)v8 )
{
do
{
if( !v9 )
goto LABEL_37;
if( (v7 & 0xFFF) == 0 )
{
MiUnlockPageTableInternal((INT64)Vm, v9);
v9 = 0i64;
}
if( !v9 )
{
LABEL_37:
LODWORD(PageTableFlags) = 1;
NextPageTable = MiGetNextPageTable((_MMPTE *)v7, v8, 0i64, v12, PageTableFlags, &LargePage, v22);
if( !NextPageTable )
break;
v9 = (UINT64)PteBase + (((unsigned __int64)NextPageTable >> 9) & 0x7FFFFFFFF8i64);
if( NextPageTable != (_MMPTE *)v7 )
break;
}
LODWORD(v14) = MI_READ_PTE_LOCK_FREE(v7);
v25 = v14;
v15 = v14;
if( (v14 & 1) != 0 )
{
MiPteInShadowRange((UINT64)&v25);
v16 = &MmGetPfnDb()[(v15 >> 12) & 0xFFFFFFFFFi64];
}
else
{
if( (v14 & 0x400) != 0 )
break;
if( (v14 & 0x800) == 0 )
break;
v16 = MiLockTransitionLeafPage(v7, 0i64);
if( !v16 )
break;
}
if( !MiCheckContiguityTradeEligible((INT64)v16) )
break;
v17 = a4->u2._bf_0 & 0xFFFFFFFFFi64;
v18 = a4;
if( v17 == 0xFFFFFFFFFi64 )
a4 = 0i64;
else
a4 = &MmGetPfnDb()[v17];
if( (*(_BYTE *)(&v16->u3 + 1) & 7) == 6 )
{
MiTradeActivePage(
v16,
v18,
(VOID *)((__int64)((v7 << 25) - ((_QWORD)MmGetPteBase() << 25)) >> 16),
FlushAllAwakeProcessors);
LODWORD(SpinCount) = 0;
while( _interlockedbittestandset64((volatile signed __int32 *)&v16->u2, 0x3Fui64) )
{
do
KeYieldProcessorEx(&SpinCount);
while( v16->u2._bf_0 < 0 );
}
}
else
{
MiReplaceTransitionPage(v16, v18, 0i64);
}
v16->OriginalPte = ZeroPte;
MiSetOriginalPtePfnFromFreeList(&v16->OriginalPte.u.Long);
MiReturnFreeZeroPage((INT64)v16);
_InterlockedAnd64(&v16->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
if( (v7 & 0x78) == 0 && (LOBYTE(v19) = MiWorkingSetIsContended((INT64)Vm), v19)
|| (unsigned int)KeShouldYieldProcessor() )
{
if( v9 )
{
MiUnlockPageTableInternal((INT64)Vm, v9);
v9 = 0i64;
}
LOBYTE(v10) = v12;
MiUnlockWorkingSetShared(Vm, v10);
MiLockWorkingSetShared();
}
v7 += 8i64;
PteBase = MmGetPteBase();
}
while( v7 <= (unsigned __int64)v8 );
if( v9 )
MiUnlockPageTableInternal((INT64)Vm, v9);
}
LOBYTE(v10) = v12;
MiUnlockWorkingSetShared(Vm, v10);
if( a4 )
MiFreePageChain(a4);
return a4 != 0i64 ? 0xC0000001 : 0;
}Referenced by:
MiProcessVaContiguityInformation