From 0ad1e3d5855cdf8e3c4ee20f7d3ba5ebc20c2edd Mon Sep 17 00:00:00 2001 From: Gliniak Date: Sun, 18 Aug 2024 10:29:18 +0200 Subject: [PATCH] [Kernel] MmSetAddressProtect: Disable changing protection in executable range --- src/xenia/kernel/xboxkrnl/xboxkrnl_memory.cc | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/xenia/kernel/xboxkrnl/xboxkrnl_memory.cc b/src/xenia/kernel/xboxkrnl/xboxkrnl_memory.cc index 7231e5dce..25773b8f9 100644 --- a/src/xenia/kernel/xboxkrnl/xboxkrnl_memory.cc +++ b/src/xenia/kernel/xboxkrnl/xboxkrnl_memory.cc @@ -17,6 +17,7 @@ #include "xenia/kernel/xboxkrnl/xboxkrnl_memory.h" #include "xenia/kernel/xboxkrnl/xboxkrnl_private.h" #include "xenia/xbox.h" + DEFINE_bool( ignore_offset_for_ranged_allocations, false, "Allows to ignore 4k offset for physical allocations with provided range. " @@ -513,6 +514,14 @@ void MmSetAddressProtect_entry(lpvoid_t base_address, dword_t region_size, uint32_t protect = FromXdkProtectFlags(protect_bits); auto heap = kernel_memory()->LookupHeap(base_address); + + // More research required: 544307D1 uses it with base_address in xex range, + // which causes write exception in long term. Probably console disables + // modification of xex range page protection for security reasons. + if (heap->heap_type() == HeapType::kGuestXex) { + return; + } + heap->Protect(base_address.guest_address(), region_size, protect); } DECLARE_XBOXKRNL_EXPORT1(MmSetAddressProtect, kMemory, kImplemented);