diff --git a/relocator/src/ModuleDataPersistence.cpp b/relocator/src/ModuleDataPersistence.cpp index 689cf58..9a4a633 100644 --- a/relocator/src/ModuleDataPersistence.cpp +++ b/relocator/src/ModuleDataPersistence.cpp @@ -31,7 +31,7 @@ std::vector ModuleDataPersistence::loadModuleData(module_information moduleData.setEntrypoint(module_data->entrypoint); moduleData.setStartAddress(module_data->startAddress); moduleData.setEndAddress(module_data->endAddress); - + moduleData.setInitBeforeEntrypoint(module_data->initBeforeEntrypoint); moduleData.setExportName(module_data->module_export_name); diff --git a/relocator/src/entry.cpp b/relocator/src/entry.cpp index 545df54..aea400f 100644 --- a/relocator/src/entry.cpp +++ b/relocator/src/entry.cpp @@ -151,36 +151,8 @@ extern "C" void doStart(int argc, char **argv) { DEBUG_FUNCTION_LINE("Try to call kernel init\n"); // Call init hook of kernel for (auto &curModule : loadedModules) { - if (curModule.getExportName().compare("homebrew_kernel") == 0) { + if (curModule.isInitBeforeEntrypoint()) { CallHook(curModule, WUMS_HOOK_INIT); - break; - } - } - - DEBUG_FUNCTION_LINE("Try to call homebrew_functionpatcher init\n"); - // Call init hook of memory mapping - for (auto &curModule : loadedModules) { - if (curModule.getExportName().compare("homebrew_functionpatcher") == 0) { - CallHook(curModule, WUMS_HOOK_INIT); - break; - } - } - - DEBUG_FUNCTION_LINE("Try to call dynloadpatch init\n"); - // Call init hook of memory mapping - for (auto &curModule : loadedModules) { - if (curModule.getExportName().compare("homebrew_dynloadpatch") == 0) { - CallHook(curModule, WUMS_HOOK_INIT); - break; - } - } - - DEBUG_FUNCTION_LINE("Try to call memory mapping init\n"); - // Call init hook of memory mapping - for (auto &curModule : loadedModules) { - if (curModule.getExportName().compare("homebrew_memorymapping") == 0) { - CallHook(curModule, WUMS_HOOK_INIT); - break; } } @@ -194,11 +166,7 @@ extern "C" void doStart(int argc, char **argv) { } for (auto &curModule : loadedModules) { - if ((curModule.getExportName().compare("homebrew_memorymapping") != 0) && - (curModule.getExportName().compare("homebrew_functionpatcher") != 0) && - (curModule.getExportName().compare("homebrew_dynloadpatch") != 0) && - (curModule.getExportName().compare("homebrew_kernel") != 0) - ) { + if (!curModule.isInitBeforeEntrypoint()) { CallHook(curModule, WUMS_HOOK_INIT); } } @@ -265,4 +233,4 @@ std::vector OrderModulesByDependencies(const std::vector } } return finalOrder; -} +} \ No newline at end of file diff --git a/source/module/ModuleData.h b/source/module/ModuleData.h index ceb17d6..6d5f8fa 100644 --- a/source/module/ModuleData.h +++ b/source/module/ModuleData.h @@ -70,6 +70,7 @@ public: const std::vector &getExportDataList() const { return export_data_list; } + void addHookData(const HookData &data) { hook_data_list.push_back(data); } @@ -131,6 +132,14 @@ public: return this->export_name; } + bool isInitBeforeEntrypoint() const { + return this->initBeforeEntrypoint; + } + + void setInitBeforeEntrypoint(bool value) { + this->initBeforeEntrypoint = value; + } + private: std::vector relocation_data_list; std::vector export_data_list; @@ -146,4 +155,5 @@ private: uint32_t startAddress = 0; uint32_t endAddress = 0; uint32_t entrypoint = 0; + bool initBeforeEntrypoint = false; }; diff --git a/source/module/ModuleDataFactory.cpp b/source/module/ModuleDataFactory.cpp index abcf3e4..2148d73 100644 --- a/source/module/ModuleDataFactory.cpp +++ b/source/module/ModuleDataFactory.cpp @@ -184,7 +184,12 @@ std::optional ModuleDataFactory::load(std::string path, uint32_t* de if (key.compare("export_name") == 0) { DEBUG_FUNCTION_LINE("export_name = %s", value.c_str()); moduleData.setExportName(value); - }else if (key.compare("wums") == 0) { + }else if (key.compare("initBeforeEntrypoint") == 0) { + if (value.compare("true") == 0) { + DEBUG_FUNCTION_LINE("initBeforeEntrypoint = %s", value.c_str()); + moduleData.setInitBeforeEntrypoint(true); + } + }if (key.compare("wums") == 0) { if (value.compare("0.1") != 0) { 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 e821d69..5693516 100644 --- a/source/module/ModuleDataPersistence.cpp +++ b/source/module/ModuleDataPersistence.cpp @@ -70,8 +70,8 @@ bool ModuleDataPersistence::saveModuleData(module_information_t *moduleInformati module_data->sbssSize = module.getSBSSSize(); module_data->startAddress = module.getStartAddress(); module_data->endAddress = module.getEndAddress(); - module_data->entrypoint = module.getEntrypoint(); + module_data->initBeforeEntrypoint = module.isInitBeforeEntrypoint(); moduleInformation->number_used_modules++; @@ -104,8 +104,8 @@ std::vector ModuleDataPersistence::loadModuleData(module_information moduleData.setEntrypoint(module_data->entrypoint); moduleData.setStartAddress(module_data->startAddress); moduleData.setEndAddress(module_data->endAddress); - moduleData.setExportName(module_data->module_export_name); + moduleData.setInitBeforeEntrypoint(module_data->initBeforeEntrypoint); for (uint32_t j = 0; j < EXPORT_ENTRY_LIST_LENGTH; j++) { export_data_t *export_entry = &(module_data->export_entries[j]);