diff options
author | liamwhite <liamwhite@users.noreply.github.com> | 2024-02-05 19:41:21 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-02-05 19:41:21 +0100 |
commit | 74cc8721c7167f1a91d29efb29140c64e42ad186 (patch) | |
tree | 89c9916cfda19f88d8dddde22b8965921184180a /src/core/memory/cheat_engine.cpp | |
parent | Merge pull request #12916 from liamwhite/float-fix (diff) | |
parent | dmnt: cheats: Silence memory errors (diff) | |
download | yuzu-74cc8721c7167f1a91d29efb29140c64e42ad186.tar yuzu-74cc8721c7167f1a91d29efb29140c64e42ad186.tar.gz yuzu-74cc8721c7167f1a91d29efb29140c64e42ad186.tar.bz2 yuzu-74cc8721c7167f1a91d29efb29140c64e42ad186.tar.lz yuzu-74cc8721c7167f1a91d29efb29140c64e42ad186.tar.xz yuzu-74cc8721c7167f1a91d29efb29140c64e42ad186.tar.zst yuzu-74cc8721c7167f1a91d29efb29140c64e42ad186.zip |
Diffstat (limited to 'src/core/memory/cheat_engine.cpp')
-rw-r--r-- | src/core/memory/cheat_engine.cpp | 46 |
1 files changed, 30 insertions, 16 deletions
diff --git a/src/core/memory/cheat_engine.cpp b/src/core/memory/cheat_engine.cpp index 96fa7fa3a..14d1a3840 100644 --- a/src/core/memory/cheat_engine.cpp +++ b/src/core/memory/cheat_engine.cpp @@ -9,6 +9,7 @@ #include "core/core_timing.h" #include "core/hle/kernel/k_page_table.h" #include "core/hle/kernel/k_process.h" +#include "core/hle/kernel/k_process_page_table.h" #include "core/hle/service/hid/hid_server.h" #include "core/hle/service/sm/sm.h" #include "core/memory.h" @@ -46,12 +47,23 @@ StandardVmCallbacks::StandardVmCallbacks(System& system_, const CheatProcessMeta StandardVmCallbacks::~StandardVmCallbacks() = default; -void StandardVmCallbacks::MemoryRead(VAddr address, void* data, u64 size) { - system.ApplicationMemory().ReadBlock(SanitizeAddress(address), data, size); +void StandardVmCallbacks::MemoryReadUnsafe(VAddr address, void* data, u64 size) { + // Return zero on invalid address + if (!IsAddressInRange(address) || !system.ApplicationMemory().IsValidVirtualAddress(address)) { + std::memset(data, 0, size); + return; + } + + system.ApplicationMemory().ReadBlock(address, data, size); } -void StandardVmCallbacks::MemoryWrite(VAddr address, const void* data, u64 size) { - system.ApplicationMemory().WriteBlock(SanitizeAddress(address), data, size); +void StandardVmCallbacks::MemoryWriteUnsafe(VAddr address, const void* data, u64 size) { + // Skip invalid memory write address + if (!IsAddressInRange(address) || !system.ApplicationMemory().IsValidVirtualAddress(address)) { + return; + } + + system.ApplicationMemory().WriteBlock(address, data, size); } u64 StandardVmCallbacks::HidKeysDown() { @@ -81,21 +93,25 @@ void StandardVmCallbacks::CommandLog(std::string_view data) { data.back() == '\n' ? data.substr(0, data.size() - 1) : data); } -VAddr StandardVmCallbacks::SanitizeAddress(VAddr in) const { +bool StandardVmCallbacks::IsAddressInRange(VAddr in) const { if ((in < metadata.main_nso_extents.base || in >= metadata.main_nso_extents.base + metadata.main_nso_extents.size) && (in < metadata.heap_extents.base || - in >= metadata.heap_extents.base + metadata.heap_extents.size)) { - LOG_ERROR(CheatEngine, + in >= metadata.heap_extents.base + metadata.heap_extents.size) && + (in < metadata.alias_extents.base || + in >= metadata.heap_extents.base + metadata.alias_extents.size) && + (in < metadata.aslr_extents.base || + in >= metadata.heap_extents.base + metadata.aslr_extents.size)) { + LOG_DEBUG(CheatEngine, "Cheat attempting to access memory at invalid address={:016X}, if this " "persists, " "the cheat may be incorrect. However, this may be normal early in execution if " "the game has not properly set up yet.", in); - return 0; ///< Invalid addresses will hard crash + return false; ///< Invalid addresses will hard crash } - return in; + return true; } CheatParser::~CheatParser() = default; @@ -211,16 +227,14 @@ void CheatEngine::Initialize() { .base = GetInteger(page_table.GetHeapRegionStart()), .size = page_table.GetHeapRegionSize(), }; - - metadata.address_space_extents = { - .base = GetInteger(page_table.GetAddressSpaceStart()), - .size = page_table.GetAddressSpaceSize(), - }; - - metadata.alias_extents = { + metadata.aslr_extents = { .base = GetInteger(page_table.GetAliasCodeRegionStart()), .size = page_table.GetAliasCodeRegionSize(), }; + metadata.alias_extents = { + .base = GetInteger(page_table.GetAliasRegionStart()), + .size = page_table.GetAliasRegionSize(), + }; is_pending_reload.exchange(true); } |