/**************************************************************************** * Copyright (C) 2018 Maschell * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . ****************************************************************************/ #pragma once #include "FunctionData.h" #include "FunctionSymbolData.h" #include "HookData.h" #include "PluginMetaInformation.h" #include "RelocationData.h" #include "SectionInfo.h" #include #include #include #include #include #include #include struct FunctionSymbolDataComparator { bool operator()(const std::shared_ptr &lhs, const std::shared_ptr &rhs) const { return (uint32_t) lhs->getAddress() < (uint32_t) rhs->getAddress(); } }; class PluginInformation { public: void addHookData(std::unique_ptr hook_data) { hook_data_list.push_back(std::move(hook_data)); } [[nodiscard]] const std::vector> &getHookDataList() const { return hook_data_list; } void addFunctionData(std::unique_ptr function_data) { function_data_list.push_back(std::move(function_data)); } [[nodiscard]] const std::vector> &getFunctionDataList() const { return function_data_list; } void addRelocationData(std::unique_ptr relocation_data) { relocation_data_list.push_back(std::move(relocation_data)); } [[nodiscard]] const std::vector> &getRelocationDataList() const { return relocation_data_list; } void addFunctionSymbolData(std::shared_ptr symbol_data) { symbol_data_list.insert(std::move(symbol_data)); } [[nodiscard]] const std::set, FunctionSymbolDataComparator> &getFunctionSymbolDataList() const { return symbol_data_list; } void addSectionInfo(std::shared_ptr sectionInfo) { section_info_list[sectionInfo->getName()] = std::move(sectionInfo); } [[nodiscard]] const std::map> &getSectionInfoList() const { return section_info_list; } [[nodiscard]] std::optional> getSectionInfo(const std::string §ionName) const { if (getSectionInfoList().contains(sectionName)) { return section_info_list.at(sectionName); } return std::nullopt; } void setTrampolineId(uint8_t _trampolineId) { this->trampolineId = _trampolineId; } [[nodiscard]] uint8_t getTrampolineId() const { return trampolineId; } [[nodiscard]] std::optional> getNearestFunctionSymbolData(uint32_t address) const { std::shared_ptr result; bool foundHit = false; for (auto &cur : symbol_data_list) { if (foundHit && address < (uint32_t) cur->getAddress()) { break; } if (address >= (uint32_t) cur->getAddress()) { result = cur; foundHit = true; } } if (result) { return result; } return {}; } private: std::vector> hook_data_list; std::vector> function_data_list; std::vector> relocation_data_list; std::set, FunctionSymbolDataComparator> symbol_data_list; std::map> section_info_list; uint8_t trampolineId = 0; std::unique_ptr allocatedTextMemoryAddress; std::unique_ptr allocatedDataMemoryAddress; friend class PluginInformationFactory; };