VmpFillGpnRanges
VOID **__fastcall VmpFillGpnRanges(INT64 a1, UINT64 *a2, INT64 a3, INT64 *r9_0, INT64 arg20, INT64 a4){
VOID **result;
bool v7;
__int64 v12;
INT64 v13;
__int64 v14;
__int64 v15;
_QWORD a5[2];
void *retaddr;
result = &retaddr;
v7 = a2[1] == 0;
*(_OWORD *)a5 = 0i64;
if( !v7 )
{
while( 1 )
{
result = (VOID **)VmpConvertPortionVpnRangeToGpnRange(a1, a2, 0xFFFFFFFFFFFFFFFFui64, a4, a5);
v12 = a5[1];
if( !a5[1] )
return result;
v13 = *r9_0;
if( !*r9_0 )
break;
v14 = *(_QWORD *)(a3 + 16 * v13 - 8);
v15 = *(_QWORD *)(a3 + 16 * v13 - 16);
if( v15 + v14 == a5[0] )
{
result = (VOID **)(v14 + a5[1]);
*(_QWORD *)(a3 + 16 * v13 - 8) = v14 + a5[1];
}
else
{
if( v15 != a5[0] + a5[1] )
break;
result = (VOID **)(v14 + a5[1]);
*(_QWORD *)(a3 + 16 * v13 - 16) = a5[0];
*(_QWORD *)(a3 + 16 * v13 - 8) = v14 + v12;
}
LABEL_9:
if( !a2[1] )
return result;
}
*(_OWORD *)(a3 + 16 * v13) = *(_OWORD *)a5;
result = (VOID **)(v13 + 1);
*r9_0 = v13 + 1;
if( v13 + 1 == arg20 )
return result;
goto LABEL_9;
}
return result;
}Referenced by:
VmpPrefetchVirtualAddresses