MmPrefetchVirtualMemory

NTSTATUS __stdcall MmPrefetchVirtualMemory(CHAR *Handle, UINT64 a2, INT64 a3, INT64 a4){
  unsigned int v4; 
  int v6; 
  _ADAPTER_OBJECT *v7; 
  _ADAPTER_OBJECT *v8; 
  _ETHREAD *CurrentThread; 
  _DWORD *v10; 
  __int64 SessionVm; 
  NTSTATUS v12; 
  NTSTATUS result; 
  _LIST_ENTRY *v14; 
  INT64 v15; 
  INT64 v16; 
  INT16 v17; 
  UINT64 Tag; 
  PVOID Process; 
  PVOID v20; 
  INT64 v21; 
  UINT64 v22; 
  _KAPC_STATE ApcState; 

  v21 = a3;
  v22 = a2;
  Process = 0i64;
  v4 = a4;
  v6 = 0;
  v7 = 0i64;
  v8 = 0i64;
  memset(&ApcState, 0, sizeof(ApcState));
  CurrentThread = (_ETHREAD *)KeGetCurrentThread();
  if( !Handle )
  {
    SessionVm = 1i64;
    goto LABEL_31;
  }
  if( Handle != (CHAR *)-1i64 )
  {
    if( Handle == (CHAR *)-3i64 )
    {
      v10 = CurrentThread->Tcb.ApcState.Process->Pcb.gap0;
      if( (v10[281] & 0x10000) == 0 )
        return -1073741799;
      SessionVm = (__int64)MiGetSessionVm(-3i64, a2, a3);
      goto LABEL_6;
    }
    if( !ObIsKernelHandle(Handle) )
      return -1073741585;
    LODWORD(Tag) = 1716546893;
    if( ObpReferenceObjectByHandleWithTag(Handle, 8ui64, (_OBJECT_TYPE *)PsProcessType, 0, Tag, &Process, 0i64, 0i64) >= 0 )
    {
      v10 = Process;
      if( CurrentThread->Tcb.ApcState.Process != Process )
      {
        KiStackAttachProcess(Process, 0i64, &ApcState);
        v6 = 1;
      }
      goto LABEL_15;
    }
    v20 = 0i64;
    result = ObReferenceObjectByHandle(Handle, 1ui64, MmSessionObjectType, 0, &v20, 0i64);
    v7 = (_ADAPTER_OBJECT *)v20;
    if( result < 0 )
      return result;
    v14 = MiLockAndSelectSessionAttachProcess(*((_MM_SESSION_SPACE **)v20 + 3));
    v8 = (_ADAPTER_OBJECT *)v14;
    if( !v14 )
    {
LABEL_29:
      HalPutDmaAdapter(v7);
      return 0;
    }
    if( MmAttachSession(v14, &ApcState) < 0 )
    {
      HalPutDmaAdapter(v8);
      goto LABEL_29;
    }
    SessionVm = (__int64)MiGetSessionVm(v16, v15, v17);
LABEL_31:
    v10 = Process;
    goto LABEL_6;
  }
  v10 = CurrentThread->Tcb.ApcState.Process->Pcb.gap0;
LABEL_15:
  SessionVm = (__int64)(v10 + 416);
LABEL_6:
  v12 = MiPrefetchVirtualMemory(v22, v21, (CHAR *)SessionVm, v4);
  if( v6 )
    KiUnstackDetachProcess(&ApcState, 0i64);
  if( v8 )
  {
    MmDetachSession(v8, &ApcState);
    HalPutDmaAdapter(v8);
  }
  if( Handle == (CHAR *)-2i64 || (unsigned __int64)(Handle - 1) <= 0xFFFFFFFFFFFFFFFBui64 )
  {
    if( v10 )
    {
      ObfDereferenceObjectWithTag(v10, 0x66506D4Dui64);
    }
    else if( v7 )
    {
      HalPutDmaAdapter(v7);
    }
  }
  return v12;
}

Referenced by:

ExpDebuggerWorker
MiProcessWsInSwapRanges
MmPrefetchVirtualAddresses
PfpPrefetchPrivatePages