VmPrefetchVirtualAddresses

NTSTATUS __stdcall VmPrefetchVirtualAddresses(VOID *Src){
  void(__fastcall *v1)(void *); 
  int v2; 
  NTSTATUS v4; 
  void(__fastcall *v5)(void *); 
  _EPROCESS *Process; 
  volatile int *VmContext; 
  VOID **PoolWithTag; 
  _WORK_QUEUE_ITEM *v9; 
  _LIST_ENTRY *v10; 

  v4 = 0;
  v5 = v1;
  Process = KeGetCurrentThread()->ApcState.Process;
  VmContext = (volatile int *)Process->VmContext;
  if( !VmContext )
    return -1073741667;
  if( v2 )
    return VmpPrefetchVirtualAddresses(VmContext);
  PoolWithTag = ExAllocatePoolWithTag(0x200ui64, 16i64 * ((_QWORD)v1 + 4), 1666215254i64);
  v9 = (_WORK_QUEUE_ITEM *)PoolWithTag;
  if( !PoolWithTag )
    return -1073741670;
  PoolWithTag[1] = 0i64;
  PoolWithTag[4] = 0i64;
  PoolWithTag[5] = 0i64;
  PoolWithTag[6] = 0i64;
  PoolWithTag[2] = VmpPrefetchWorker;
  PoolWithTag[3] = PoolWithTag;
  *PoolWithTag = 0i64;
  ObfReferenceObject(Process);
  v9[1].WorkerRoutine = v5;
  v10 = (_LIST_ENTRY *)(((unsigned __int64)&v9[1].Parameter + 7) & 0xFFFFFFFFFFFFFFF8ui64);
  v9[1].List.Blink = v10;
  v9[1].List.Flink = (_LIST_ENTRY *)Process;
  memmove(v10, Src, 16 * (_DWORD)v5);
  ExQueueWorkItem(v9, DelayedWorkQueue);
  return v4;
}

Referenced by:

MmInSwapWorkingSet
NtSetInformationVirtualMemory