From 0a4652c10a24dfadbf95240a4198223613b77a70 Mon Sep 17 00:00:00 2001 From: Maschell Date: Sun, 3 May 2020 14:16:11 +0200 Subject: [PATCH] Add a function to unload all plugins from memory in the PluginManagement --- source/PluginManagement.cpp | 35 +++++++++++++++++++++++++++++++++++ source/PluginManagement.h | 2 ++ 2 files changed, 37 insertions(+) diff --git a/source/PluginManagement.cpp b/source/PluginManagement.cpp index bf6b7e2..fde9aca 100644 --- a/source/PluginManagement.cpp +++ b/source/PluginManagement.cpp @@ -67,6 +67,41 @@ void PluginManagement::memsetBSS(const std::vector &plugins) { } } + +void PluginManagement::unloadPlugins(plugin_information_t *gPluginInformation, MEMHeapHandle pluginHeap) { + for (int32_t plugin_index = 0; plugin_index < gPluginInformation->number_used_plugins; plugin_index++) { + DEBUG_FUNCTION_LINE(); + plugin_information_single_t *plugin = &(gPluginInformation->plugin_data[plugin_index]); + if (plugin->data.buffer != nullptr) { + if (plugin->data.memoryType == eMemTypeMEM2) { + DEBUG_FUNCTION_LINE("free %08X", plugin->data.buffer); + free(plugin->data.buffer); + } else if (plugin->data.memoryType == eMemTypeExpHeap) { + DEBUG_FUNCTION_LINE("free %08X on EXP heap %08X", plugin->data.buffer, plugin->data.heapHandle); + MEMFreeToExpHeap((MEMHeapHandle) plugin->data.heapHandle, plugin->data.buffer); + } else { + DEBUG_FUNCTION_LINE("########################"); + DEBUG_FUNCTION_LINE("Failed to free memory from plugin"); + DEBUG_FUNCTION_LINE("########################"); + } + plugin->data.bufferLength = 0; + } else { + DEBUG_FUNCTION_LINE("Plugin has no copy of elf save in memory, can't free it"); + } + + if (plugin->info.allocatedTextMemoryAddress != nullptr) { + MEMFreeToExpHeap((MEMHeapHandle) pluginHeap, plugin->info.allocatedTextMemoryAddress); + DEBUG_FUNCTION_LINE("Freed %08X",plugin->info.allocatedTextMemoryAddress); + } + if (plugin->info.allocatedDataMemoryAddress != nullptr) { + MEMFreeToExpHeap((MEMHeapHandle) pluginHeap, plugin->info.allocatedDataMemoryAddress); + DEBUG_FUNCTION_LINE("Freed %08X",plugin->info.allocatedDataMemoryAddress); + } + } + memset((void *) gPluginInformation, 0, sizeof(plugin_information_t)); +} + + void PluginManagement::callInitHooks(plugin_information_t *pluginInformation) { CallHook(pluginInformation, WUPS_LOADER_HOOK_INIT_VID_MEM); CallHook(pluginInformation, WUPS_LOADER_HOOK_INIT_KERNEL); diff --git a/source/PluginManagement.h b/source/PluginManagement.h index 59b3eac..40cb8c8 100644 --- a/source/PluginManagement.h +++ b/source/PluginManagement.h @@ -16,4 +16,6 @@ public: static void PatchFunctionsAndCallHooks(plugin_information_t *gPluginInformation); static bool doRelocation(const std::vector &relocData, relocation_trampolin_entry_t *tramp_data, uint32_t tramp_length, uint32_t trampolinID); + + static void unloadPlugins(plugin_information_t * pluginInformation, MEMHeapHandle pluginHeap); }; \ No newline at end of file