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