diff --git a/source/PluginManagement.cpp b/source/PluginManagement.cpp index 3a0c900..ba6414a 100644 --- a/source/PluginManagement.cpp +++ b/source/PluginManagement.cpp @@ -2,7 +2,7 @@ #include "NotificationsUtils.h" #include "hooks.h" #include "plugin/PluginContainer.h" -#include "plugin/PluginInformationFactory.h" +#include "plugin/PluginLinkInformationFactory.h" #include "plugin/PluginMetaInformationFactory.h" #include "utils/ElfUtils.h" #include "utils/StringTools.h" @@ -24,14 +24,14 @@ PluginManagement::loadPlugins(const std::set, Plugin auto metaInfo = PluginMetaInformationFactory::loadPlugin(*pluginData, error); if (metaInfo && error == PLUGIN_PARSE_ERROR_NONE) { - auto info = PluginInformationFactory::load(*pluginData, trampolineData, sTrampolineID++); - if (!info) { + auto linkInfo = PluginLinkInformationFactory::load(*pluginData, trampolineData, sTrampolineID++); + if (!linkInfo) { auto errMsg = string_format("Failed to load plugin: %s", pluginData->getSource().c_str()); DEBUG_FUNCTION_LINE_ERR("%s", errMsg.c_str()); DisplayErrorNotificationMessage(errMsg, 15.0f); continue; } - plugins.emplace_back(std::move(*metaInfo), std::move(*info), pluginData); + plugins.emplace_back(std::move(*metaInfo), std::move(linkInfo), pluginData); } else { auto errMsg = string_format("Failed to load plugin: %s", pluginData->getSource().c_str()); if (error == PLUGIN_PARSE_ERROR_INCOMPATIBLE_VERSION) { @@ -138,10 +138,13 @@ bool PluginManagement::doRelocations(const std::vector &plugins OSDynLoad_SetAllocator(CustomDynLoadAlloc, CustomDynLoadFree); for (const auto &pluginContainer : plugins) { + if (!pluginContainer.isPluginLinkedAndLoaded()) { + continue; + } DEBUG_FUNCTION_LINE_VERBOSE("Doing relocations for plugin: %s", pluginContainer.getMetaInformation().getName().c_str()); - if (!PluginManagement::doRelocation(pluginContainer.getPluginInformation().getRelocationDataList(), + if (!PluginManagement::doRelocation(pluginContainer.getPluginLinkInformation()->getRelocationDataList(), trampData, - pluginContainer.getPluginInformation().getTrampolineId(), + pluginContainer.getPluginLinkInformation()->getTrampolineId(), usedRPls)) { return false; } @@ -154,7 +157,10 @@ bool PluginManagement::doRelocations(const std::vector &plugins bool PluginManagement::RestoreFunctionPatches(std::vector &plugins) { for (auto &cur : std::ranges::reverse_view(plugins)) { - for (auto &curFunction : std::ranges::reverse_view(cur.getPluginInformation().getFunctionDataList())) { + if (!cur.isPluginLinkedAndLoaded()) { + continue; + } + for (auto &curFunction : std::ranges::reverse_view(cur.getPluginLinkInformation()->getFunctionDataList())) { if (!curFunction.RemovePatch()) { DEBUG_FUNCTION_LINE_ERR("Failed to remove function patch for: plugin %s", cur.getMetaInformation().getName().c_str()); return false; @@ -166,7 +172,10 @@ bool PluginManagement::RestoreFunctionPatches(std::vector &plug bool PluginManagement::DoFunctionPatches(std::vector &plugins) { for (auto &cur : plugins) { - for (auto &curFunction : cur.getPluginInformation().getFunctionDataList()) { + if (!cur.isPluginLinkedAndLoaded()) { + continue; + } + for (auto &curFunction : cur.getPluginLinkInformation()->getFunctionDataList()) { if (!curFunction.AddPatch()) { DEBUG_FUNCTION_LINE_ERR("Failed to add function patch for: plugin %s", cur.getMetaInformation().getName().c_str()); return false; diff --git a/source/hooks.cpp b/source/hooks.cpp index 8ee67e9..3a31182 100644 --- a/source/hooks.cpp +++ b/source/hooks.cpp @@ -44,6 +44,9 @@ void CallHook(const std::vector &plugins, const wups_loader_hoo void CallHook(const std::vector &plugins, const wups_loader_hook_type_t hook_type, const std::function &pred) { DEBUG_FUNCTION_LINE_VERBOSE("Calling hook of type %s [%d]", hook_names[hook_type], hook_type); for (const auto &plugin : plugins) { + if (!plugin.isPluginLinkedAndLoaded()) { + return; + } if (pred(plugin)) { CallHook(plugin, hook_type); } @@ -51,7 +54,10 @@ void CallHook(const std::vector &plugins, const wups_loader_hoo } void CallHook(const PluginContainer &plugin, wups_loader_hook_type_t hook_type) { - for (const auto &hook : plugin.getPluginInformation().getHookDataList()) { + if (!plugin.isPluginLinkedAndLoaded()) { + return; + } + for (const auto &hook : plugin.getPluginLinkInformation()->getHookDataList()) { if (hook.getType() == hook_type) { DEBUG_FUNCTION_LINE_VERBOSE("Calling hook of type %s for plugin %s [%d]", hook_names[hook.getType()], plugin.getMetaInformation().getName().c_str(), hook_type); void *func_ptr = hook.getFunctionPointer(); diff --git a/source/main.cpp b/source/main.cpp index d8ddaee..595586f 100644 --- a/source/main.cpp +++ b/source/main.cpp @@ -217,7 +217,7 @@ void CleanupPlugins(std::vector &&pluginsToDeinit) { for (const auto &pluginContainer : pluginsToDeinit) { for (auto &cur : gTrampData) { - if (cur.id != pluginContainer.getPluginInformation().getTrampolineId()) { + if (!pluginContainer.isPluginLinkedAndLoaded() || cur.id != pluginContainer.getPluginLinkInformation()->getTrampolineId()) { continue; } cur.status = RELOC_TRAMP_FREE; @@ -227,7 +227,10 @@ void CleanupPlugins(std::vector &&pluginsToDeinit) { void CheckCleanupCallbackUsage(const std::vector &plugins) { auto *curThread = OSGetCurrentThread(); for (const auto &cur : plugins) { - const auto textSection = cur.getPluginInformation().getSectionInfo(".text"); + if (!cur.isPluginLinkedAndLoaded()) { + continue; + } + const auto textSection = cur.getPluginLinkInformation()->getSectionInfo(".text"); if (!textSection) { continue; } diff --git a/source/patcher/hooks_patcher_static.cpp b/source/patcher/hooks_patcher_static.cpp index 13d1c11..2b99291 100644 --- a/source/patcher/hooks_patcher_static.cpp +++ b/source/patcher/hooks_patcher_static.cpp @@ -148,7 +148,10 @@ DECL_FUNCTION(uint32_t, SC17_FindClosestSymbol, char *moduleNameBuffer, uint32_t moduleNameBufferLength) { for (const auto &plugin : gLoadedPlugins) { - const auto sectionInfo = plugin.getPluginInformation().getSectionInfo(".text"); + if (!plugin.isPluginLinkedAndLoaded()) { + continue; + } + const auto sectionInfo = plugin.getPluginLinkInformation()->getSectionInfo(".text"); if (!sectionInfo) { continue; } @@ -158,7 +161,7 @@ DECL_FUNCTION(uint32_t, SC17_FindClosestSymbol, } strncpy(moduleNameBuffer, plugin.getMetaInformation().getName().c_str(), moduleNameBufferLength - 1); - if (const auto functionSymbolData = plugin.getPluginInformation().getNearestFunctionSymbolData(addr)) { + if (const auto functionSymbolData = plugin.getPluginLinkInformation()->getNearestFunctionSymbolData(addr)) { strncpy(symbolNameBuffer, functionSymbolData->getName().c_str(), moduleNameBufferLength - 1); if (outDistance) { *outDistance = addr - reinterpret_cast(functionSymbolData->getAddress()); @@ -180,7 +183,10 @@ DECL_FUNCTION(uint32_t, SC17_FindClosestSymbol, DECL_FUNCTION(uint32_t, KiGetAppSymbolName, uint32_t addr, char *buffer, int32_t bufSize) { for (const auto &plugin : gLoadedPlugins) { - const auto sectionInfo = plugin.getPluginInformation().getSectionInfo(".text"); + if (!plugin.isPluginLinkedAndLoaded()) { + continue; + } + const auto sectionInfo = plugin.getPluginLinkInformation()->getSectionInfo(".text"); if (!sectionInfo) { continue; } @@ -196,7 +202,7 @@ DECL_FUNCTION(uint32_t, KiGetAppSymbolName, uint32_t addr, char *buffer, int32_t } strncpy(buffer, plugin.getMetaInformation().getName().c_str(), bufSize - 1); - if (const auto functionSymbolData = plugin.getPluginInformation().getNearestFunctionSymbolData(addr)) { + if (const auto functionSymbolData = plugin.getPluginLinkInformation()->getNearestFunctionSymbolData(addr)) { buffer[pluginNameLen] = '|'; buffer[pluginNameLen + 1] = '\0'; strncpy(buffer + pluginNameLen + 1, functionSymbolData->getName().c_str(), spaceLeftInBuffer - 1); diff --git a/source/plugin/PluginContainer.cpp b/source/plugin/PluginContainer.cpp index 23d442a..c89595c 100644 --- a/source/plugin/PluginContainer.cpp +++ b/source/plugin/PluginContainer.cpp @@ -1,18 +1,19 @@ #include "PluginContainer.h" #include "utils/storage/StorageUtils.h" -PluginContainer::PluginContainer(PluginMetaInformation metaInformation, PluginInformation pluginInformation, std::shared_ptr pluginData) +PluginContainer::PluginContainer(PluginMetaInformation metaInformation, std::optional pluginLinkInformation, std::shared_ptr pluginData) : mMetaInformation(std::move(metaInformation)), - mPluginInformation(std::move(pluginInformation)), + mPluginLinkInformation(std::move(pluginLinkInformation)), mPluginData(std::move(pluginData)) { } -PluginContainer::PluginContainer(PluginContainer &&src) noexcept : mMetaInformation(std::move(src.mMetaInformation)), - mPluginInformation(std::move(src.mPluginInformation)), - mPluginData(std::move(src.mPluginData)), - mPluginConfigData(std::move(src.mPluginConfigData)), - mStorageRootItem(src.mStorageRootItem), - mInitDone(src.mInitDone) + +PluginContainer::PluginContainer(PluginContainer &&src) : mMetaInformation(std::move(src.mMetaInformation)), + mPluginLinkInformation(std::move(src.mPluginLinkInformation)), + mPluginData(std::move(src.mPluginData)), + mPluginConfigData(std::move(src.mPluginConfigData)), + mStorageRootItem(src.mStorageRootItem), + mInitDone(src.mInitDone) { src.mStorageRootItem = {}; @@ -21,12 +22,12 @@ PluginContainer::PluginContainer(PluginContainer &&src) noexcept : mMetaInformat PluginContainer &PluginContainer::operator=(PluginContainer &&src) noexcept { if (this != &src) { - this->mMetaInformation = std::move(src.mMetaInformation); - this->mPluginInformation = std::move(src.mPluginInformation); - this->mPluginData = std::move(src.mPluginData); - this->mPluginConfigData = std::move(src.mPluginConfigData); - this->mStorageRootItem = src.mStorageRootItem; - this->mInitDone = src.mInitDone; + this->mMetaInformation = std::move(src.mMetaInformation); + this->mPluginLinkInformation = std::move(src.mPluginLinkInformation); + this->mPluginData = std::move(src.mPluginData); + this->mPluginConfigData = std::move(src.mPluginConfigData); + this->mStorageRootItem = src.mStorageRootItem; + this->mInitDone = src.mInitDone; src.mStorageRootItem = nullptr; src.mInitDone = false; @@ -38,12 +39,22 @@ const PluginMetaInformation &PluginContainer::getMetaInformation() const { return this->mMetaInformation; } -const PluginInformation &PluginContainer::getPluginInformation() const { - return this->mPluginInformation; +bool PluginContainer::isPluginLinkedAndLoaded() const { + return this->mPluginLinkInformation.has_value(); } -PluginInformation &PluginContainer::getPluginInformation() { - return this->mPluginInformation; +const PluginLinkInformation *PluginContainer::getPluginLinkInformation() const { + if (this->mPluginLinkInformation.has_value()) { + return this->mPluginLinkInformation.operator->(); + } + return nullptr; +} + +PluginLinkInformation *PluginContainer::getPluginLinkInformation() { + if (this->mPluginLinkInformation.has_value()) { + return this->mPluginLinkInformation.operator->(); + } + return nullptr; } std::shared_ptr PluginContainer::getPluginDataCopy() const { diff --git a/source/plugin/PluginContainer.h b/source/plugin/PluginContainer.h index fc08015..1de8186 100644 --- a/source/plugin/PluginContainer.h +++ b/source/plugin/PluginContainer.h @@ -19,7 +19,7 @@ #include "PluginConfigData.h" #include "PluginData.h" -#include "PluginInformation.h" +#include "PluginLinkInformation.h" #include "PluginMetaInformation.h" #include @@ -28,21 +28,24 @@ class PluginContainer { public: - PluginContainer(PluginMetaInformation metaInformation, PluginInformation pluginInformation, std::shared_ptr pluginData); + PluginContainer(PluginMetaInformation metaInformation, std::optional pluginLinkInformation, std::shared_ptr pluginData); PluginContainer(const PluginContainer &) = delete; - PluginContainer(PluginContainer &&src) noexcept; + PluginContainer(PluginContainer &&src); - PluginContainer &operator=(PluginContainer &&src) noexcept; + PluginContainer &operator=(PluginContainer &&src); [[nodiscard]] const PluginMetaInformation &getMetaInformation() const; - [[nodiscard]] const PluginInformation &getPluginInformation() const; - [[nodiscard]] PluginInformation &getPluginInformation(); + [[nodiscard]] const PluginLinkInformation *getPluginLinkInformation() const; + + [[nodiscard]] PluginLinkInformation *getPluginLinkInformation(); [[nodiscard]] std::shared_ptr getPluginDataCopy() const; + [[nodiscard]] bool isPluginLinkedAndLoaded() const; + [[nodiscard]] uint32_t getHandle() const; [[nodiscard]] const std::optional &getConfigData() const; @@ -61,10 +64,10 @@ public: private: PluginMetaInformation mMetaInformation; - PluginInformation mPluginInformation; + std::optional mPluginLinkInformation; std::shared_ptr mPluginData; - std::optional mPluginConfigData; - wups_storage_root_item mStorageRootItem = nullptr; - bool mInitDone = false; + std::optional mPluginConfigData = std::nullopt; + wups_storage_root_item mStorageRootItem = nullptr; + bool mInitDone = false; }; diff --git a/source/plugin/PluginInformation.cpp b/source/plugin/PluginLinkInformation.cpp similarity index 55% rename from source/plugin/PluginInformation.cpp rename to source/plugin/PluginLinkInformation.cpp index 41a0f07..b09458e 100644 --- a/source/plugin/PluginInformation.cpp +++ b/source/plugin/PluginLinkInformation.cpp @@ -1,19 +1,19 @@ -#include "PluginInformation.h" +#include "PluginLinkInformation.h" -PluginInformation::PluginInformation(PluginInformation &&src) : mHookDataList(std::move(src.mHookDataList)), - mFunctionDataList(std::move(src.mFunctionDataList)), - mRelocationDataList(std::move(src.mRelocationDataList)), - mSymbolDataList(std::move(src.mSymbolDataList)), - mSectionInfoList(std::move(src.mSectionInfoList)), - mTrampolineId(src.mTrampolineId), - mAllocatedTextMemoryAddress(std::move(src.mAllocatedTextMemoryAddress)), - mAllocatedDataMemoryAddress(std::move(src.mAllocatedDataMemoryAddress)) +PluginLinkInformation::PluginLinkInformation(PluginLinkInformation &&src) : mHookDataList(std::move(src.mHookDataList)), + mFunctionDataList(std::move(src.mFunctionDataList)), + mRelocationDataList(std::move(src.mRelocationDataList)), + mSymbolDataList(std::move(src.mSymbolDataList)), + mSectionInfoList(std::move(src.mSectionInfoList)), + mTrampolineId(src.mTrampolineId), + mAllocatedTextMemoryAddress(std::move(src.mAllocatedTextMemoryAddress)), + mAllocatedDataMemoryAddress(std::move(src.mAllocatedDataMemoryAddress)) { src.mTrampolineId = {}; } -PluginInformation &PluginInformation::operator=(PluginInformation &&src) { +PluginLinkInformation &PluginLinkInformation::operator=(PluginLinkInformation &&src) { if (this != &src) { this->mHookDataList = std::move(src.mHookDataList); this->mFunctionDataList = std::move(src.mFunctionDataList); @@ -28,62 +28,63 @@ PluginInformation &PluginInformation::operator=(PluginInformation &&src) { return *this; } -void PluginInformation::addHookData(const HookData &hook_data) { +void PluginLinkInformation::addHookData(const HookData &hook_data) { mHookDataList.push_back(hook_data); } -const std::vector &PluginInformation::getHookDataList() const { +const std::vector &PluginLinkInformation::getHookDataList() const { return mHookDataList; } -void PluginInformation::addFunctionData(FunctionData function_data) { +void PluginLinkInformation::addFunctionData(FunctionData function_data) { mFunctionDataList.push_back(std::move(function_data)); } -const std::vector &PluginInformation::getFunctionDataList() const { +const std::vector &PluginLinkInformation::getFunctionDataList() const { return mFunctionDataList; } -std::vector &PluginInformation::getFunctionDataList() { +std::vector &PluginLinkInformation::getFunctionDataList() { return mFunctionDataList; } -void PluginInformation::addRelocationData(RelocationData relocation_data) { +void PluginLinkInformation::addRelocationData(RelocationData relocation_data) { mRelocationDataList.push_back(std::move(relocation_data)); } -const std::vector &PluginInformation::getRelocationDataList() const { +const std::vector &PluginLinkInformation::getRelocationDataList() const { return mRelocationDataList; } -void PluginInformation::addFunctionSymbolData(const FunctionSymbolData &symbol_data) { +void PluginLinkInformation::addFunctionSymbolData(const FunctionSymbolData &symbol_data) { mSymbolDataList.insert(symbol_data); } -void PluginInformation::addSectionInfo(const SectionInfo §ionInfo) { +void PluginLinkInformation::addSectionInfo(const SectionInfo §ionInfo) { mSectionInfoList.insert(std::pair(sectionInfo.getName(), sectionInfo)); } -const std::map &PluginInformation::getSectionInfoList() const { +const std::map &PluginLinkInformation::getSectionInfoList() const { return mSectionInfoList; } -std::optional PluginInformation::getSectionInfo(const std::string §ionName) const { +std::optional PluginLinkInformation::getSectionInfo(const std::string §ionName) const { if (getSectionInfoList().contains(sectionName)) { return mSectionInfoList.at(sectionName); } return std::nullopt; } -void PluginInformation::setTrampolineId(const uint8_t trampolineId) { + +void PluginLinkInformation::setTrampolineId(const uint8_t trampolineId) { this->mTrampolineId = trampolineId; } -uint8_t PluginInformation::getTrampolineId() const { +uint8_t PluginLinkInformation::getTrampolineId() const { return mTrampolineId; } -const FunctionSymbolData *PluginInformation::getNearestFunctionSymbolData(const uint32_t address) const { +const FunctionSymbolData *PluginLinkInformation::getNearestFunctionSymbolData(uint32_t address) const { const FunctionSymbolData *result = nullptr; bool foundHit = false; @@ -103,10 +104,10 @@ const FunctionSymbolData *PluginInformation::getNearestFunctionSymbolData(const return result; } -const HeapMemoryFixedSize &PluginInformation::getTextMemory() const { +const HeapMemoryFixedSize &PluginLinkInformation::getTextMemory() const { return mAllocatedTextMemoryAddress; } -const HeapMemoryFixedSize &PluginInformation::getDataMemory() const { +const HeapMemoryFixedSize &PluginLinkInformation::getDataMemory() const { return mAllocatedDataMemoryAddress; } diff --git a/source/plugin/PluginInformation.h b/source/plugin/PluginLinkInformation.h similarity index 90% rename from source/plugin/PluginInformation.h rename to source/plugin/PluginLinkInformation.h index 04d7bcf..7132147 100644 --- a/source/plugin/PluginInformation.h +++ b/source/plugin/PluginLinkInformation.h @@ -37,13 +37,13 @@ struct FunctionSymbolDataComparator { } }; -class PluginInformation { +class PluginLinkInformation { public: - PluginInformation(const PluginInformation &) = delete; + PluginLinkInformation(const PluginLinkInformation &) = delete; - PluginInformation(PluginInformation &&src); + PluginLinkInformation(PluginLinkInformation &&src) noexcept; - PluginInformation &operator=(PluginInformation &&src); + PluginLinkInformation &operator=(PluginLinkInformation &&src); [[nodiscard]] const std::vector &getHookDataList() const; @@ -66,7 +66,7 @@ public: [[nodiscard]] const HeapMemoryFixedSize &getDataMemory() const; private: - PluginInformation() = default; + PluginLinkInformation() = default; void addHookData(const HookData &hook_data); @@ -91,5 +91,5 @@ private: HeapMemoryFixedSize mAllocatedTextMemoryAddress; HeapMemoryFixedSize mAllocatedDataMemoryAddress; - friend class PluginInformationFactory; + friend class PluginLinkInformationFactory; }; diff --git a/source/plugin/PluginInformationFactory.cpp b/source/plugin/PluginLinkInformationFactory.cpp similarity index 95% rename from source/plugin/PluginInformationFactory.cpp rename to source/plugin/PluginLinkInformationFactory.cpp index c0c4b17..73eb784 100644 --- a/source/plugin/PluginInformationFactory.cpp +++ b/source/plugin/PluginLinkInformationFactory.cpp @@ -15,7 +15,7 @@ * along with this program. If not, see . ****************************************************************************/ -#include "PluginInformationFactory.h" +#include "PluginLinkInformationFactory.h" #include "utils/ElfUtils.h" #include "utils/logger.h" #include "utils/utils.h" @@ -26,8 +26,8 @@ using namespace ELFIO; -std::optional -PluginInformationFactory::load(const PluginData &pluginData, std::vector &trampolineData, uint8_t trampolineId) { +std::optional +PluginLinkInformationFactory::load(const PluginData &pluginData, std::vector &trampolineData, uint8_t trampolineId) { auto buffer = pluginData.getBuffer(); if (buffer.empty()) { DEBUG_FUNCTION_LINE_ERR("Buffer was empty"); @@ -40,7 +40,7 @@ PluginInformationFactory::load(const PluginData &pluginData, std::vector destinations) { +bool PluginLinkInformationFactory::addImportRelocationData(PluginLinkInformation &pluginInfo, const elfio &reader, const std::span destinations) { std::map> infoMap; uint32_t sec_num = reader.sections.size(); @@ -335,8 +335,8 @@ bool PluginInformationFactory::addImportRelocationData(PluginInformation &plugin return true; } -bool PluginInformationFactory::linkSection(const elfio &reader, uint32_t section_index, uint32_t destination, uint32_t base_text, uint32_t base_data, - std::vector &trampolineData, uint8_t trampolineId) { +bool PluginLinkInformationFactory::linkSection(const elfio &reader, uint32_t section_index, uint32_t destination, uint32_t base_text, uint32_t base_data, + std::vector &trampolineData, uint8_t trampolineId) { uint32_t sec_num = reader.sections.size(); for (uint32_t i = 0; i < sec_num; ++i) { diff --git a/source/plugin/PluginInformationFactory.h b/source/plugin/PluginLinkInformationFactory.h similarity index 84% rename from source/plugin/PluginInformationFactory.h rename to source/plugin/PluginLinkInformationFactory.h index 80a95cc..022b0b3 100644 --- a/source/plugin/PluginInformationFactory.h +++ b/source/plugin/PluginLinkInformationFactory.h @@ -17,21 +17,22 @@ #pragma once #include "PluginData.h" -#include "PluginInformation.h" +#include "PluginLinkInformation.h" #include #include #include -class PluginInformationFactory { +class PluginLinkInformationFactory { public: - static std::optional + static std::optional load(const PluginData &pluginData, std::vector &trampolineData, uint8_t trampolineId); +private: static bool linkSection(const ELFIO::elfio &reader, uint32_t section_index, uint32_t destination, uint32_t base_text, uint32_t base_data, std::vector &trampolineData, uint8_t trampolineId); static bool - addImportRelocationData(PluginInformation &pluginInfo, const ELFIO::elfio &reader, std::span destinations); + addImportRelocationData(PluginLinkInformation &pluginInfo, const ELFIO::elfio &reader, std::span destinations); }; diff --git a/source/utils/config/ConfigUtils.cpp b/source/utils/config/ConfigUtils.cpp index 6224a8e..201e4df 100644 --- a/source/utils/config/ConfigUtils.cpp +++ b/source/utils/config/ConfigUtils.cpp @@ -77,6 +77,9 @@ void ConfigUtils::displayMenu() { std::vector configs; for (const auto &plugin : gLoadedPlugins) { + if (!plugin.isPluginLinkedAndLoaded()) { + continue; + } GeneralConfigInformation info; info.name = plugin.getMetaInformation().getName(); info.author = plugin.getMetaInformation().getAuthor(); @@ -99,7 +102,7 @@ void ConfigUtils::displayMenu() { DEBUG_FUNCTION_LINE_ERR("Failed to create config for plugin: \"%s\"", info.name.c_str()); } } else { - for (const auto &hook : plugin.getPluginInformation().getHookDataList()) { + for (const auto &hook : plugin.getPluginLinkInformation()->getHookDataList()) { if (hook.getType() == WUPS_LOADER_HOOK_GET_CONFIG_DEPRECATED) { if (hook.getFunctionPointer() == nullptr) { DEBUG_FUNCTION_LINE_ERR("Hook had invalid ptr"); diff --git a/source/utils/exports.cpp b/source/utils/exports.cpp index 60711ac..6d0cd8a 100644 --- a/source/utils/exports.cpp +++ b/source/utils/exports.cpp @@ -276,9 +276,9 @@ extern "C" PluginBackendApiErrorType WUPSGetSectionInformationForPlugin(const wu if (handle != 0 && plugin_section_list != nullptr && buffer_size != 0) { bool found = false; for (const auto &curContainer : gLoadedPlugins) { - if (curContainer.getHandle() == handle) { + if (curContainer.isPluginLinkedAndLoaded() && curContainer.getHandle() == handle) { found = true; - const auto §ionInfoList = curContainer.getPluginInformation().getSectionInfoList(); + const auto §ionInfoList = curContainer.getPluginLinkInformation()->getSectionInfoList(); uint32_t offset = 0; for (auto const §ionInfo : sectionInfoList | std::views::values) { @@ -320,9 +320,9 @@ extern "C" PluginBackendApiErrorType WUPSGetSectionMemoryAddresses(const wups_ba return PLUGIN_BACKEND_API_ERROR_INVALID_ARG; } for (const auto &curContainer : gLoadedPlugins) { - if (curContainer.getHandle() == handle) { - *textAddress = const_cast(curContainer.getPluginInformation().getTextMemory().data()); - *dataAddress = const_cast(curContainer.getPluginInformation().getDataMemory().data()); + if (curContainer.isPluginLinkedAndLoaded() && curContainer.getHandle() == handle) { + *textAddress = const_cast(curContainer.getPluginLinkInformation()->getTextMemory().data()); + *dataAddress = const_cast(curContainer.getPluginLinkInformation()->getDataMemory().data()); return PLUGIN_BACKEND_API_ERROR_NONE; } }