1
0
mirror of synced 2024-11-12 02:00:52 +01:00

Hopefully fixed the whole plugin mess I started

This commit is contained in:
WerWolv 2021-01-12 23:28:41 +01:00
parent 8ae15abb85
commit dc85616549
27 changed files with 137 additions and 173 deletions

View File

@ -182,11 +182,16 @@ set_target_properties(imhex PROPERTIES CXX_VISIBILITY_PRESET hidden)
target_link_directories(imhex PRIVATE ${CRYPTO_LIBRARY_DIRS} ${CAPSTONE_LIBRARY_DIRS} ${MAGIC_LIBRARY_DIRS}) target_link_directories(imhex PRIVATE ${CRYPTO_LIBRARY_DIRS} ${CAPSTONE_LIBRARY_DIRS} ${MAGIC_LIBRARY_DIRS})
if (WIN32) if (WIN32)
target_link_libraries(imhex libdl.a libmagic.a libgnurx.a libtre.a libintl.a libiconv.a libshlwapi.a libcrypto.a libwinpthread.a libcapstone.a LLVMDemangle imgui libimhex ${Python_LIBRARIES}) target_link_libraries(imhex libdl.a libmagic.a libgnurx.a libtre.a libintl.a libiconv.a libshlwapi.a libcrypto.a libwinpthread.a libcapstone.a LLVMDemangle libimhex ${Python_LIBRARIES})
elseif (UNIX) elseif (UNIX)
target_link_libraries(imhex magic crypto ${CMAKE_DL_LIBS} capstone LLVMDemangle imgui libimhex ${Python_LIBRARIES} dl) target_link_libraries(imhex magic crypto ${CMAKE_DL_LIBS} capstone LLVMDemangle libimhex ${Python_LIBRARIES} dl)
endif() endif()
add_custom_command(TARGET imhex POST_BUILD
COMMAND ${CMAKE_COMMAND} -E copy_if_different
$<TARGET_FILE:libimhex>
$<TARGET_FILE_DIR:imhex>)
if (WIN32) if (WIN32)
# Install binaries directly in the prefix, usually C:\Program Files\ImHex. # Install binaries directly in the prefix, usually C:\Program Files\ImHex.
set(CMAKE_INSTALL_BINDIR ".") set(CMAKE_INSTALL_BINDIR ".")

View File

@ -8,6 +8,8 @@ find_package(Freetype REQUIRED)
pkg_search_module(GLM REQUIRED glm) pkg_search_module(GLM REQUIRED glm)
pkg_search_module(GLFW REQUIRED glfw3) pkg_search_module(GLFW REQUIRED glfw3)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC")
add_library(imgui add_library(imgui
source/imgui.cpp source/imgui.cpp
source/imgui_demo.cpp source/imgui_demo.cpp

View File

@ -4,9 +4,11 @@ project(glad)
set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD 17)
if (WIN32) if (WIN32)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -static-libstdc++ -static-libgcc -static") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -static-libstdc++ -static-libgcc")
endif() endif()
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC")
add_library(glad add_library(glad
source/glad.c source/glad.c
) )

View File

