diff --git a/source/globals.cpp b/source/globals.cpp index 01f6771..749c750 100644 --- a/source/globals.cpp +++ b/source/globals.cpp @@ -14,6 +14,7 @@ StoredBuffer gStoredTVBuffer = {}; StoredBuffer gStoredDRCBuffer = {}; std::vector gLoadedPlugins; +std::vector gPluginsToBeDeInitialized; std::set, PluginDataSharedPtrComparator> gLoadedData; std::vector gLoadOnNextLaunch; diff --git a/source/globals.h b/source/globals.h index 52d9528..b45e134 100644 --- a/source/globals.h +++ b/source/globals.h @@ -26,6 +26,7 @@ extern StoredBuffer gStoredTVBuffer; extern StoredBuffer gStoredDRCBuffer; extern std::vector gLoadedPlugins; +extern std::vector gPluginsToBeDeInitialized; extern std::set, PluginDataSharedPtrComparator> gLoadedData; extern std::vector gLoadOnNextLaunch; diff --git a/source/main.cpp b/source/main.cpp index 3ca864f..e1fa5d7 100644 --- a/source/main.cpp +++ b/source/main.cpp @@ -154,7 +154,7 @@ WUMS_APPLICATION_ENDS() { } void CheckCleanupCallbackUsage(const std::vector &plugins); -void CleanupPlugins(std::vector &&pluginsToDeinit); +void CleanupPlugins(std::vector &pluginsToDeinit); WUMS_APPLICATION_STARTS() { @@ -283,11 +283,12 @@ WUMS_APPLICATION_STARTS() { } // deinit all plugins that are still in gLoadedPlugins list. - std::vector pluginsToDeinit = std::move(gLoadedPlugins); - gLoadedPlugins = std::move(pluginsToKeep); + gPluginsToBeDeInitialized = std::move(gLoadedPlugins); + gLoadedPlugins = std::move(pluginsToKeep); DEBUG_FUNCTION_LINE("Deinit unused plugins"); - CleanupPlugins(std::move(pluginsToDeinit)); + CleanupPlugins(gPluginsToBeDeInitialized); + gPluginsToBeDeInitialized.clear(); DEBUG_FUNCTION_LINE("Load new plugins"); newLoadedPlugins = PluginManagement::loadPlugins(toBeLoaded); @@ -338,7 +339,7 @@ WUMS_APPLICATION_STARTS() { } } -void CleanupPlugins(std::vector &&pluginsToDeinit) { +void CleanupPlugins(std::vector &pluginsToDeinit) { auto *currentThread = OSGetCurrentThread(); const auto saved_reent = currentThread->reserved[4]; const auto saved_cleanupCallback = currentThread->cleanupCallback; @@ -350,6 +351,7 @@ void CleanupPlugins(std::vector &&pluginsToDeinit) { currentThread->reserved[4] = 0; CallHook(pluginsToDeinit, WUPS_LOADER_HOOK_DEINIT_PLUGIN); + CallHook(pluginsToDeinit, WUPS_LOADER_HOOK_FINI_WRAPPER); CheckCleanupCallbackUsage(pluginsToDeinit); diff --git a/source/patcher/hooks_patcher_static.cpp b/source/patcher/hooks_patcher_static.cpp index 75e163c..5f06921 100644 --- a/source/patcher/hooks_patcher_static.cpp +++ b/source/patcher/hooks_patcher_static.cpp @@ -7,6 +7,7 @@ #include "plugin/PluginData.h" #include "plugin/SectionInfo.h" #include "utils/config/ConfigUtils.h" +#include "utils/logger.h" #include #include @@ -170,43 +171,49 @@ DECL_FUNCTION(void, WPADRead, WPADChan chan, WPADStatus *data) { DECL_FUNCTION(uint32_t, SC17_FindClosestSymbol, uint32_t addr, - uint32_t *outDistance, + int32_t *outDistance, char *symbolNameBuffer, uint32_t symbolNameBufferLength, char *moduleNameBuffer, uint32_t moduleNameBufferLength) { if (symbolNameBuffer && symbolNameBufferLength > 0 && moduleNameBuffer && moduleNameBufferLength > 0) { - for (const auto &plugin : gLoadedPlugins) { - if (!plugin.isLinkedAndLoaded()) { - continue; - } - const auto sectionInfo = plugin.getPluginLinkInformation().getSectionInfo(".text"); - if (!sectionInfo) { - continue; - } + const std::vector *pluginLists[] = {&gLoadedPlugins, &gPluginsToBeDeInitialized}; + for (const auto *list : pluginLists) { + for (const auto &plugin : *list) { + if (!plugin.isLinkedAndLoaded()) { + continue; + } - if (!sectionInfo->isInSection(addr)) { - continue; - } - strncpy(moduleNameBuffer, plugin.getMetaInformation().getName().c_str(), moduleNameBufferLength - 1); - moduleNameBuffer[moduleNameBufferLength - 1] = '\0'; - if (const auto functionSymbolData = plugin.getPluginLinkInformation().getNearestFunctionSymbolData(addr)) { - strncpy(symbolNameBuffer, functionSymbolData->getName().c_str(), symbolNameBufferLength - 1); + const auto sectionInfo = plugin.getPluginLinkInformation().getSectionInfo(".text"); + if (!sectionInfo) { + continue; + } + + if (!sectionInfo->isInSection(addr)) { + continue; + } + + + strncpy(moduleNameBuffer, plugin.getMetaInformation().getName().c_str(), moduleNameBufferLength - 1); + moduleNameBuffer[moduleNameBufferLength - 1] = '\0'; + if (const auto functionSymbolData = plugin.getPluginLinkInformation().getNearestFunctionSymbolData(addr)) { + strncpy(symbolNameBuffer, functionSymbolData->getName().c_str(), symbolNameBufferLength - 1); + symbolNameBuffer[symbolNameBufferLength - 1] = '\0'; + if (outDistance) { + *outDistance = addr - reinterpret_cast(functionSymbolData->getAddress()); + } + return 0; + } + + strncpy(symbolNameBuffer, ".text", symbolNameBufferLength - 1); symbolNameBuffer[symbolNameBufferLength - 1] = '\0'; if (outDistance) { - *outDistance = addr - reinterpret_cast(functionSymbolData->getAddress()); + *outDistance = addr - sectionInfo->getAddress(); } - return 0; - } - strncpy(symbolNameBuffer, ".text", symbolNameBufferLength - 1); - symbolNameBuffer[symbolNameBufferLength - 1] = '\0'; - if (outDistance) { - *outDistance = addr - sectionInfo->getAddress(); + return 0; } - - return 0; } } @@ -219,6 +226,7 @@ DECL_FUNCTION(uint32_t, KiGetAppSymbolName, uint32_t addr, char *buffer, int32_t if (!plugin.isLinkedAndLoaded()) { continue; } + const auto sectionInfo = plugin.getPluginLinkInformation().getSectionInfo(".text"); if (!sectionInfo) { continue;