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