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