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.