diff --git a/Dockerfile b/Dockerfile index 3bed588..2a89983 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,5 @@ FROM wiiuenv/devkitppc:20210101 -COPY --from=wiiuenv/wiiumodulesystem:20210101 /artifacts $DEVKITPRO +COPY --from=wiiuenv/wiiumodulesystem:20210219 /artifacts $DEVKITPRO WORKDIR project \ No newline at end of file diff --git a/relocator/src/ModuleDataPersistence.cpp b/relocator/src/ModuleDataPersistence.cpp index bc901ed..4379ff2 100644 --- a/relocator/src/ModuleDataPersistence.cpp +++ b/relocator/src/ModuleDataPersistence.cpp @@ -32,6 +32,7 @@ std::vector ModuleDataPersistence::loadModuleData(module_information moduleData.setStartAddress(module_data->startAddress); moduleData.setEndAddress(module_data->endAddress); moduleData.setSkipEntrypoint(module_data->skipEntrypoint); + moduleData.setSkipWUTInit(module_data->skipWUTInit); moduleData.setInitBeforeRelocationDoneHook(module_data->initBeforeRelocationDoneHook); moduleData.setExportName(module_data->module_export_name); diff --git a/relocator/src/hooks.cpp b/relocator/src/hooks.cpp index 686a3fb..eeff88f 100644 --- a/relocator/src/hooks.cpp +++ b/relocator/src/hooks.cpp @@ -17,12 +17,17 @@ void CallHook(const std::vector &modules, wums_hook_type_t type) { } } - void CallHook(const ModuleData &module, wums_hook_type_t type) { if(!module.relocationsDone){ DEBUG_FUNCTION_LINE("Hook not called because the relocations failed\n"); return; } + + if ((type == WUMS_HOOK_INIT_WUT || type == WUMS_HOOK_FINI_WUT) && module.isSkipWUTInit()) { + DEBUG_FUNCTION_LINE("Skip WUMS_HOOK_INIT_WUT/WUMS_HOOK_FINI_WUT for %s\n", module.getExportName().c_str()); + return; + } + for (auto &curHook : module.getHookDataList()) { auto func_ptr = (uint32_t) curHook.getTarget(); if (func_ptr == 0) { diff --git a/source/module/ModuleData.h b/source/module/ModuleData.h index a1b73de..2e419fa 100644 --- a/source/module/ModuleData.h +++ b/source/module/ModuleData.h @@ -140,6 +140,10 @@ public: return this->initBeforeRelocationDoneHook; } + [[nodiscard]] bool isSkipWUTInit() const { + return this->skipWUTInit; + } + void setSkipEntrypoint(bool value) { this->skipEntrypoint = value; } @@ -147,6 +151,10 @@ public: this->initBeforeRelocationDoneHook = value; } + void setSkipWUTInit(bool value) { + this->skipWUTInit = value; + } + bool relocationsDone = false; private: std::vector relocation_data_list; @@ -165,4 +173,5 @@ private: uint32_t entrypoint = 0; bool skipEntrypoint = false; bool initBeforeRelocationDoneHook = false; + bool skipWUTInit = false; }; diff --git a/source/module/ModuleDataFactory.cpp b/source/module/ModuleDataFactory.cpp index 1cfd094..dcf3e70 100644 --- a/source/module/ModuleDataFactory.cpp +++ b/source/module/ModuleDataFactory.cpp @@ -186,22 +186,33 @@ std::optional ModuleDataFactory::load(std::string path, uint32_t *de std::string key(curEntry); std::string value(curEntry + firstFound + 1); - if (key.compare("export_name") == 0) { + if (key == "export_name") { DEBUG_FUNCTION_LINE("export_name = %s", value.c_str()); moduleData.setExportName(value); - } else if (key.compare("skipEntrypoint") == 0) { - if (value.compare("true") == 0) { + } else if (key == "skipEntrypoint") { + if (value == "true") { DEBUG_FUNCTION_LINE("skipEntrypoint = %s", value.c_str()); moduleData.setSkipEntrypoint(true); + } else { + moduleData.setSkipEntrypoint(false); } - } else if (key.compare("initBeforeRelocationDoneHook") == 0) { - if (value.compare("true") == 0) { + } else if (key == "initBeforeRelocationDoneHook") { + if (value == "true") { DEBUG_FUNCTION_LINE("initBeforeRelocationDoneHook = %s", value.c_str()); moduleData.setInitBeforeRelocationDoneHook(true); + } else { + moduleData.setInitBeforeRelocationDoneHook(false); + } + } else if (key == "skipwutInit") { + if (value == "true") { + DEBUG_FUNCTION_LINE("skipwutInit = %s", value.c_str()); + moduleData.setSkipWUTInit(true); + } else { + moduleData.setSkipWUTInit(false); } } - if (key.compare("wums") == 0) { - if (value.compare("0.1") != 0) { + if (key == "wums") { + if (value != "0.1") { DEBUG_FUNCTION_LINE("Warning: Ignoring module - Unsupported WUMS version: %s.\n", value.c_str()); return std::nullopt; } diff --git a/source/module/ModuleDataPersistence.cpp b/source/module/ModuleDataPersistence.cpp index 3820b3f..d715daa 100644 --- a/source/module/ModuleDataPersistence.cpp +++ b/source/module/ModuleDataPersistence.cpp @@ -73,6 +73,7 @@ bool ModuleDataPersistence::saveModuleData(module_information_t *moduleInformati module_data->entrypoint = module.getEntrypoint(); module_data->skipEntrypoint = module.isSkipEntrypoint(); module_data->initBeforeRelocationDoneHook = module.isInitBeforeRelocationDoneHook(); + module_data->skipWUTInit = module.isSkipWUTInit(); moduleInformation->number_used_modules++;