From 38f1b1848ed4e1e7c1418a0c81f3fcda2b704e58 Mon Sep 17 00:00:00 2001 From: Ash Logan Date: Tue, 17 Dec 2024 15:13:39 +1100 Subject: [PATCH] fix(account-settings): Don't re-add function patches on every application boot libfunctionpatcher stuff is persistent from plugin init time to plugin teardown time. but the memory replacements DO need to happen on every launch, so rearrange things a bit. --- src/main.cpp | 6 ++--- src/patches/account_settings.cpp | 46 +++++++++++++++++--------------- src/patches/account_settings.h | 3 +-- 3 files changed, 27 insertions(+), 28 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 12ba0e8..7c4612d 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -166,6 +166,7 @@ static void Inkay_Initialize(bool apply_patches) { patchDNS(); patchEshop(); patchOlvApplet(); + patchAccountSettings(); install_matchmaking_patches(); } else { DEBUG_FUNCTION_LINE("FunctionPatcher_InitLibrary failed"); @@ -218,10 +219,7 @@ WUMS_APPLICATION_STARTS() { setup_olv_libs(); peertopeer_patch(); matchmaking_notify_titleswitch(); - - if (isAccountSettingsTitle()) { - patchAccountSettings(); - } + hotpatchAccountSettings(); } WUMS_APPLICATION_ENDS() { diff --git a/src/patches/account_settings.cpp b/src/patches/account_settings.cpp index eef820f..232782f 100644 --- a/src/patches/account_settings.cpp +++ b/src/patches/account_settings.cpp @@ -52,7 +52,13 @@ const char wave_original[] = "saccount.nintendo.net"; const char wave_new[] = "saccount.pretendo.cc"; -bool isAccountSettingsTitle(); +static bool isAccountSettingsTitle() { + return (OSGetTitleID() != 0 && ( + OSGetTitleID() == ACCOUNT_SETTINGS_TID_J || + OSGetTitleID() == ACCOUNT_SETTINGS_TID_U || + OSGetTitleID() == ACCOUNT_SETTINGS_TID_E + )); +} static std::optional rootca_pem_handle{}; std::vector account_patches; @@ -104,15 +110,25 @@ DECL_FUNCTION(FSStatus, FSCloseFile_accSettings, FSClient *client, FSCmdBlock *b return real_FSCloseFile_accSettings(client, block, handle, errorMask); } -bool isAccountSettingsTitle() { - return (OSGetTitleID() != 0 && ( - OSGetTitleID() == ACCOUNT_SETTINGS_TID_J || - OSGetTitleID() == ACCOUNT_SETTINGS_TID_U || - OSGetTitleID() == ACCOUNT_SETTINGS_TID_E - )); +bool patchAccountSettings() { + account_patches.reserve(3); + + auto add_patch = [](function_replacement_data_t repl, const char *name) { + PatchedFunctionHandle handle = 0; + if (FunctionPatcher_AddFunctionPatch(&repl, &handle, nullptr) != FUNCTION_PATCHER_RESULT_SUCCESS) { + DEBUG_FUNCTION_LINE("Inkay/Account: Failed to patch %s!", name); + } + account_patches.push_back(handle); + }; + + add_patch(REPLACE_FUNCTION_FOR_PROCESS(FSOpenFile_accSettings, LIBRARY_COREINIT, FSOpenFile, FP_TARGET_PROCESS_GAME), "FSOpenFile_accSettings"); + add_patch(REPLACE_FUNCTION_FOR_PROCESS(FSReadFile_accSettings, LIBRARY_COREINIT, FSReadFile, FP_TARGET_PROCESS_GAME), "FSReadFile_accSettings"); + add_patch(REPLACE_FUNCTION_FOR_PROCESS(FSCloseFile_accSettings, LIBRARY_COREINIT, FSCloseFile, FP_TARGET_PROCESS_GAME), "FSCloseFile_accSettings"); + + return true; } -bool patchAccountSettings() { +bool hotpatchAccountSettings() { if(!isAccountSettingsTitle()) { return false; } @@ -134,20 +150,6 @@ bool patchAccountSettings() { return false; } - account_patches.reserve(3); - - auto add_patch = [](function_replacement_data_t repl, const char *name) { - PatchedFunctionHandle handle = 0; - if (FunctionPatcher_AddFunctionPatch(&repl, &handle, nullptr) != FUNCTION_PATCHER_RESULT_SUCCESS) { - DEBUG_FUNCTION_LINE("Inkay/Account: Failed to patch %s!", name); - } - account_patches.push_back(handle); - }; - - add_patch(REPLACE_FUNCTION_FOR_PROCESS(FSOpenFile_accSettings, LIBRARY_COREINIT, FSOpenFile, FP_TARGET_PROCESS_GAME), "FSOpenFile_accSettings"); - add_patch(REPLACE_FUNCTION_FOR_PROCESS(FSReadFile_accSettings, LIBRARY_COREINIT, FSReadFile, FP_TARGET_PROCESS_GAME), "FSReadFile_accSettings"); - add_patch(REPLACE_FUNCTION_FOR_PROCESS(FSCloseFile_accSettings, LIBRARY_COREINIT, FSCloseFile, FP_TARGET_PROCESS_GAME), "FSCloseFile_accSettings"); - return true; } diff --git a/src/patches/account_settings.h b/src/patches/account_settings.h index 4cc77be..c38d1b0 100644 --- a/src/patches/account_settings.h +++ b/src/patches/account_settings.h @@ -15,7 +15,6 @@ #pragma once -bool isAccountSettingsTitle(); - bool patchAccountSettings(); +bool hotpatchAccountSettings(); void unpatchAccountSettings();