@ -4,9 +4,11 @@ project(LLVMDemangle)
set(CMAKE_CXX_STANDARD 17) set(CMAKE_CXX_STANDARD 17)
if (WIN32) if (WIN32)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -static-libstdc++ -static-libgcc -static") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -static-libstdc++ -static-libgcc")
endif() endif()
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC")
add_library(LLVMDemangle add_library(LLVMDemangle
Demangle/Demangle.cpp Demangle/Demangle.cpp
Demangle/ItaniumDemangle.cpp Demangle/ItaniumDemangle.cpp

View File

@ -14,10 +14,10 @@ namespace hex {
Plugin(std::string_view path); Plugin(std::string_view path);
~Plugin(); ~Plugin();
void initializePlugin(SharedData &sharedData) const; void initializePlugin() const;
private: private:
using InitializePluginFunc = void(*)(SharedData &sharedData); using InitializePluginFunc = void(*)();
void *m_handle = nullptr; void *m_handle = nullptr;

View File

@ -8,13 +8,16 @@ add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/../../external/nlohmann_json ${CMAK
if (WIN32) if (WIN32)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -static-libstdc++ -static-libgcc -static") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -static-libstdc++ -static-libgcc")
endif() endif()
add_library(libimhex STATIC set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fPIC")
add_library(libimhex SHARED
source/helpers/event.cpp source/helpers/event.cpp
source/helpers/utils.cpp source/helpers/utils.cpp
source/helpers/content_registry.cpp source/helpers/content_registry.cpp
source/helpers/shared_data.cpp
source/lang/preprocessor.cpp source/lang/preprocessor.cpp
source/lang/lexer.cpp source/lang/lexer.cpp

View File

@ -28,106 +28,39 @@ namespace hex {
SharedData(const SharedData&) = delete; SharedData(const SharedData&) = delete;
SharedData(SharedData&&) = delete; SharedData(SharedData&&) = delete;
static auto& get() {
static SharedData instance;
return instance;
}
friend void hex::plugin::internal::initializePlugin(SharedData &sharedData);
friend class Window; friend class Window;
template<typename T> template<typename T>
T& getVariable(std::string variableName) { static T& getVariable(std::string variableName) {
return std::any_cast<T&>((*this->sharedVariables)[variableName]); return std::any_cast<T&>(SharedData::sharedVariables[variableName]);
} }
template<typename T> template<typename T>
void setVariable(std::string variableName, T value) { static void setVariable(std::string variableName, T value) {
(*this->sharedVariables)[variableName] = value; SharedData::sharedVariables[variableName] = value;
}
private:
void initializeData() {
static int mainArgcStorage;
static char **mainArgvStorage;
static ImGuiContext *imGuiContextStorage;
static std::vector<EventHandler> eventHandlersStorage;
static std::vector<std::function<void()>> deferredCallsStorage;
static prv::Provider *currentProviderStorage;
static std::map<std::string, std::vector<ContentRegistry::Settings::Entry>> settingsEntriesStorage;
static std::map<std::string, std::any> sharedVariablesStorage;
static ImVec2 windowPosStorage, windowSizeStorage;
static nlohmann::json settingsJsonStorage;
static std::map<std::string, Events> customEventsStorage;
static u32 customEventsLastIdStorage = u32(Events::Events_BuiltinEnd) + 1;
static std::vector<ContentRegistry::CommandPaletteCommands::Entry> commandPaletteCommandsStorage;
static std::map<std::string, ContentRegistry::PatternLanguageFunctions::Function> patternLanguageFunctionsStorage;
static std::vector<View*> viewsStorage;
static std::vector<std::function<void()>> toolsStorage;
this->imguiContext = &imGuiContextStorage;
this->eventHandlers = &eventHandlersStorage;
this->deferredCalls = &deferredCallsStorage;
this->currentProvider = &currentProviderStorage;
this->settingsEntries = &settingsEntriesStorage;
this->sharedVariables = &sharedVariablesStorage;
this->windowPos = &windowPosStorage;
this->windowSize = &windowSizeStorage;
this->settingsJson = &settingsJsonStorage;
this->customEvents = &customEventsStorage;
this->customEventsLastId = &customEventsLastIdStorage;
this->commandPaletteCommands = &commandPaletteCommandsStorage;
this->patternLanguageFunctions = &patternLanguageFunctionsStorage;
this->views = &viewsStorage;
this->tools = &toolsStorage;
this->mainArgc = &mainArgcStorage;
this->mainArgv = &mainArgvStorage;
}
void initializeData(const SharedData &other) {
this->imguiContext = other.imguiContext;
this->eventHandlers = other.eventHandlers;
this->deferredCalls = other.deferredCalls;
this->currentProvider = other.currentProvider;
this->settingsEntries = other.settingsEntries;
this->sharedVariables = other.sharedVariables;
this->windowPos = other.windowPos;
this->windowSize = other.windowSize;
this->settingsJson = other.settingsJson;
this->customEvents = other.customEvents;
this->customEventsLastId = other.customEventsLastId;
this->commandPaletteCommands = other.commandPaletteCommands;
this->patternLanguageFunctions = other.patternLanguageFunctions;
this->views = other.views;
this->tools = other.tools;
this->mainArgc = other.mainArgc;
this->mainArgv = other.mainArgv;
} }
public: public:
ImGuiContext **imguiContext; static std::vector<EventHandler> eventHandlers;
std::vector<EventHandler> *eventHandlers; static std::vector<std::function<void()>> deferredCalls;
std::vector<std::function<void()>> *deferredCalls; static prv::Provider *currentProvider;
prv::Provider **currentProvider; static std::map<std::string, std::vector<ContentRegistry::Settings::Entry>> settingsEntries;
std::map<std::string, std::vector<ContentRegistry::Settings::Entry>> *settingsEntries; static nlohmann::json settingsJson;
nlohmann::json *settingsJson; static std::map<std::string, Events> customEvents;
std::map<std::string, Events> *customEvents; static u32 customEventsLastId;
u32 *customEventsLastId; static std::vector<ContentRegistry::CommandPaletteCommands::Entry> commandPaletteCommands;
std::vector<ContentRegistry::CommandPaletteCommands::Entry> *commandPaletteCommands; static std::map<std::string, ContentRegistry::PatternLanguageFunctions::Function> patternLanguageFunctions;
std::map<std::string, ContentRegistry::PatternLanguageFunctions::Function> *patternLanguageFunctions; static std::vector<View*> views;
std::vector<View*> *views; static std::vector<std::function<void()>> tools;
std::vector<std::function<void()>> *tools;
int *mainArgc; static int mainArgc;
char ***mainArgv; static char **mainArgv;
ImVec2 *windowPos; static ImVec2 windowPos;
ImVec2 *windowSize; static ImVec2 windowSize;
private: private:
std::map<std::string, std::any> *sharedVariables; static std::map<std::string, std::any> sharedVariables;
}; };
} }

View File

@ -11,13 +11,8 @@
#define IMHEX_PLUGIN_SETUP namespace hex::plugin { void setup(); } \ #define IMHEX_PLUGIN_SETUP namespace hex::plugin { void setup(); } \
namespace hex::plugin::internal { \ namespace hex::plugin::internal { \
void initializePlugin(SharedData &sharedData) { \ void initializePlugin() { \
if (glGetString == NULL) \
gladLoadGL(); \
SharedData::get().initializeData(sharedData); \
ImGui::SetCurrentContext(*sharedData.imguiContext); \
hex::plugin::setup(); \ hex::plugin::setup(); \
\
} \ } \
} \ } \
void hex::plugin::setup() void hex::plugin::setup()

View File

@ -10,14 +10,14 @@ namespace hex {
/* Settings */ /* Settings */
void ContentRegistry::Settings::load() { void ContentRegistry::Settings::load() {
std::ifstream settingsFile(std::filesystem::path((*SharedData::get().mainArgv)[0]).parent_path() / "settings.json"); std::ifstream settingsFile(std::filesystem::path((SharedData::mainArgv)[0]).parent_path() / "settings.json");
if (settingsFile.good()) if (settingsFile.good())
settingsFile >> getSettingsData(); settingsFile >> getSettingsData();
} }
void ContentRegistry::Settings::store() { void ContentRegistry::Settings::store() {
std::ofstream settingsFile(std::filesystem::path((*SharedData::get().mainArgv)[0]).parent_path() / "settings.json", std::ios::trunc); std::ofstream settingsFile(std::filesystem::path((SharedData::mainArgv)[0]).parent_path() / "settings.json", std::ios::trunc);
settingsFile << getSettingsData(); settingsFile << getSettingsData();
} }
@ -40,19 +40,19 @@ namespace hex {
} }
std::map<std::string, std::vector<ContentRegistry::Settings::Entry>>& ContentRegistry::Settings::getEntries() { std::map<std::string, std::vector<ContentRegistry::Settings::Entry>>& ContentRegistry::Settings::getEntries() {
return *SharedData::get().settingsEntries; return SharedData::settingsEntries;
} }
nlohmann::json& ContentRegistry::Settings::getSettingsData() { nlohmann::json& ContentRegistry::Settings::getSettingsData() {
return *SharedData::get().settingsJson; return SharedData::settingsJson;
} }
/* Events */ /* Events */
auto ContentRegistry::Events::get(std::string_view name) { auto ContentRegistry::Events::get(std::string_view name) {
auto &customEvents = *SharedData::get().customEvents; auto &customEvents = SharedData::customEvents;
auto &lastId = *SharedData::get().customEventsLastId; auto &lastId = SharedData::customEventsLastId;
if (!customEvents.contains(name.data())) { if (!customEvents.contains(name.data())) {
customEvents[name.data()] = static_cast<hex::Events>(lastId); customEvents[name.data()] = static_cast<hex::Events>(lastId);
@ -70,7 +70,7 @@ namespace hex {
} }
std::vector<ContentRegistry::CommandPaletteCommands::Entry>& ContentRegistry::CommandPaletteCommands::getEntries() { std::vector<ContentRegistry::CommandPaletteCommands::Entry>& ContentRegistry::CommandPaletteCommands::getEntries() {
return *SharedData::get().commandPaletteCommands; return SharedData::commandPaletteCommands;
} }
@ -81,7 +81,7 @@ namespace hex {
} }
std::map<std::string, ContentRegistry::PatternLanguageFunctions::Function>& ContentRegistry::PatternLanguageFunctions::getEntries() { std::map<std::string, ContentRegistry::PatternLanguageFunctions::Function>& ContentRegistry::PatternLanguageFunctions::getEntries() {
return *SharedData::get().patternLanguageFunctions; return SharedData::patternLanguageFunctions;
} }
@ -96,7 +96,7 @@ namespace hex {
} }
std::vector<View*>& ContentRegistry::Views::getEntries() { std::vector<View*>& ContentRegistry::Views::getEntries() {
return *SharedData::get().views; return SharedData::views;
} }
@ -107,7 +107,7 @@ namespace hex {
} }
std::vector<std::function<void()>>& ContentRegistry::Tools::getEntries() { std::vector<std::function<void()>>& ContentRegistry::Tools::getEntries() {
return *SharedData::get().tools; return SharedData::tools;
} }
} }

