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