MxMapPfnRange
UINT64 __stdcall MxMapPfnRange(UINT64 BasePage, UINT64 TotalPageCount, UINT64 ZeroFillRequired){
int v3;
UINT64 v4;
UINT64 v5;
_MMPFN *PfnDb;
UINT64 v7;
_MMPTE *PteBase;
__int64 v9;
UINT64 v10;
__int64 v11;
UINT64 v12;
UINT64 v13;
__int64 v14;
__int64 v15;
_MMPTE *v16;
unsigned __int64 v17;
unsigned __int64 v18;
char *v19;
__int64 v20;
int v21;
__int64 v22;
_MMPTE *v23;
__int64 v24;
__int64 v26;
int v27;
int v28;
__int64 v29;
__int64 v30;
__int64 v31;
int v32;
v32 = ZeroFillRequired;
v26 = 0i64;
v28 = 0;
v3 = ZeroFillRequired;
v31 = 0i64;
v4 = TotalPageCount;
v5 = BasePage;
PfnDb = MmGetPfnDb();
v7 = (UINT64)PfnDb + 48 * BasePage;
PteBase = MmGetPteBase();
if( v7 == (v7 & 0xFFFFFFFFFFE00000ui64) )
v9 = 0i64;
else
v9 = (__int64)PteBase + ((v7 >> 9) & 0x7FFFFFFFF8i64);
if( TotalPageCount == -1i64
|| (v10 = (UINT64)PfnDb + 48 * BasePage + 48 * TotalPageCount, v10 == (v10 & 0xFFFFFFFFFFE00000ui64)) )
{
v11 = 0i64;
}
else
{
v11 = (__int64)PteBase + (((v10 - 1) >> 9) & 0x7FFFFFFFF8i64);
}
v29 = v9;
v30 = v11;
if( !TotalPageCount )
return 1i64;
while( 1 )
{
v12 = v4;
if( v4 == -1i64 )
{
v4 = 0i64;
v14 = MmPfnDatabase + (MxPfnAllocation << 12);
}
else
{
MiRestrictRangeToNode(v5, v4);
v12 = v13;
v4 -= v13;
v14 = (__int64)PfnDb + 48 * v5 + 48 * v13;
}
LODWORD(v15) = MiSearchNumaNodeTable((PVOID)v5);
v27 = *(_DWORD *)(v15 + 8);
v16 = MmGetPteBase();
v17 = (((unsigned __int64)MmGetPfnDb() + 48 * v5) >> 9) & 0x7FFFFFFFF8i64;
v5 += v12;
v18 = (unsigned __int64)v16 + v17;
v19 = (char *)v16 + (((unsigned __int64)(v14 - 1) >> 9) & 0x7FFFFFFFF8i64);
if( v18 <= (unsigned __int64)v19 )
break;
LABEL_21:
if( !v4 )
return 1i64;
PfnDb = MmGetPfnDb();
}
v20 = (_QWORD)v16 << 25;
while( 1 )
{
if( v18 == v9 || (v21 = v3, v18 == v11) )
v21 = 1;
LODWORD(v31) = 0;
v28 = v21;
v26 = (__int64)((v18 << 25) - v20) >> 16;
if( !(unsigned int)MxMapVa((__int64)&v26) )
return 0i64;
if( (_DWORD)v31 )
{
v22 = (unsigned int)v31;
v23 = MmGetPteBase();
do
{
v18 = (unsigned __int64)v23 + ((v18 >> 9) & 0x7FFFFFFFF8i64);
--v22;
}
while( v22 );
v18 += 8i64;
v3 = v32;
v24 = (unsigned int)v31;
do
{
v18 = (__int64)((v18 << 25) - v20) >> 16;
--v24;
}
while( v24 );
}
else
{
v18 += 8i64;
}
if( v18 > (unsigned __int64)v19 )
goto LABEL_21;
}
}Referenced by:
MiCreateSparsePfnDatabase