View File

@ -5,21 +5,21 @@
namespace hex { namespace hex {
void EventManager::post(Events eventType, const void *userData) { void EventManager::post(Events eventType, const void *userData) {
for (auto &handler : *SharedData::get().eventHandlers) for (auto &handler : SharedData::eventHandlers)
if (eventType == handler.eventType) if (eventType == handler.eventType)
handler.callback(userData); handler.callback(userData);
} }
void EventManager::subscribe(Events eventType, void *owner, std::function<void(const void*)> callback) { void EventManager::subscribe(Events eventType, void *owner, std::function<void(const void*)> callback) {
for (auto &handler : *SharedData::get().eventHandlers) for (auto &handler : SharedData::eventHandlers)
if (eventType == handler.eventType && owner == handler.owner) if (eventType == handler.eventType && owner == handler.owner)
return; return;
SharedData::get().eventHandlers->push_back(EventHandler { owner, eventType, callback }); SharedData::eventHandlers.push_back(EventHandler { owner, eventType, callback });
} }
void EventManager::unsubscribe(Events eventType, void *sender) { void EventManager::unsubscribe(Events eventType, void *sender) {
std::erase_if(*SharedData::get().eventHandlers, [&eventType, &sender](EventHandler handler) { std::erase_if(SharedData::eventHandlers, [&eventType, &sender](EventHandler handler) {
return eventType == handler.eventType && sender == handler.owner; return eventType == handler.eventType && sender == handler.owner;
}); });
} }

View File

@ -0,0 +1,24 @@
#include <helpers/shared_data.hpp>
namespace hex {
std::vector<EventHandler> SharedData::eventHandlers;
std::vector<std::function<void()>> SharedData::deferredCalls;
prv::Provider *SharedData::currentProvider;
std::map<std::string, std::vector<ContentRegistry::Settings::Entry>> SharedData::settingsEntries;
nlohmann::json SharedData::settingsJson;
std::map<std::string, Events> SharedData::customEvents;
u32 SharedData::customEventsLastId;
std::vector<ContentRegistry::CommandPaletteCommands::Entry> SharedData::commandPaletteCommands;
std::map<std::string, ContentRegistry::PatternLanguageFunctions::Function> SharedData::patternLanguageFunctions;
std::vector<View*> SharedData::views;
std::vector<std::function<void()>> SharedData::tools;
int SharedData::mainArgc;
char **SharedData::mainArgv;
ImVec2 SharedData::windowPos;
ImVec2 SharedData::windowSize;
std::map<std::string, std::any> SharedData::sharedVariables;
}

View File

@ -17,7 +17,7 @@ namespace hex {
bool View::handleShortcut(int key, int mods) { return false; } bool View::handleShortcut(int key, int mods) { return false; }
std::vector<std::function<void()>>& View::getDeferedCalls() { std::vector<std::function<void()>>& View::getDeferedCalls() {
return *SharedData::get().deferredCalls; return SharedData::deferredCalls;
} }
void View::postEvent(Events eventType, const void *userData) { void View::postEvent(Events eventType, const void *userData) {
@ -76,7 +76,7 @@ namespace hex {
} }
void View::doLater(std::function<void()> &&function) { void View::doLater(std::function<void()> &&function) {
SharedData::get().deferredCalls->push_back(function); SharedData::deferredCalls.push_back(function);
} }
void View::confirmButtons(const char *textLeft, const char *textRight, std::function<void()> leftButtonFn, std::function<void()> rightButtonFn) { void View::confirmButtons(const char *textLeft, const char *textRight, std::function<void()> leftButtonFn, std::function<void()> rightButtonFn) {

View File

@ -179,10 +179,10 @@ namespace hex {
} }
bool LoaderScript::processFile(std::string_view scriptPath) { bool LoaderScript::processFile(std::string_view scriptPath) {
Py_SetProgramName(Py_DecodeLocale((*SharedData::get().mainArgv)[0], nullptr)); Py_SetProgramName(Py_DecodeLocale((SharedData::mainArgv)[0], nullptr));
if (std::filesystem::exists(std::filesystem::path((*SharedData::get().mainArgv)[0]).parent_path().string() + "/lib/python" PYTHON_VERSION_MAJOR_MINOR)) if (std::filesystem::exists(std::filesystem::path((SharedData::mainArgv)[0]).parent_path().string() + "/lib/python" PYTHON_VERSION_MAJOR_MINOR))
Py_SetPythonHome(Py_DecodeLocale(std::filesystem::path((*SharedData::get().mainArgv)[0]).parent_path().string().c_str(), nullptr)); Py_SetPythonHome(Py_DecodeLocale(std::filesystem::path((SharedData::mainArgv)[0]).parent_path().string().c_str(), nullptr));
PyImport_AppendInittab("_imhex", []() -> PyObject* { PyImport_AppendInittab("_imhex", []() -> PyObject* {

View File

@ -5,8 +5,8 @@
namespace hex { namespace hex {
// hex::plugin::internal::initializePlugin(SharedData&) // hex::plugin::internal::initializePlugin()
constexpr auto InitializePluginSymbol = "_ZN3hex6plugin8internal16initializePluginERNS_10SharedDataE"; constexpr auto InitializePluginSymbol = "_ZN3hex6plugin8internal16initializePluginEv";
Plugin::Plugin(std::string_view path) { Plugin::Plugin(std::string_view path) {
this->m_handle = dlopen(path.data(), RTLD_LAZY); this->m_handle = dlopen(path.data(), RTLD_LAZY);
@ -22,9 +22,9 @@ namespace hex {
dlclose(this->m_handle); dlclose(this->m_handle);
} }
void Plugin::initializePlugin(SharedData &sharedData) const { void Plugin::initializePlugin() const {
if (this->m_initializePluginFunction != nullptr) if (this->m_initializePluginFunction != nullptr)
this->m_initializePluginFunction(sharedData); this->m_initializePluginFunction();
} }
void PluginHandler::load(std::string_view pluginFolder) { void PluginHandler::load(std::string_view pluginFolder) {

View File

@ -61,7 +61,7 @@ namespace hex {
{ {
u8 bytes[10] = { 0 }; u8 bytes[10] = { 0 };
(*SharedData::get().currentProvider)->read(region.address, bytes, std::min(region.size, size_t(10))); (SharedData::currentProvider)->read(region.address, bytes, std::min(region.size, size_t(10)));
std::string bytesString; std::string bytesString;
for (u8 i = 0; i < std::min(region.size, size_t(10)); i++) { for (u8 i = 0; i < std::min(region.size, size_t(10)); i++) {

View File

@ -40,8 +40,8 @@ namespace hex {
void ViewCommandPalette::drawContent() { void ViewCommandPalette::drawContent() {
auto windowPos = *SharedData::get().windowPos; auto windowPos = SharedData::windowPos;
auto windowSize = *SharedData::get().windowSize; auto windowSize = SharedData::windowSize;
auto paletteSize = this->getMinSize(); auto paletteSize = this->getMinSize();
ImGui::SetNextWindowPos(ImVec2(windowPos.x + (windowSize.x - paletteSize.x) / 2.0F, windowPos.y), ImGuiCond_Always); ImGui::SetNextWindowPos(ImVec2(windowPos.x + (windowSize.x - paletteSize.x) / 2.0F, windowPos.y), ImGuiCond_Always);
if (ImGui::BeginPopup("Command Palette")) { if (ImGui::BeginPopup("Command Palette")) {

View File

@ -13,7 +13,7 @@ namespace hex {
View::subscribeEvent(Events::RegionSelected, [this](const void* userData){ View::subscribeEvent(Events::RegionSelected, [this](const void* userData){
Region region = *static_cast<const Region*>(userData); Region region = *static_cast<const Region*>(userData);
auto provider = *SharedData::get().currentProvider; auto provider = SharedData::currentProvider;
if (provider == nullptr) { if (provider == nullptr) {
this->m_validBytes = 0; this->m_validBytes = 0;
@ -141,7 +141,7 @@ namespace hex {
if (ImGui::Begin("Data Inspector", &this->getWindowOpenState(), ImGuiWindowFlags_NoCollapse)) { if (ImGui::Begin("Data Inspector", &this->getWindowOpenState(), ImGuiWindowFlags_NoCollapse)) {
auto provider = *SharedData::get().currentProvider; auto provider = SharedData::currentProvider;
if (provider != nullptr && provider->isReadable()) { if (provider != nullptr && provider->isReadable()) {
if (ImGui::BeginTable("##datainspector", 2, if (ImGui::BeginTable("##datainspector", 2,

View File

@ -51,7 +51,7 @@ namespace hex {
if (cs_open(Disassembler::toCapstoneArchictecture(this->m_architecture), mode, &capstoneHandle) == CS_ERR_OK) { if (cs_open(Disassembler::toCapstoneArchictecture(this->m_architecture), mode, &capstoneHandle) == CS_ERR_OK) {
auto provider = *SharedData::get().currentProvider; auto provider = SharedData::currentProvider;
std::vector<u8> buffer(2048, 0x00); std::vector<u8> buffer(2048, 0x00);
for (u64 address = 0; address < (this->m_codeRegion[1] - this->m_codeRegion[0] + 1); address += 2048) { for (u64 address = 0; address < (this->m_codeRegion[1] - this->m_codeRegion[0] + 1); address += 2048) {
size_t bufferSize = std::min(u64(2048), (this->m_codeRegion[1] - this->m_codeRegion[0] + 1) - address); size_t bufferSize = std::min(u64(2048), (this->m_codeRegion[1] - this->m_codeRegion[0] + 1) - address);
@ -95,7 +95,7 @@ namespace hex {
if (ImGui::Begin("Disassembler", &this->getWindowOpenState(), ImGuiWindowFlags_NoCollapse)) { if (ImGui::Begin("Disassembler", &this->getWindowOpenState(), ImGuiWindowFlags_NoCollapse)) {
auto provider = *SharedData::get().currentProvider; auto provider = SharedData::currentProvider;
if (provider != nullptr && provider->isReadable()) { if (provider != nullptr && provider->isReadable()) {
ImGui::TextUnformatted("Position"); ImGui::TextUnformatted("Position");
ImGui::Separator(); ImGui::Separator();

View File

@ -41,7 +41,7 @@ namespace hex {
if (ImGui::Begin("Hashing", &this->getWindowOpenState(), ImGuiWindowFlags_NoCollapse)) { if (ImGui::Begin("Hashing", &this->getWindowOpenState(), ImGuiWindowFlags_NoCollapse)) {
ImGui::BeginChild("##scrolling", ImVec2(0, 0), false, ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoNav); ImGui::BeginChild("##scrolling", ImVec2(0, 0), false, ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoNav);
auto provider = *SharedData::get().currentProvider; auto provider = SharedData::currentProvider;
if (provider != nullptr && provider->isAvailable()) { if (provider != nullptr && provider->isAvailable()) {
ImGui::TextUnformatted("Region"); ImGui::TextUnformatted("Region");

View File

@ -19,7 +19,7 @@ namespace hex {
: View("Hex Editor"), m_patternData(patternData) { : View("Hex Editor"), m_patternData(patternData) {
this->m_memoryEditor.ReadFn = [](const ImU8 *data, size_t off) -> ImU8 { this->m_memoryEditor.ReadFn = [](const ImU8 *data, size_t off) -> ImU8 {
auto provider = *SharedData::get().currentProvider; auto provider = SharedData::currentProvider;
if (!provider->isAvailable() || !provider->isReadable()) if (!provider->isAvailable() || !provider->isReadable())
return 0x00; return 0x00;
@ -30,7 +30,7 @@ namespace hex {
}; };
this->m_memoryEditor.WriteFn = [](ImU8 *data, size_t off, ImU8 d) -> void { this->m_memoryEditor.WriteFn = [](ImU8 *data, size_t off, ImU8 d) -> void {
auto provider = *SharedData::get().currentProvider; auto provider = SharedData::currentProvider;
if (!provider->isAvailable() || !provider->isWritable()) if (!provider->isAvailable() || !provider->isWritable())
return; return;
@ -71,7 +71,7 @@ namespace hex {
View::subscribeEvent(Events::SelectionChangeRequest, [this](const void *userData) { View::subscribeEvent(Events::SelectionChangeRequest, [this](const void *userData) {
const Region &region = *reinterpret_cast<const Region*>(userData); const Region &region = *reinterpret_cast<const Region*>(userData);
auto provider = *SharedData::get().currentProvider; auto provider = SharedData::currentProvider;
auto page = provider->getPageOfAddress(region.address); auto page = provider->getPageOfAddress(region.address);
if (!page.has_value()) if (!page.has_value())
return; return;
@ -110,7 +110,7 @@ namespace hex {
} }
void ViewHexEditor::drawContent() { void ViewHexEditor::drawContent() {
auto provider = *SharedData::get().currentProvider; auto provider = SharedData::currentProvider;
size_t dataSize = (provider == nullptr || !provider->isReadable()) ? 0x00 : provider->getSize(); size_t dataSize = (provider == nullptr || !provider->isReadable()) ? 0x00 : provider->getSize();
@ -300,7 +300,7 @@ namespace hex {
} }
void ViewHexEditor::drawMenu() { void ViewHexEditor::drawMenu() {
auto provider = *SharedData::get().currentProvider; auto provider = SharedData::currentProvider;
if (ImGui::BeginMenu("File")) { if (ImGui::BeginMenu("File")) {
if (ImGui::MenuItem("Open File...", "CTRL + O")) { if (ImGui::MenuItem("Open File...", "CTRL + O")) {
@ -415,7 +415,7 @@ namespace hex {
bool ViewHexEditor::handleShortcut(int key, int mods) { bool ViewHexEditor::handleShortcut(int key, int mods) {
if (mods == GLFW_MOD_CONTROL && key == GLFW_KEY_S) { if (mods == GLFW_MOD_CONTROL && key == GLFW_KEY_S) {
auto provider = *SharedData::get().currentProvider; auto provider = SharedData::currentProvider;
for (const auto &[address, value] : provider->getPatches()) for (const auto &[address, value] : provider->getPatches())
provider->writeRaw(address, &value, sizeof(u8)); provider->writeRaw(address, &value, sizeof(u8));
return true; return true;
@ -444,7 +444,7 @@ namespace hex {
void ViewHexEditor::openFile(std::string path) { void ViewHexEditor::openFile(std::string path) {
auto& provider = *SharedData::get().currentProvider; auto& provider = SharedData::currentProvider;
if (provider != nullptr) if (provider != nullptr)
delete provider; delete provider;
@ -493,7 +493,7 @@ namespace hex {
} }
void ViewHexEditor::copyBytes() { void ViewHexEditor::copyBytes() {
auto provider = *SharedData::get().currentProvider; auto provider = SharedData::currentProvider;
size_t start = std::min(this->m_memoryEditor.DataPreviewAddr, this->m_memoryEditor.DataPreviewAddrEnd); size_t start = std::min(this->m_memoryEditor.DataPreviewAddr, this->m_memoryEditor.DataPreviewAddrEnd);
size_t end = std::max(this->m_memoryEditor.DataPreviewAddr, this->m_memoryEditor.DataPreviewAddrEnd); size_t end = std::max(this->m_memoryEditor.DataPreviewAddr, this->m_memoryEditor.DataPreviewAddrEnd);
@ -512,7 +512,7 @@ namespace hex {
} }
void ViewHexEditor::copyString() { void ViewHexEditor::copyString() {
auto provider = *SharedData::get().currentProvider; auto provider = SharedData::currentProvider;
size_t start = std::min(this->m_memoryEditor.DataPreviewAddr, this->m_memoryEditor.DataPreviewAddrEnd); size_t start = std::min(this->m_memoryEditor.DataPreviewAddr, this->m_memoryEditor.DataPreviewAddrEnd);
size_t end = std::max(this->m_memoryEditor.DataPreviewAddr, this->m_memoryEditor.DataPreviewAddrEnd); size_t end = std::max(this->m_memoryEditor.DataPreviewAddr, this->m_memoryEditor.DataPreviewAddrEnd);
@ -527,7 +527,7 @@ namespace hex {
} }
void ViewHexEditor::copyLanguageArray(Language language) { void ViewHexEditor::copyLanguageArray(Language language) {
auto provider = *SharedData::get().currentProvider; auto provider = SharedData::currentProvider;
size_t start = std::min(this->m_memoryEditor.DataPreviewAddr, this->m_memoryEditor.DataPreviewAddrEnd); size_t start = std::min(this->m_memoryEditor.DataPreviewAddr, this->m_memoryEditor.DataPreviewAddrEnd);
size_t end = std::max(this->m_memoryEditor.DataPreviewAddr, this->m_memoryEditor.DataPreviewAddrEnd); size_t end = std::max(this->m_memoryEditor.DataPreviewAddr, this->m_memoryEditor.DataPreviewAddrEnd);
@ -629,7 +629,7 @@ namespace hex {
} }
void ViewHexEditor::copyHexView() { void ViewHexEditor::copyHexView() {
auto provider = *SharedData::get().currentProvider; auto provider = SharedData::currentProvider;
size_t start = std::min(this->m_memoryEditor.DataPreviewAddr, this->m_memoryEditor.DataPreviewAddrEnd); size_t start = std::min(this->m_memoryEditor.DataPreviewAddr, this->m_memoryEditor.DataPreviewAddrEnd);
size_t end = std::max(this->m_memoryEditor.DataPreviewAddr, this->m_memoryEditor.DataPreviewAddrEnd); size_t end = std::max(this->m_memoryEditor.DataPreviewAddr, this->m_memoryEditor.DataPreviewAddrEnd);
@ -676,7 +676,7 @@ namespace hex {
} }
void ViewHexEditor::copyHexViewHTML() { void ViewHexEditor::copyHexViewHTML() {
auto provider = *SharedData::get().currentProvider; auto provider = SharedData::currentProvider;
size_t start = std::min(this->m_memoryEditor.DataPreviewAddr, this->m_memoryEditor.DataPreviewAddrEnd); size_t start = std::min(this->m_memoryEditor.DataPreviewAddr, this->m_memoryEditor.DataPreviewAddrEnd);
size_t end = std::max(this->m_memoryEditor.DataPreviewAddr, this->m_memoryEditor.DataPreviewAddrEnd); size_t end = std::max(this->m_memoryEditor.DataPreviewAddr, this->m_memoryEditor.DataPreviewAddrEnd);
@ -809,7 +809,7 @@ R"(
void ViewHexEditor::drawSearchPopup() { void ViewHexEditor::drawSearchPopup() {
static auto InputCallback = [](ImGuiInputTextCallbackData* data) -> int { static auto InputCallback = [](ImGuiInputTextCallbackData* data) -> int {
auto _this = static_cast<ViewHexEditor*>(data->UserData); auto _this = static_cast<ViewHexEditor*>(data->UserData);
auto provider = *SharedData::get().currentProvider; auto provider = SharedData::currentProvider;
*_this->m_lastSearchBuffer = _this->m_searchFunction(provider, data->Buf); *_this->m_lastSearchBuffer = _this->m_searchFunction(provider, data->Buf);
_this->m_lastSearchIndex = 0; _this->m_lastSearchIndex = 0;
@ -821,7 +821,7 @@ R"(
}; };
static auto Find = [this](char *buffer) { static auto Find = [this](char *buffer) {
auto provider = *SharedData::get().currentProvider; auto provider = SharedData::currentProvider;
*this->m_lastSearchBuffer = this->m_searchFunction(provider, buffer); *this->m_lastSearchBuffer = this->m_searchFunction(provider, buffer);
this->m_lastSearchIndex = 0; this->m_lastSearchIndex = 0;
@ -899,7 +899,7 @@ R"(
} }
void ViewHexEditor::drawGotoPopup() { void ViewHexEditor::drawGotoPopup() {
auto provider = *SharedData::get().currentProvider; auto provider = SharedData::currentProvider;
if (ImGui::BeginPopup("Goto")) { if (ImGui::BeginPopup("Goto")) {
ImGui::TextUnformatted("Goto"); ImGui::TextUnformatted("Goto");
@ -1003,7 +1003,7 @@ R"(
View::postEvent(Events::AddBookmark, &bookmark); View::postEvent(Events::AddBookmark, &bookmark);
} }
auto provider = *SharedData::get().currentProvider; auto provider = SharedData::currentProvider;
if (ImGui::MenuItem("Set base address", nullptr, false, provider != nullptr && provider->isReadable())) { if (ImGui::MenuItem("Set base address", nullptr, false, provider != nullptr && provider->isReadable())) {
std::memset(this->m_baseAddressBuffer, sizeof(this->m_baseAddressBuffer), 0x00); std::memset(this->m_baseAddressBuffer, sizeof(this->m_baseAddressBuffer), 0x00);
View::doLater([]{ ImGui::OpenPopup("Set base address"); }); View::doLater([]{ ImGui::OpenPopup("Set base address"); });

View File

@ -49,7 +49,7 @@ namespace hex {
if (ImGui::Begin("Data Information", &this->getWindowOpenState(), ImGuiWindowFlags_NoCollapse)) { if (ImGui::Begin("Data Information", &this->getWindowOpenState(), ImGuiWindowFlags_NoCollapse)) {
ImGui::BeginChild("##scrolling", ImVec2(0, 0), false, ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoNav); ImGui::BeginChild("##scrolling", ImVec2(0, 0), false, ImGuiWindowFlags_NoMove | ImGuiWindowFlags_NoNav);
auto provider = *SharedData::get().currentProvider; auto provider = SharedData::currentProvider;
if (provider != nullptr && provider->isReadable()) { if (provider != nullptr && provider->isReadable()) {
if (this->m_shouldInvalidate) { if (this->m_shouldInvalidate) {
@ -135,7 +135,7 @@ namespace hex {
if (this->m_dataValid) { if (this->m_dataValid) {
for (auto &[name, value] : (*SharedData::get().currentProvider)->getDataInformation()) { for (auto &[name, value] : (SharedData::currentProvider)->getDataInformation()) {
ImGui::LabelText(name.c_str(), "%s", value.c_str()); ImGui::LabelText(name.c_str(), "%s", value.c_str());
} }

View File

@ -13,13 +13,13 @@ namespace hex {
ViewPatches::ViewPatches() : View("Patches") { ViewPatches::ViewPatches() : View("Patches") {
View::subscribeEvent(Events::ProjectFileStore, [this](const void*) { View::subscribeEvent(Events::ProjectFileStore, [this](const void*) {
auto provider = *SharedData::get().currentProvider; auto provider = SharedData::currentProvider;
if (provider != nullptr) if (provider != nullptr)
ProjectFile::setPatches(provider->getPatches()); ProjectFile::setPatches(provider->getPatches());
}); });
View::subscribeEvent(Events::ProjectFileLoad, [this](const void*) { View::subscribeEvent(Events::ProjectFileLoad, [this](const void*) {
auto provider = *SharedData::get().currentProvider; auto provider = SharedData::currentProvider;
if (provider != nullptr) if (provider != nullptr)
provider->getPatches() = ProjectFile::getPatches(); provider->getPatches() = ProjectFile::getPatches();
}); });
@ -32,7 +32,7 @@ namespace hex {
void ViewPatches::drawContent() { void ViewPatches::drawContent() {
if (ImGui::Begin("Patches", &this->getWindowOpenState(), ImGuiWindowFlags_NoCollapse)) { if (ImGui::Begin("Patches", &this->getWindowOpenState(), ImGuiWindowFlags_NoCollapse)) {
auto provider = *SharedData::get().currentProvider; auto provider = SharedData::currentProvider;
if (provider != nullptr && provider->isReadable()) { if (provider != nullptr && provider->isReadable()) {

View File

@ -112,7 +112,7 @@ namespace hex {
if (error) if (error)
return; return;
auto provider = *SharedData::get().currentProvider; auto provider = SharedData::currentProvider;
if (provider == nullptr) if (provider == nullptr)
return; return;
@ -224,7 +224,7 @@ namespace hex {
void ViewPattern::drawContent() { void ViewPattern::drawContent() {
if (ImGui::Begin("Pattern", &this->getWindowOpenState(), ImGuiWindowFlags_None | ImGuiWindowFlags_NoCollapse)) { if (ImGui::Begin("Pattern", &this->getWindowOpenState(), ImGuiWindowFlags_None | ImGuiWindowFlags_NoCollapse)) {
auto provider = *SharedData::get().currentProvider; auto provider = SharedData::currentProvider;
if (provider != nullptr && provider->isAvailable()) { if (provider != nullptr && provider->isAvailable()) {
auto textEditorSize = ImGui::GetContentRegionAvail(); auto textEditorSize = ImGui::GetContentRegionAvail();
@ -378,7 +378,7 @@ namespace hex {
return; return;
} }
auto provider = *SharedData::get().currentProvider; auto provider = SharedData::currentProvider;
hex::lang::Evaluator evaluator(provider, defaultDataEndianess); hex::lang::Evaluator evaluator(provider, defaultDataEndianess);
auto patternData = evaluator.evaluate(ast.value()); auto patternData = evaluator.evaluate(ast.value());

View File

@ -50,7 +50,7 @@ namespace hex {
void ViewPatternData::drawContent() { void ViewPatternData::drawContent() {
if (ImGui::Begin("Pattern Data", &this->getWindowOpenState(), ImGuiWindowFlags_NoCollapse)) { if (ImGui::Begin("Pattern Data", &this->getWindowOpenState(), ImGuiWindowFlags_NoCollapse)) {
auto provider = *SharedData::get().currentProvider; auto provider = SharedData::currentProvider;
if (provider != nullptr && provider->isReadable()) { if (provider != nullptr && provider->isReadable()) {
if (beginPatternDataTable(provider, this->m_patternData, this->m_sortedPatternData)) { if (beginPatternDataTable(provider, this->m_patternData, this->m_sortedPatternData)) {

View File

@ -47,7 +47,7 @@ namespace hex {
void ViewStrings::drawContent() { void ViewStrings::drawContent() {
auto provider = *SharedData::get().currentProvider; auto provider = SharedData::currentProvider;
if (this->m_shouldInvalidate) { if (this->m_shouldInvalidate) {
this->m_shouldInvalidate = false; this->m_shouldInvalidate = false;

View File

@ -42,7 +42,7 @@ namespace hex {
this->m_mathEvaluator.setFunction("read", [this](auto args) -> std::optional<long double> { this->m_mathEvaluator.setFunction("read", [this](auto args) -> std::optional<long double> {
u8 value = 0; u8 value = 0;
auto provider = *SharedData::get().currentProvider; auto provider = SharedData::currentProvider;
if (provider == nullptr || !provider->isReadable() || args[0] >= provider->getActualSize()) if (provider == nullptr || !provider->isReadable() || args[0] >= provider->getActualSize())
return { }; return { };
@ -52,7 +52,7 @@ namespace hex {
}, 1, 1); }, 1, 1);
this->m_mathEvaluator.setFunction("write", [this](auto args) -> std::optional<long double> { this->m_mathEvaluator.setFunction("write", [this](auto args) -> std::optional<long double> {
auto provider = *SharedData::get().currentProvider; auto provider = SharedData::currentProvider;
if (provider == nullptr || !provider->isWritable() || args[0] >= provider->getActualSize()) if (provider == nullptr || !provider->isWritable() || args[0] >= provider->getActualSize())
return { }; return { };

View File

@ -45,10 +45,8 @@ namespace hex {
} }
Window::Window(int &argc, char **&argv) { Window::Window(int &argc, char **&argv) {
SharedData::get().initializeData(); hex::SharedData::mainArgc = argc;
hex::SharedData::mainArgv = argv;
hex::SharedData::get().mainArgc = &argc;
hex::SharedData::get().mainArgv = &argv;
ContentRegistry::Settings::load(); ContentRegistry::Settings::load();
View::postEvent(Events::SettingsChanged, nullptr); View::postEvent(Events::SettingsChanged, nullptr);
@ -254,21 +252,21 @@ namespace hex {
{ {
int x = 0, y = 0; int x = 0, y = 0;
glfwGetWindowPos(this->m_window, &x, &y); glfwGetWindowPos(this->m_window, &x, &y);
*SharedData::get().windowPos = ImVec2(x, y); SharedData::windowPos = ImVec2(x, y);
} }
{ {
int width = 0, height = 0; int width = 0, height = 0;
glfwGetWindowSize(this->m_window, &width, &height); glfwGetWindowSize(this->m_window, &width, &height);
*SharedData::get().windowSize = ImVec2(width, height); SharedData::windowSize = ImVec2(width, height);
} }
glfwSetWindowPosCallback(this->m_window, [](GLFWwindow *window, int x, int y) { glfwSetWindowPosCallback(this->m_window, [](GLFWwindow *window, int x, int y) {
*SharedData::get().windowPos = ImVec2(x, y); SharedData::windowPos = ImVec2(x, y);
}); });
glfwSetWindowSizeCallback(this->m_window, [](GLFWwindow *window, int width, int height) { glfwSetWindowSizeCallback(this->m_window, [](GLFWwindow *window, int width, int height) {
*SharedData::get().windowSize = ImVec2(width, height); SharedData::windowSize = ImVec2(width, height);
}); });
glfwSetKeyCallback(this->m_window, [](GLFWwindow *window, int key, int scancode, int action, int mods) { glfwSetKeyCallback(this->m_window, [](GLFWwindow *window, int key, int scancode, int action, int mods) {
@ -297,6 +295,8 @@ namespace hex {
void Window::initImGui() { void Window::initImGui() {
IMGUI_CHECKVERSION(); IMGUI_CHECKVERSION();
auto *ctx = ImGui::CreateContext(); auto *ctx = ImGui::CreateContext();
GImGui = ctx;
ImGuiIO& io = ImGui::GetIO(); ImGuiIO& io = ImGui::GetIO();
ImGuiStyle& style = ImGui::GetStyle(); ImGuiStyle& style = ImGui::GetStyle();
@ -307,7 +307,7 @@ namespace hex {
style.ScaleAllSizes(this->m_globalScale); style.ScaleAllSizes(this->m_globalScale);
#ifdef __MINGW32__ #ifdef __MINGW32__
std::filesystem::path resourcePath = std::filesystem::path((*SharedData::get().mainArgv)[0]).parent_path(); std::filesystem::path resourcePath = std::filesystem::path((SharedData::mainArgv)[0]).parent_path();
#elif defined(__linux__) #elif defined(__linux__)
std::filesystem::path resourcePath = "/usr/share/ImHex"; std::filesystem::path resourcePath = "/usr/share/ImHex";
#else #else
@ -346,15 +346,13 @@ namespace hex {
} }
void Window::initPlugins() { void Window::initPlugins() {
(*SharedData::get().imguiContext) = ImGui::GetCurrentContext();
try { try {
auto pluginFolderPath = std::filesystem::path((*SharedData::get().mainArgv)[0]).parent_path() / "plugins"; auto pluginFolderPath = std::filesystem::path((SharedData::mainArgv)[0]).parent_path() / "plugins";
PluginHandler::load(pluginFolderPath.string()); PluginHandler::load(pluginFolderPath.string());
} catch (std::runtime_error &e) { return; } } catch (std::runtime_error &e) { return; }
for (const auto &plugin : PluginHandler::getPlugins()) { for (const auto &plugin : PluginHandler::getPlugins()) {
plugin.initializePlugin(SharedData::get()); plugin.initializePlugin();
} }
} }