VmpVaMemoryRangeGetNext

_QWORD *__fastcall VmpVaMemoryRangeGetNext(INT64 a1, _QWORD *a2){
  _QWORD *v2; 
  __int64 v3; 
  _QWORD *v4; 
  _QWORD *v5; 
  __int64 i; 
  v2 = 0i64;
  if( a2 )
  {
    v4 = (_QWORD *)a2[1];
    if( v4 )
    {
      v5 = (_QWORD *)*v4;
      if( *v4 )
      {
        do
        {
          v4 = v5;
          v5 = (_QWORD *)*v5;
        }
        while( v5 );
      }
      return v4;
    }
    else
    {
      for( i = a2[2]; ; i = v2[2] )
      {
        v2 = (_QWORD *)(i & 0xFFFFFFFFFFFFFFFCui64);
        if( !v2 || (_QWORD *)*v2 == a2 )
          break;
        a2 = v2;
      }
    }
  }
  else
  {
    v3 = *(_QWORD *)(a1 + 32);
    if( (v3 & 1) != 0 )
    {
      if( v3 != 1 )
        return(_QWORD *)(v3 ^ ((a1 + 24) | 1));
    }
    else
    {
      return *(_QWORD **)(a1 + 32);
    }
  }
  return v2;
}

Referenced by:

VmpConvertPortionVpnRangeToGpnRange