VmCreateMemoryRange
NTSTATUS __stdcall VmCreateMemoryRange(
UINT64 GuestPhysicalAddress,
VOID *SystemVirtualAddress,
UINT64 SizeInPages,
UINT64 PartitionId){
_QWORD *MemoryRanges;
_EPROCESS *Process;
INT64 VmContext;
VOID **PoolWithTag;
int inserted;
PVOID v13;
__int64 v14;
__int64 v15;
unsigned __int64 v16;
UINT64 v17;
__int64 v19;
MemoryRanges = 0i64;
Process = KeGetCurrentThread()->ApcState.Process;
if( !VmTbFlushEnabled )
VmTbFlushEnabled = 1;
VmContext = (INT64)Process->VmContext;
if( !VmContext )
{
PoolWithTag = ExAllocatePoolWithTag(0x200ui64, 0x70ui64, 1666215254i64);
VmContext = (INT64)PoolWithTag;
if( !PoolWithTag )
return -1073741670;
memset(PoolWithTag, 0i64, 0x70u);
*(_QWORD *)(VmContext + 72) = PartitionId;
*(_QWORD *)(VmContext + 16) = 0i64;
*(_QWORD *)(VmContext + 24) = 0i64;
*(_QWORD *)(VmContext + 32) = 0i64;
*(_QWORD *)(VmContext + 48) = 0i64;
*(_QWORD *)(VmContext + 56) = 0i64;
if( _InterlockedCompareExchange64((volatile signed __int64 *)&Process->VmContext, VmContext, 0i64) )
{
VmpProcessContextCleanup(VmContext);
ExFreePoolWithTag(v13, 0);
VmContext = (INT64)Process->VmContext;
}
}
if( v19 )
MemoryRanges = (_QWORD *)VmpDecodePreallocationRangeHandle((_DEVICE_OBJECT *)VmContext);
if( VmpValidateMemoryRangeParameters(GuestPhysicalAddress, (UINT64)SystemVirtualAddress, SizeInPages, PartitionId) )
{
inserted = -1073741811;
}
else
{
v14 = *(_QWORD *)(VmContext + 72);
if( v14 == -1 || v14 == PartitionId )
{
if( !MemoryRanges )
{
MemoryRanges = VmpAllocateMemoryRanges(1ui64);
if( !MemoryRanges )
return -1073741670;
}
v15 = MemoryRanges[5];
v16 = (unsigned __int64)SystemVirtualAddress >> 12;
MemoryRanges[3] = v16;
MemoryRanges[4] = v16 + SizeInPages - 1;
v17 = GuestPhysicalAddress >> 12;
*(_QWORD *)(v15 + 48) = v17;
*(_QWORD *)(v15 + 56) = v17 + SizeInPages - 1;
inserted = VmpInsertMemoryRange((PEX_SPIN_LOCK)VmContext);
if( inserted >= 0 )
{
MemoryRanges = 0i64;
inserted = 0;
}
}
else
{
inserted = -1073740007;
}
}
if( MemoryRanges )
VmpFreeMemoryRanges(MemoryRanges);
return inserted;
}Referenced by:
No references.