VmpPrefetchForVirtualFault
NTSTATUS __stdcall VmpPrefetchForVirtualFault(UINT64 a1, INT64 *a2, INT64 a3){
VOID **PoolWithTag;
_PREFETCH_VIRTUAL_ADDRESS_LIST *v7;
NTSTATUS v8;
_QWORD *v9;
UINT64 v10;
UINT64 v11;
UINT64 v12;
__int64 v13;
__int64 v14;
PoolWithTag = ExAllocatePoolWithTag(0x200ui64, 16 * (a3 + 2), 1984982358i64);
v7 = (_PREFETCH_VIRTUAL_ADDRESS_LIST *)PoolWithTag;
if( !PoolWithTag )
return -1073741670;
*((_DWORD *)PoolWithTag + 1) = 0;
*((_DWORD *)PoolWithTag + 1) &= 0xFFFFFFF9;
v9 = (_QWORD *)(((unsigned __int64)PoolWithTag + 39) & 0xFFFFFFFFFFFFFFF8ui64);
PoolWithTag[1] = (VOID *)-1i64;
PoolWithTag[2] = (VOID *)a3;
v10 = a1 + 16 * a3;
*(_DWORD *)PoolWithTag = 1;
PoolWithTag[3] = v9;
if( a1 < v10 )
{
v11 = a1 - (_QWORD)v9;
v12 = ((v10 - a1 - 1) >> 4) + 1;
do
{
v13 = *a2++;
*v9 = v13 << 12;
v14 = *(_QWORD *)((char *)v9 + v11 + 8);
v9 += 2;
*(v9 - 1) = v14 << 12;
--v12;
}
while( v12 );
}
v8 = MmPrefetchVirtualAddresses(v7);
ExFreePoolWithTag(v7, 0);
return v8;
}Referenced by:
VmAccessFault