IvmdProcessRange

NTSTATUS __stdcall IvmdProcessRange(UINT64 a1, UINT64 a2, UINT64 a3){
  INT64 v4; 
  UINT64 v5; 
  _QWORD *v6; 
  UINT64 v8; 
  UINT64 v9; 
  INT64 v10; 
  INT64 *v12; 
  __int64 *v13; 
  __int64 *v14; 
  __int64 **v15; 
  INT64 v16; 

  v4 = 0i64;
  v5 = a1 + 24;
  v16 = 0i64;
  v6 = *(_QWORD **)(a1 + 24);
  v8 = a1;
  while( v6 != (_QWORD *)v5 )
  {
    v9 = v6[2];
    v10 = (INT64)v6;
    if( v9 > a3 )
      break;
    a1 = v6[3];
    if( a1 >= a2 )
    {
      if( v9 == a2 && a1 == a3 )
        return 0;
      v6 = (_QWORD *)*v6;
      if( !v4 )
      {
        v4 = v10;
        v16 = v10;
        if( v9 < a2 )
          a2 = v9;
      }
      if( a1 >= a3 )
      {
        a3 = a1;
        break;
      }
    }
    else
    {
      v6 = (_QWORD *)*v6;
    }
  }
  if( v4 )
  {
    while( *(_QWORD **)v4 != v6 )
    {
      v13 = *(__int64 **)v4;
      v14 = **(__int64 ***)v4;
      if( v14[1] != *(_QWORD *)v4 )
        goto LABEL_26;
      v15 = (__int64 **)v13[1];
      if( *v15 != v13 )
        goto LABEL_26;
      *v15 = v14;
      v14[1] = (__int64)v15;
      --*(_DWORD *)(v8 + 20);
    }
  }
  else
  {
    if( ExtEnvAllocateMemory(a1, 0x20ui64, &v16) < 0 )
      return -1073741670;
    v12 = (INT64 *)v6[1];
    if( (_QWORD *)*v12 != v6 )
LABEL_26:
      __fastfail(3u);
    v4 = v16;
    *(_QWORD *)v16 = v6;
    *(_QWORD *)(v4 + 8) = v12;
    *v12 = v4;
    v6[1] = v4;
    ++*(_DWORD *)(v8 + 20);
  }
  *(_QWORD *)(v4 + 16) = a2;
  *(_QWORD *)(v4 + 24) = a3;
  return 0;
}

Referenced by:

HsaProcessIvmd