Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions source/globals.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ StoredBuffer gStoredTVBuffer = {};
StoredBuffer gStoredDRCBuffer = {};

std::vector<PluginContainer> gLoadedPlugins;
std::vector<PluginContainer> gPluginsToBeDeInitialized;

std::set<std::shared_ptr<PluginData>, PluginDataSharedPtrComparator> gLoadedData;
std::vector<PluginLoadWrapper> gLoadOnNextLaunch;
Expand Down
1 change: 1 addition & 0 deletions source/globals.h
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@ extern StoredBuffer gStoredTVBuffer;
extern StoredBuffer gStoredDRCBuffer;

extern std::vector<PluginContainer> gLoadedPlugins;
extern std::vector<PluginContainer> gPluginsToBeDeInitialized;

extern std::set<std::shared_ptr<PluginData>, PluginDataSharedPtrComparator> gLoadedData;
extern std::vector<PluginLoadWrapper> gLoadOnNextLaunch;
Expand Down
12 changes: 7 additions & 5 deletions source/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -154,7 +154,7 @@ WUMS_APPLICATION_ENDS() {
}

void CheckCleanupCallbackUsage(const std::vector<PluginContainer> &plugins);
void CleanupPlugins(std::vector<PluginContainer> &&pluginsToDeinit);
void CleanupPlugins(std::vector<PluginContainer> &pluginsToDeinit);


WUMS_APPLICATION_STARTS() {
Expand Down Expand Up @@ -283,11 +283,12 @@ WUMS_APPLICATION_STARTS() {
}

// deinit all plugins that are still in gLoadedPlugins list.
std::vector<PluginContainer> 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);
Expand Down Expand Up @@ -338,7 +339,7 @@ WUMS_APPLICATION_STARTS() {
}
}

void CleanupPlugins(std::vector<PluginContainer> &&pluginsToDeinit) {
void CleanupPlugins(std::vector<PluginContainer> &pluginsToDeinit) {
auto *currentThread = OSGetCurrentThread();
const auto saved_reent = currentThread->reserved[4];
const auto saved_cleanupCallback = currentThread->cleanupCallback;
Expand All @@ -350,6 +351,7 @@ void CleanupPlugins(std::vector<PluginContainer> &&pluginsToDeinit) {
currentThread->reserved[4] = 0;

CallHook(pluginsToDeinit, WUPS_LOADER_HOOK_DEINIT_PLUGIN);
CallHook(pluginsToDeinit, WUPS_LOADER_HOOK_FINI_WRAPPER);

CheckCleanupCallbackUsage(pluginsToDeinit);

Expand Down
58 changes: 33 additions & 25 deletions source/patcher/hooks_patcher_static.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
#include "plugin/PluginData.h"
#include "plugin/SectionInfo.h"
#include "utils/config/ConfigUtils.h"
#include "utils/logger.h"

#include <coreinit/cache.h>
#include <coreinit/core.h>
Expand Down Expand Up @@ -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<PluginContainer> *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<uint32_t>(functionSymbolData->getAddress());
}
return 0;
}

strncpy(symbolNameBuffer, ".text", symbolNameBufferLength - 1);
symbolNameBuffer[symbolNameBufferLength - 1] = '\0';
if (outDistance) {
*outDistance = addr - reinterpret_cast<uint32_t>(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;
}
}

Expand All @@ -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;
Expand Down