VmpFillGpnRanges

VOID **__fastcall VmpFillGpnRanges(INT64 a1, UINT64 *a2, INT64 a3, INT64 *a4, INT64 a5, INT64 a6){
  VOID **result; 
  bool v7; 
  __int64 v12; 
  INT64 v13; 
  __int64 v14; 
  __int64 v15; 
  __int128 v16; 
  void *retaddr; 

  result = &retaddr;
  v7 = a2[1] == 0;
  v16 = 0i64;
  if( !v7 )
  {
    while( 1 )
    {
      result = (VOID **)VmpConvertPortionVpnRangeToGpnRange(a1, a2, 0xFFFFFFFFFFFFFFFFui64, a6, &v16);
      v12 = *((_QWORD *)&v16 + 1);
      if( !*((_QWORD *)&v16 + 1) )
        return result;
      v13 = *a4;
      if( !*a4 )
        break;
      v14 = *(_QWORD *)(a3 + 16 * v13 - 8);
      v15 = *(_QWORD *)(a3 + 16 * v13 - 16);
      if( v15 + v14 == (_QWORD)v16 )
      {
        result = (VOID **)(v14 + *((_QWORD *)&v16 + 1));
        *(_QWORD *)(a3 + 16 * v13 - 8) = v14 + *((_QWORD *)&v16 + 1);
      }
      else
      {
        if( v15 != (_QWORD)v16 + *((_QWORD *)&v16 + 1) )
          break;
        result = (VOID **)(v14 + *((_QWORD *)&v16 + 1));
        *(_QWORD *)(a3 + 16 * v13 - 16) = v16;
        *(_QWORD *)(a3 + 16 * v13 - 8) = v14 + v12;
      }
LABEL_9:
      if( !a2[1] )
        return result;
    }
    *(_OWORD *)(a3 + 16 * v13) = v16;
    result = (VOID **)(v13 + 1);
    *a4 = v13 + 1;
    if( v13 + 1 == a5 )
      return result;
    goto LABEL_9;
  }
  return result;
}

Referenced by:

VmpPrefetchVirtualAddresses