VmpPrefetchVirtualAddresses

NTSTATUS __stdcall VmpPrefetchVirtualAddresses(PEX_SPIN_LOCK SpinLock){
  _QWORD *v1; 
  unsigned __int64 v2; 
  unsigned __int64 v3; 
  _QWORD *v4; 
  NTSTATUS v6; 
  unsigned __int64 v7; 
  VOID **PoolWithTag; 
  _QWORD *v9; 
  unsigned __int8 v10; 
  unsigned __int64 v11; 
  __int64 v13; 
  __int64 v14; 
  UINT64 v15[2]; 
  INT64 v16[2]; 
  __int64 v17; 
  INT64 v18; 
  __int64(__fastcall **ExtensionTable)(VOID **, INT64, __int64, __int64); 

  v13 = *((_QWORD *)SpinLock + 9);
  v3 = v2;
  v4 = v1;
  *(_OWORD *)v15 = 0i64;
  if( v13 == -1 )
    return -1073741667;
  ExtensionTable = (__int64(__fastcall **)(VOID **, INT64, __int64, __int64))ExGetExtensionTable(VmpExtensionHost);
  if( !ExtensionTable )
    return -1073741667;
  v18 = 0i64;
  v7 = v3;
  if( v3 >= 0x2000 )
    v7 = 0x2000i64;
  PoolWithTag = ExAllocatePoolWithTag(0x200ui64, 16 * v7, 1917873494i64);
  if( PoolWithTag )
  {
    v9 = &v4[2 * v3];
    v17 = 0i64;
    *(_OWORD *)v16 = 0i64;
    v10 = VmpProcessContextLockShared(SpinLock);
    while( v4 < v9 )
    {
      v11 = ((*v4 + (((*v4 & 0xFFFi64) + v4[1] + 4095i64) & 0xFFFFFFFFFFFFF000ui64)) >> 12) - (*v4 >> 12);
      v15[0] = *v4 >> 12;
      v15[1] = v11;
      while( v15[1] )
      {
        VmpFillGpnRanges((INT64)SpinLock, v15, (INT64)PoolWithTag, &v18, v7, (INT64)v16);
        if( v18 >= v7 )
        {
          v14 = *((_QWORD *)SpinLock + 5);
          ExReleaseSpinLockSharedFromDpcLevel(SpinLock);
          __writecr8(v10);
          v6 = (*ExtensionTable)(PoolWithTag, v18, v13, 1i64);
          if( v6 < 0 )
            goto LABEL_20;
          v18 = 0i64;
          v10 = VmpProcessContextLockShared(SpinLock);
          if( v14 != *((_QWORD *)SpinLock + 5) )
          {
            *(_OWORD *)v16 = 0i64;
            v17 = 0i64;
          }
        }
      }
      v4 += 2;
    }
    ExReleaseSpinLockSharedFromDpcLevel(SpinLock);
    __writecr8(v10);
    if( !v18 || (v6 = (*ExtensionTable)(PoolWithTag, v18, v13, 1i64), v6 >= 0) )
      v6 = 0;
  }
  else
  {
    v6 = -1073741670;
  }
LABEL_20:
  ExReleaseRundownProtection((_EX_RUNDOWN_REF *)VmpExtensionHost + 8);
  if( PoolWithTag )
    ExFreePoolWithTag(PoolWithTag, 0);
  return v6;
}

Referenced by:

VmPrefetchVirtualAddresses
VmpPrefetchWorker