From fddf436554ed119de29a6a7a19c270609227f6cf Mon Sep 17 00:00:00 2001 From: Maschell Date: Fri, 1 Jan 2021 02:06:03 +0100 Subject: [PATCH] Call INIT_WUT and FINI_WUT for modules, make sure APPLICATION_ENDS and FINI_WUT hooks are actually called by a sepeate module --- relocator/src/entry.cpp | 33 ++++++++++++++++++++++++++++----- 1 file changed, 28 insertions(+), 5 deletions(-) diff --git a/relocator/src/entry.cpp b/relocator/src/entry.cpp index 615eede..ad6bafa 100644 --- a/relocator/src/entry.cpp +++ b/relocator/src/entry.cpp @@ -115,6 +115,27 @@ extern "C" void doStart(int argc, char **argv) { std::vector loadedModulesUnordered = ModuleDataPersistence::loadModuleData(gModuleData); std::vector loadedModules = OrderModulesByDependencies(loadedModulesUnordered); + + bool applicationEndHookLoaded = false; + for (auto &curModule : loadedModules) { + if (curModule.getExportName() == "homebrew_applicationendshook") { + DEBUG_FUNCTION_LINE("We have ApplicationEndsHook Module!\n"); + applicationEndHookLoaded = true; + break; + } + } + + // Make sure WUMS_HOOK_APPLICATION_ENDS and WUMS_HOOK_FINI_WUT are called + for (auto &curModule : loadedModules) { + for (auto &curHook : curModule.getHookDataList()) { + if (curHook.getType() == WUMS_HOOK_APPLICATION_ENDS || curHook.getType() == WUMS_HOOK_FINI_WUT) { + if (!applicationEndHookLoaded) { + OSFatal_printf("%s requires module homebrew_applicationendshook", curModule.getExportName().c_str()); + } + } + } + } + DEBUG_FUNCTION_LINE("Number of modules %d\n", gModuleData->number_used_modules); if (!gInitCalled) { gInitCalled = 1; @@ -124,13 +145,16 @@ extern "C" void doStart(int argc, char **argv) { for (auto &curModule : loadedModules) { if (curModule.isInitBeforeRelocationDoneHook()) { + CallHook(loadedModules, WUMS_HOOK_INIT_WUT); CallHook(curModule, WUMS_HOOK_INIT); + CallHook(loadedModules, WUMS_HOOK_FINI_WUT); } } DEBUG_FUNCTION_LINE("Relocations done\n"); CallHook(loadedModules, WUMS_HOOK_RELOCATIONS_DONE); + for (int i = 0; i < gModuleData->number_used_modules; i++) { if (!gModuleData->module_data[i].skipEntrypoint) { DEBUG_FUNCTION_LINE("About to call %08X\n", gModuleData->module_data[i].entrypoint); @@ -141,7 +165,9 @@ extern "C" void doStart(int argc, char **argv) { for (auto &curModule : loadedModules) { if (!curModule.isInitBeforeRelocationDoneHook()) { + CallHook(loadedModules, WUMS_HOOK_INIT_WUT); CallHook(curModule, WUMS_HOOK_INIT); + CallHook(loadedModules, WUMS_HOOK_FINI_WUT); } } } else { @@ -149,12 +175,9 @@ extern "C" void doStart(int argc, char **argv) { ResolveRelocations(loadedModules); CallHook(loadedModules, WUMS_HOOK_RELOCATIONS_DONE); } - - // TODO: Implement Application ends hook - // CallHook(loadedModules, WUMS_HOOK_FINI_WUT); - // CallHook(loadedModules, WUMS_HOOK_INIT_WUT); - + CallHook(loadedModules, WUMS_HOOK_INIT_WUT); CallHook(loadedModules, WUMS_HOOK_APPLICATION_STARTS); + //CallHook(loadedModules, WUMS_HOOK_FINI_WUT); } std::vector OrderModulesByDependencies(const std::vector &loadedModules) {