private static void ReprotectRange(int offset, int size) { // Map pages that are already full as RX. // Map pages that are not full yet as RWX. // On unix, the address must be page aligned. int endOffs = offset + size; int pageStart = offset & ~PageMask; int pageEnd = endOffs & ~PageMask; int fullPagesSize = pageEnd - pageStart; if (fullPagesSize != 0) { IntPtr funcPtr = _basePointer + pageStart; MemoryManagement.Reprotect(funcPtr, (ulong)fullPagesSize, MemoryProtection.ReadAndExecute); } int remaining = endOffs - pageEnd; if (remaining != 0) { IntPtr funcPtr = _basePointer + pageEnd; MemoryManagement.Reprotect(funcPtr, (ulong)remaining, MemoryProtection.ReadWriteExecute); } }