MxGetNextPage
UINT64 __stdcall MxGetNextPage(UINT64 PreferredNode, UINT64 LargePageRequired){
unsigned int v2;
int v3;
__int64 v4;
unsigned int v5;
int v6;
_MX_ALLOCATION_DESCRIPTOR *v7;
UINT64 v9;
__int64 v11;
int v12;
__int64 v13;
__int64 v14;
v2 = 0;
v3 = LargePageRequired;
v4 = -1i64;
do
{
v5 = 0;
v6 = PreferredNode;
do
{
v7 = (_MX_ALLOCATION_DESCRIPTOR *)MxFreeDescriptor[v6];
if( v7 && *((_QWORD *)v7 + 1) && !(v3 == 1 ? *((_QWORD *)v7 + 3) == -1i64 : *((_QWORD *)v7 + 2) == -1i64) )
break;
v12 = v6 + 1;
v6 = 0;
v7 = 0i64;
++v5;
if( v12 != (unsigned __int16)KeNumberNodes )
v6 = v12;
}
while( v5 < (unsigned __int16)KeNumberNodes );
if( v7 )
break;
++v2;
}
while( v2 < 2 );
if( v5 != (unsigned __int16)KeNumberNodes )
{
LABEL_10:
if( v3 == 1 )
{
v9 = *((_QWORD *)v7 + 3);
if( v9 - *(_QWORD *)v7 >= 0x200 )
{
*((_QWORD *)v7 + 3) = v9 - 512;
return v9;
}
}
else
{
v11 = *((_QWORD *)v7 + 2);
if( v11 != (v11 & 0xFFFFFFFFFFFFFE00ui64) && v11 != *(_QWORD *)v7 )
{
*((_QWORD *)v7 + 2) = v11 - 1;
LABEL_18:
MxBootDescriptorDepleted(v7);
return v9;
}
v13 = *((_QWORD *)v7 + 3);
v14 = *(_QWORD *)v7;
if( v13 == -1 )
{
if( v11 != v14 && v14 != (v14 & 0xFFFFFFFFFFFFFE00ui64) )
v4 = v14 | 0x1FF;
*((_QWORD *)v7 + 2) = v4;
goto LABEL_18;
}
*((_QWORD *)v7 + 2) = v13 + 511;
if( (unsigned __int64)(v13 - v14) >= 0x200 )
{
*((_QWORD *)v7 + 3) = v13 - 512;
goto LABEL_18;
}
}
*((_QWORD *)v7 + 3) = -1i64;
goto LABEL_18;
}
if( v3 != 1 )
{
v7 = MxSwitchDescriptors(PreferredNode);
if( v7 )
goto LABEL_10;
*(&stru_140C4DB30 + 2570) = 16;
}
return -1i64;
}Referenced by:
MxMapVa