MiQueryVaPhysicalContiguity
NTSTATUS __stdcall MiQueryVaPhysicalContiguity(INT64 a1, UINT64 a2, UINT64 a3, INT64 a4){
_MMSUPPORT_INSTANCE *v4;
__int64 v5;
_MMPTE *PteBase;
unsigned __int64 v7;
unsigned __int64 v8;
UINT64 v9;
int v10;
int v11;
NTSTATUS v12;
int v13;
UINT64 v14;
UINT8 v15;
UINT8 v16;
_MMPTE *v17;
__int64 v18;
_MMPTE *NextPageTable;
_MMPTE *v20;
unsigned int v21;
unsigned __int64 v22;
unsigned __int64 v23;
UINT64 v24;
UINT64 v25;
__int64 v26;
unsigned __int64 v27;
__int64 v28;
__int16 v29;
__int64 v30;
__int64 v31;
int v32;
UINT64 v33;
UINT64 v34;
_MMPFN *v35;
bool v36;
__int64 v37;
int v38;
UINT64 PageTableFlags;
UINT64 v41;
UINT64 v42;
unsigned __int64 v43;
unsigned __int64 v44;
__int64 v45;
__int64 v46;
UINT64 LargePage;
UINT64 WsIrql;
int v50;
v50 = a4;
LODWORD(LargePage) = 0;
v4 = (_MMSUPPORT_INSTANCE *)a1;
v5 = (unsigned int)a3;
PteBase = MmGetPteBase();
v46 = MiLargePageSizes[v5];
v7 = (unsigned __int64)PteBase + ((a2 >> 9) & 0x7FFFFFFFF8i64);
v45 = -1i64;
v8 = (unsigned __int64)PteBase + ((((v46 << 12) + a2 - 1) >> 9) & 0x7FFFFFFFF8i64);
v9 = 0i64;
v44 = v8;
v43 = 0i64;
v10 = 0;
LODWORD(v41) = 0;
v11 = 0;
v12 = 1;
v13 = 0;
HIDWORD(v41) = a4 & 1;
MiLockWorkingSetShared();
LOBYTE(WsIrql) = v15;
v16 = v15;
if( v7 > v8 )
goto LABEL_50;
v17 = (_MMPTE *)v8;
while( 1 )
{
v18 = 1i64;
if( v9 )
{
if( (v7 & 0xFFF) == 0 )
{
MiUnlockPageTableInternal((INT64)v4, v9);
v16 = WsIrql;
v9 = 0i64;
}
if( v9 )
goto LABEL_21;
v17 = (_MMPTE *)v44;
}
LODWORD(PageTableFlags) = 1;
NextPageTable = MiGetNextPageTable((_MMPTE *)v7, v17, 0i64, v16, PageTableFlags, &LargePage, v41);
if( !NextPageTable )
break;
v20 = MmGetPteBase();
v21 = LargePage;
v9 = (UINT64)v20 + (((unsigned __int64)NextPageTable >> 9) & 0x7FFFFFFFF8i64);
if( (_DWORD)LargePage )
{
v43 = (unsigned __int64)v20 + (((unsigned __int64)NextPageTable >> 9) & 0x7FFFFFFFF8i64);
v22 = v43;
if( (unsigned int)LargePage > 1 )
{
v14 = (unsigned int)(LargePage - 1);
do
{
v9 = (UINT64)v20 + ((v9 >> 9) & 0x7FFFFFFFF8i64);
v22 = (unsigned __int64)v20 + ((v22 >> 9) & 0x7FFFFFFFF8i64);
--v14;
}
while( v14 );
v43 = v22;
}
v9 = (UINT64)v20 + ((v9 >> 9) & 0x7FFFFFFFF8i64);
}
else
{
v22 = v43;
}
if( NextPageTable != (_MMPTE *)v7 )
break;
if( (_DWORD)LargePage )
{
v23 = (__int64)((v7 << 25) - ((_QWORD)v20 << 25)) >> 16;
LODWORD(v24) = MI_READ_PTE_LOCK_FREE(v22);
v42 = v24;
v25 = v24;
MiPteInShadowRange((UINT64)&v42);
v26 = (v25 >> 12) & 0xFFFFFFFFFi64;
v27 = v23 >> 12;
v28 = v21;
do
{
v29 = v27;
v27 >>= 9;
v30 = v18 * (v29 & 0x1FF);
v18 <<= 9;
v26 += v30;
--v28;
}
while( v28 );
v13 = 1;
v31 = v18 - (v26 & (v18 - 1));
goto LABEL_32;
}
LABEL_21:
v32 = 0;
LODWORD(v33) = MI_READ_PTE_LOCK_FREE(v7);
v42 = v33;
v34 = v33;
if( (v33 & 1) != 0 )
{
MiPteInShadowRange((UINT64)&v42);
v26 = (v34 >> 12) & 0xFFFFFFFFFi64;
v35 = &MmGetPfnDb()[v26];
}
else
{
if( (v33 & 0x400) != 0
|| (v33 & 0x800) == 0
|| (v50 & 2) != 0
|| (v35 = MiLockTransitionLeafPage(v7, 0i64)) == 0i64 )
{
v11 = 1;
LABEL_46:
v4 = (_MMSUPPORT_INSTANCE *)a1;
goto LABEL_47;
}
v32 = 1;
v26 = v35 - MmGetPfnDb();
}
if( !MiCheckContiguityTradeEligible((INT64)v35) )
v13 = 1;
v36 = v32 == 0;
v31 = 1i64;
if( !v36 )
_InterlockedAnd64(&v35->u2.Lock, 0x7FFFFFFFFFFFFFFFui64);
LABEL_32:
if( v45 == -1 )
v36 = ((v46 - 1) & v26) == 0;
else
v36 = v45 == v26;
if( !v36 )
{
LODWORD(v41) = 1;
if( !HIDWORD(v41) )
goto LABEL_46;
}
v37 = v26 + v31;
v4 = (_MMSUPPORT_INSTANCE *)a1;
v45 = v37;
if( (v7 & 0x78) == 0 && (LOBYTE(v38) = MiWorkingSetIsContended(a1), v38) || (unsigned int)KeShouldYieldProcessor() )
{
if( v9 )
{
MiUnlockPageTableInternal(a1, v9);
v9 = 0i64;
}
LOBYTE(v14) = WsIrql;
MiUnlockWorkingSetShared((_MMSUPPORT_INSTANCE *)a1, v14);
MiLockWorkingSetShared();
}
v17 = (_MMPTE *)v44;
v7 += 8 * v31;
v16 = WsIrql;
if( v7 > v44 )
goto LABEL_47;
}
v11 = 1;
LABEL_47:
if( v9 )
MiUnlockPageTableInternal((INT64)v4, v9);
v16 = WsIrql;
v10 = v41;
LABEL_50:
LOBYTE(v14) = v16;
MiUnlockWorkingSetShared(v4, v14);
if( v11 )
return(v13 != 0) + 2;
if( v10 )
return v13 != 0 ? 3 : 0;
return v12;
}Referenced by:
MiProcessVaContiguityInformation
MiQueryMemoryPhysicalContiguity