123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475 |
- using System;
- using System.Collections.Generic;
- using System.Runtime.InteropServices;
- using MonoMod.Utils;
- namespace BepInEx.IL2CPP.Allocator
- {
- internal class MacOsPageAllocator : UnixPageAllocator
- {
- protected override IEnumerable<(IntPtr, IntPtr)> MapMemoryAreas()
- {
- var size = IntPtr.Zero;
- var info = new LibSystem.vm_region_basic_info_64();
- var infoCount = (uint)(Marshal.SizeOf<LibSystem.vm_region_basic_info_64>() / sizeof(int));
- var objectName = 0u;
- var address = IntPtr.Zero;
- while (LibSystem.vm_region_64(LibSystem.TaskSelf, ref address, ref size, LibSystem.VM_REGION_BASIC_INFO_64, ref info, ref infoCount, ref objectName) == LibSystem.KERN_SUCCESS)
- {
- var start = new IntPtr(address.ToInt64());
- var end = new IntPtr(address.ToInt64() + size.ToInt64());
- address = end;
- yield return (start, end);
- }
- }
- private static class LibSystem
- {
- public const int VM_REGION_BASIC_INFO_64 = 9;
- public const int KERN_SUCCESS = 0;
- public static readonly IntPtr TaskSelf;
- static LibSystem()
- {
- typeof(LibSystem).ResolveDynDllImports(new Dictionary<string, List<DynDllMapping>>
- {
- ["libSystem"] = new List<DynDllMapping>
- {
- "/usr/lib/libSystem.dylib" // OSX POSIX
- }
- });
- var libsystem = DynDll.OpenLibrary("/usr/lib/libSystem.dylib");
- TaskSelf = libsystem.GetFunction("mach_task_self_"); // This isn't a function but rather an exported symbol
- }
- // ReSharper disable InconsistentNaming
- [StructLayout(LayoutKind.Sequential)]
- public readonly struct vm_region_basic_info_64
- {
- public readonly int protection;
- public readonly int max_protection;
- public readonly uint inheritance;
- [MarshalAs(UnmanagedType.I4)]
- public readonly bool shared;
- [MarshalAs(UnmanagedType.I4)]
- public readonly bool reserved;
- public readonly ulong offset;
- public readonly int behavior;
- public readonly ushort user_wired_count;
- }
- // ReSharper restore InconsistentNaming
- // ReSharper disable InconsistentNaming
- [DynDllImport("libSystem")]
- public static vm_region_64Delegate vm_region_64;
- public delegate int vm_region_64Delegate(IntPtr target_task, ref IntPtr address, ref IntPtr size, int flavor, ref vm_region_basic_info_64 info, ref uint infoCnt, ref uint object_name);
- // ReSharper restore InconsistentNaming
- }
- }
- }
|