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