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