/// <summary> /// Create a new region handle. The handle is registered with the given tracking object, /// and will be notified of any changes to the specified region. /// </summary> /// <param name="tracking">Tracking object for the target memory block</param> /// <param name="address">Virtual address of the region to track</param> /// <param name="size">Size of the region to track</param> internal RegionHandle(MemoryTracking tracking, ulong address, ulong size) { Address = address; Size = size; EndAddress = address + size; _tracking = tracking; _regions = tracking.GetVirtualRegionsForHandle(address, size); foreach (var region in _regions) { region.Handles.Add(this); } }
internal SmartMultiRegionHandle(MemoryTracking tracking, ulong address, ulong size, ulong granularity) { // For this multi-region handle, the handle list starts empty. // As regions are queried, they are added to the _handles array at their start index. // When a region being added overlaps another, the existing region is split. // A query can therefore scan multiple regions, though with no overlaps they can cover a large area. _tracking = tracking; _handles = new RegionHandle[size / granularity]; _granularity = granularity; _address = address; _size = size; }
internal MultiRegionHandle(MemoryTracking tracking, ulong address, ulong size, ulong granularity) { _handles = new RegionHandle[size / granularity]; Granularity = granularity; for (int i = 0; i < _handles.Length; i++) { RegionHandle handle = tracking.BeginTracking(address + (ulong)i * granularity, granularity); handle.Parent = this; _handles[i] = handle; } Address = address; Size = size; }
public VirtualRegion(MemoryTracking tracking, ulong address, ulong size, MemoryPermission lastPermission = MemoryPermission.Invalid) : base(address, size) { _lastPermission = lastPermission; _tracking = tracking; }
public PhysicalRegion(MemoryTracking tracking, ulong address, ulong size) : base(address, size) { Tracking = tracking; Protection = MemoryPermission.ReadAndWrite; }
public VirtualRegion(MemoryTracking tracking, ulong address, ulong size) : base(address, size) { _tracking = tracking; UpdatePhysicalChildren(); }
internal MultiRegionHandle(MemoryTracking tracking, ulong address, ulong size, IEnumerable <IRegionHandle> handles, ulong granularity) { _handles = new RegionHandle[size / granularity]; Granularity = granularity; int i = 0; if (handles != null) { // Inherit from the handles we were given. Any gaps must be filled with new handles, // and old handles larger than our granularity must copy their state onto new granular handles and dispose. // It is assumed that the provided handles do not overlap, in order, are on page boundaries, // and don't extend past the requested range. foreach (RegionHandle handle in handles) { int startIndex = (int)((handle.Address - address) / granularity); // Fill any gap left before this handle. while (i < startIndex) { RegionHandle fillHandle = tracking.BeginTracking(address + (ulong)i * granularity, granularity); fillHandle.Parent = this; _handles[i++] = fillHandle; } if (handle.Size == granularity) { handle.Parent = this; _handles[i++] = handle; } else { int endIndex = (int)((handle.EndAddress - address) / granularity); while (i < endIndex) { RegionHandle splitHandle = tracking.BeginTracking(address + (ulong)i * granularity, granularity); splitHandle.Parent = this; splitHandle.Reprotect(handle.Dirty); RegionSignal signal = handle.PreAction; if (signal != null) { splitHandle.RegisterAction(signal); } _handles[i++] = splitHandle; } handle.Dispose(); } } } // Fill any remaining space with new handles. while (i < _handles.Length) { RegionHandle handle = tracking.BeginTracking(address + (ulong)i * granularity, granularity); handle.Parent = this; _handles[i++] = handle; } Address = address; Size = size; }
public VirtualRegion(MemoryTracking tracking, ulong address, ulong size) : base(address, size) { _tracking = tracking; }