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