diff --git a/lib/external/libromfs b/lib/external/libromfs index 59d8ceccb..40cd303e9 160000 --- a/lib/external/libromfs +++ b/lib/external/libromfs @@ -1 +1 @@ -Subproject commit 59d8ceccb0b668e16a5d2b25c457514c9e8c1493 +Subproject commit 40cd303e9213e544a3ff21562b16406140f254ec diff --git a/lib/libimhex/include/hex/providers/provider.hpp b/lib/libimhex/include/hex/providers/provider.hpp index c0cfe47b8..fa97e98a3 100644 --- a/lib/libimhex/include/hex/providers/provider.hpp +++ b/lib/libimhex/include/hex/providers/provider.hpp @@ -64,7 +64,8 @@ namespace hex::prv { [[nodiscard]] virtual std::optional getPageOfAddress(u64 address) const; [[nodiscard]] virtual std::string getName() const = 0; - [[nodiscard]] virtual std::vector> getDataInformation() const = 0; + [[nodiscard]] virtual std::vector> getDataDescription() const = 0; + [[nodiscard]] virtual std::variant queryInformation(const std::string &category, const std::string &argument); [[nodiscard]] virtual bool open() = 0; virtual void close() = 0; diff --git a/lib/libimhex/source/providers/provider.cpp b/lib/libimhex/source/providers/provider.cpp index 0c51e20b2..3a160d779 100644 --- a/lib/libimhex/source/providers/provider.cpp +++ b/lib/libimhex/source/providers/provider.cpp @@ -8,6 +8,8 @@ #include #include +#include + namespace hex::prv { u32 Provider::s_idCounter = 0; @@ -301,4 +303,16 @@ namespace hex::prv { s_idCounter = id + 1; } + + [[nodiscard]] std::variant Provider::queryInformation(const std::string &category, const std::string &) { + if (category == "mime") + return magic::getMIMEType(this); + else if (category == "description") + return magic::getDescription(this); + else if (category == "provider_type") + return this->getTypeName(); + else + return 0; + } + } diff --git a/plugins/builtin/include/content/providers/disk_provider.hpp b/plugins/builtin/include/content/providers/disk_provider.hpp index c2bcbbdc5..9a326beeb 100644 --- a/plugins/builtin/include/content/providers/disk_provider.hpp +++ b/plugins/builtin/include/content/providers/disk_provider.hpp @@ -34,7 +34,7 @@ namespace hex::plugin::builtin { void close() override; [[nodiscard]] std::string getName() const override; - [[nodiscard]] std::vector> getDataInformation() const override; + [[nodiscard]] std::vector> getDataDescription() const override; [[nodiscard]] bool hasLoadInterface() const override { return true; } void drawLoadInterface() override; @@ -47,6 +47,7 @@ namespace hex::plugin::builtin { } [[nodiscard]] std::pair getRegionValidity(u64 address) const override; + std::variant queryInformation(const std::string &category, const std::string &argument) override; protected: void reloadDrives(); diff --git a/plugins/builtin/include/content/providers/file_provider.hpp b/plugins/builtin/include/content/providers/file_provider.hpp index a64f300c6..b8ae6baa7 100644 --- a/plugins/builtin/include/content/providers/file_provider.hpp +++ b/plugins/builtin/include/content/providers/file_provider.hpp @@ -47,7 +47,8 @@ namespace hex::plugin::builtin { void saveAs(const std::fs::path &path) override; [[nodiscard]] std::string getName() const override; - [[nodiscard]] std::vector> getDataInformation() const override; + [[nodiscard]] std::vector> getDataDescription() const override; + std::variant queryInformation(const std::string &category, const std::string &argument) override; [[nodiscard]] bool hasFilePicker() const override { return true; } [[nodiscard]] bool handleFilePicker() override; diff --git a/plugins/builtin/include/content/providers/gdb_provider.hpp b/plugins/builtin/include/content/providers/gdb_provider.hpp index 78ee6f209..a5d3e0f9f 100644 --- a/plugins/builtin/include/content/providers/gdb_provider.hpp +++ b/plugins/builtin/include/content/providers/gdb_provider.hpp @@ -32,7 +32,7 @@ namespace hex::plugin::builtin { void saveAs(const std::fs::path &path) override; [[nodiscard]] std::string getName() const override; - [[nodiscard]] std::vector> getDataInformation() const override; + [[nodiscard]] std::vector> getDataDescription() const override; [[nodiscard]] bool open() override; void close() override; @@ -50,6 +50,7 @@ namespace hex::plugin::builtin { } [[nodiscard]] std::pair getRegionValidity(u64 address) const override; + std::variant queryInformation(const std::string &category, const std::string &argument) override; protected: hex::Socket m_socket; diff --git a/plugins/builtin/include/content/providers/intel_hex_provider.hpp b/plugins/builtin/include/content/providers/intel_hex_provider.hpp index 9e789bd44..bd8916f69 100644 --- a/plugins/builtin/include/content/providers/intel_hex_provider.hpp +++ b/plugins/builtin/include/content/providers/intel_hex_provider.hpp @@ -27,7 +27,7 @@ namespace hex::plugin::builtin { void close() override; [[nodiscard]] std::string getName() const override; - [[nodiscard]] std::vector> getDataInformation() const override { return { }; } + [[nodiscard]] std::vector> getDataDescription() const override { return { }; } void loadSettings(const nlohmann::json &settings) override; [[nodiscard]] nlohmann::json storeSettings(nlohmann::json settings) const override; diff --git a/plugins/builtin/include/content/providers/memory_file_provider.hpp b/plugins/builtin/include/content/providers/memory_file_provider.hpp index fa7337fe5..daa47081d 100644 --- a/plugins/builtin/include/content/providers/memory_file_provider.hpp +++ b/plugins/builtin/include/content/providers/memory_file_provider.hpp @@ -31,7 +31,7 @@ namespace hex::plugin::builtin { void saveAs(const std::fs::path &path) override; [[nodiscard]] std::string getName() const override { return LangEntry("hex.builtin.provider.mem_file.unsaved"); } - [[nodiscard]] std::vector> getDataInformation() const override { return { }; } + [[nodiscard]] std::vector> getDataDescription() const override { return { }; } [[nodiscard]] std::string getTypeName() const override { return "hex.builtin.provider.mem_file"; diff --git a/plugins/builtin/include/content/providers/null_provider.hpp b/plugins/builtin/include/content/providers/null_provider.hpp index 583158ca1..81ce5ac45 100644 --- a/plugins/builtin/include/content/providers/null_provider.hpp +++ b/plugins/builtin/include/content/providers/null_provider.hpp @@ -23,7 +23,7 @@ namespace hex::plugin::builtin { [[nodiscard]] size_t getActualSize() const override { return 0x00; } [[nodiscard]] std::string getName() const override { return "None"; } - [[nodiscard]] std::vector> getDataInformation() const override { return { }; } + [[nodiscard]] std::vector> getDataDescription() const override { return { }; } void loadSettings(const nlohmann::json &settings) override { hex::unused(settings); } [[nodiscard]] nlohmann::json storeSettings(nlohmann::json settings) const override { return settings; } diff --git a/plugins/builtin/include/content/providers/view_provider.hpp b/plugins/builtin/include/content/providers/view_provider.hpp index 3a6b194e4..22186a771 100644 --- a/plugins/builtin/include/content/providers/view_provider.hpp +++ b/plugins/builtin/include/content/providers/view_provider.hpp @@ -41,7 +41,7 @@ namespace hex::plugin::builtin { [[nodiscard]] size_t getActualSize() const override { return this->m_size; } [[nodiscard]] std::string getName() const override { return hex::format("{} View", this->m_provider->getName()); } - [[nodiscard]] std::vector> getDataInformation() const override { return this->m_provider->getDataInformation(); } + [[nodiscard]] std::vector> getDataDescription() const override { return this->m_provider->getDataDescription(); } void loadSettings(const nlohmann::json &settings) override { hex::unused(settings); } [[nodiscard]] nlohmann::json storeSettings(nlohmann::json settings) const override { return settings; } diff --git a/plugins/builtin/source/content/pl_builtin_functions.cpp b/plugins/builtin/source/content/pl_builtin_functions.cpp index 5b0a4f4ab..7aade1383 100644 --- a/plugins/builtin/source/content/pl_builtin_functions.cpp +++ b/plugins/builtin/source/content/pl_builtin_functions.cpp @@ -1,5 +1,6 @@ #include +#include #include #include @@ -27,6 +28,29 @@ namespace hex::plugin::builtin { }); } + pl::api::Namespace nsHexPrv = { "builtin", "hex", "prv" }; + { + /* get_information() */ + ContentRegistry::PatternLanguage::addFunction(nsHexCore, "get_information", FunctionParameterCount::between(1, 2), [](Evaluator *, auto params) -> std::optional { + std::string category = params[0].toString(false); + std::string argument = params.size() == 2 ? params[1].toString(false) : ""; + + if (!ImHexApi::Provider::isValid()) + return u128(0); + + auto provider = ImHexApi::Provider::get(); + if (!provider->isAvailable()) + return u128(0); + + return std::visit( + [](auto &&value) -> Token::Literal { + return value; + }, + provider->queryInformation(category, argument) + ); + }); + } + pl::api::Namespace nsHexDec = { "builtin", "hex", "dec" }; { /* demangle(mangled_string) */ diff --git a/plugins/builtin/source/content/providers/disk_provider.cpp b/plugins/builtin/source/content/providers/disk_provider.cpp index 6a38f6fa2..874a64f00 100644 --- a/plugins/builtin/source/content/providers/disk_provider.cpp +++ b/plugins/builtin/source/content/providers/disk_provider.cpp @@ -262,7 +262,7 @@ namespace hex::plugin::builtin { return hex::toUTF8String(this->m_path); } - std::vector> DiskProvider::getDataInformation() const { + std::vector> DiskProvider::getDataDescription() const { return { { "hex.builtin.provider.disk.selected_disk"_lang, hex::toUTF8String(this->m_path) }, { "hex.builtin.provider.disk.disk_size"_lang, hex::toByteString(this->m_diskSize) }, @@ -363,4 +363,13 @@ namespace hex::plugin::builtin { return { Region::Invalid(), false }; } + std::variant DiskProvider::queryInformation(const std::string &category, const std::string &argument) { + if (category == "file_path") + return hex::toUTF8String(this->m_path); + else if (category == "sector_size") + return this->m_sectorSize; + else + return Provider::queryInformation(category, argument); + } + } \ No newline at end of file diff --git a/plugins/builtin/source/content/providers/file_provider.cpp b/plugins/builtin/source/content/providers/file_provider.cpp index 8ff441de5..51bc391c8 100644 --- a/plugins/builtin/source/content/providers/file_provider.cpp +++ b/plugins/builtin/source/content/providers/file_provider.cpp @@ -158,7 +158,7 @@ namespace hex::plugin::builtin { return hex::toUTF8String(this->m_path.filename()); } - std::vector> FileProvider::getDataInformation() const { + std::vector> FileProvider::getDataDescription() const { std::vector> result; result.emplace_back("hex.builtin.provider.file.path"_lang, hex::toUTF8String(this->m_path)); @@ -173,6 +173,25 @@ namespace hex::plugin::builtin { return result; } + std::variant FileProvider::queryInformation(const std::string &category, const std::string &argument) { + if (category == "file_path") + return hex::toUTF8String(this->m_path); + else if (category == "file_name") + return hex::toUTF8String(this->m_path.filename()); + else if (category == "file_extension") + return hex::toUTF8String(this->m_path.extension()); + else if (category == "creation_time") + return this->m_fileStats.st_ctime; + else if (category == "access_time") + return this->m_fileStats.st_atime; + else if (category == "modification_time") + return this->m_fileStats.st_mtime; + else if (category == "permissions") + return this->m_fileStats.st_mode & 0777; + else + return Provider::queryInformation(category, argument); + } + bool FileProvider::handleFilePicker() { return fs::openFileBrowser(fs::DialogMode::Open, {}, [this](const auto &path) { this->setPath(path); diff --git a/plugins/builtin/source/content/providers/gdb_provider.cpp b/plugins/builtin/source/content/providers/gdb_provider.cpp index 3bb38e834..1fdece352 100644 --- a/plugins/builtin/source/content/providers/gdb_provider.cpp +++ b/plugins/builtin/source/content/providers/gdb_provider.cpp @@ -234,7 +234,7 @@ namespace hex::plugin::builtin { return hex::format("hex.builtin.provider.gdb.name"_lang, address, port); } - std::vector> GDBProvider::getDataInformation() const { + std::vector> GDBProvider::getDataDescription() const { return { {"hex.builtin.provider.gdb.server"_lang, hex::format("{}:{}", this->m_ipAddress, this->m_port)}, }; @@ -331,4 +331,13 @@ namespace hex::plugin::builtin { return { Region::Invalid(), false }; } + std::variant GDBProvider::queryInformation(const std::string &category, const std::string &argument) { + if (category == "ip") + return this->m_ipAddress; + else if (category == "port") + return this->m_port; + else + return Provider::queryInformation(category, argument); + } + } \ No newline at end of file diff --git a/plugins/builtin/source/content/views/view_information.cpp b/plugins/builtin/source/content/views/view_information.cpp index d6e363eed..70b9bb208 100644 --- a/plugins/builtin/source/content/views/view_information.cpp +++ b/plugins/builtin/source/content/views/view_information.cpp @@ -226,7 +226,7 @@ namespace hex::plugin::builtin { ImGui::TableNextRow(); - for (auto &[name, value] : provider->getDataInformation()) { + for (auto &[name, value] : provider->getDataDescription()) { ImGui::TableNextColumn(); ImGui::TextFormatted("{}", name); ImGui::TableNextColumn(); diff --git a/plugins/windows/include/content/providers/process_memory_provider.hpp b/plugins/windows/include/content/providers/process_memory_provider.hpp index 1b9cc90ce..d8dd70b20 100644 --- a/plugins/windows/include/content/providers/process_memory_provider.hpp +++ b/plugins/windows/include/content/providers/process_memory_provider.hpp @@ -38,7 +38,7 @@ namespace hex::plugin::windows { void saveAs(const std::fs::path &) override {} [[nodiscard]] std::string getName() const override { return hex::format("hex.windows.provider.process_memory.name"_lang, this->m_selectedProcess != nullptr ? this->m_selectedProcess->name : ""); } - [[nodiscard]] std::vector> getDataInformation() const override { + [[nodiscard]] std::vector> getDataDescription() const override { return { { "hex.windows.provider.process_memory.process_name"_lang, this->m_selectedProcess->name }, { "hex.windows.provider.process_memory.process_id"_lang, std::to_string(this->m_selectedProcess->id) } @@ -61,6 +61,7 @@ namespace hex::plugin::windows { } [[nodiscard]] std::pair getRegionValidity(u64) const override; + std::variant queryInformation(const std::string &category, const std::string &argument) override; private: void reloadProcessModules(); diff --git a/plugins/windows/source/content/providers/process_memory_provider.cpp b/plugins/windows/source/content/providers/process_memory_provider.cpp index 0ea04ab10..f84fc76b6 100644 --- a/plugins/windows/source/content/providers/process_memory_provider.cpp +++ b/plugins/windows/source/content/providers/process_memory_provider.cpp @@ -269,4 +269,31 @@ namespace hex::plugin::windows { } } + + std::variant ProcessMemoryProvider::queryInformation(const std::string &category, const std::string &argument) { + auto findRegionByName = [this](const std::string &name) { + return std::find_if(this->m_memoryRegions.begin(), this->m_memoryRegions.end(), + [name](const auto ®ion) { + return region.name == name; + }); + }; + + if (category == "region_address") { + if (auto iter = findRegionByName(argument); iter != this->m_memoryRegions.end()) + return iter->region.getStartAddress(); + else + return 0; + } else if (category == "region_size") { + if (auto iter = findRegionByName(argument); iter != this->m_memoryRegions.end()) + return iter->region.getSize(); + else + return 0; + } else if (category == "process_id") { + return this->m_selectedProcess->id; + } else if (category == "process_name") { + return this->m_selectedProcess->name; + } else + return Provider::queryInformation(category, argument); + } + } \ No newline at end of file diff --git a/tests/common/include/hex/test/test_provider.hpp b/tests/common/include/hex/test/test_provider.hpp index 63980630c..320847de4 100644 --- a/tests/common/include/hex/test/test_provider.hpp +++ b/tests/common/include/hex/test/test_provider.hpp @@ -28,7 +28,7 @@ namespace hex::test { return ""; } - [[nodiscard]] std::vector> getDataInformation() const override { + [[nodiscard]] std::vector> getDataDescription() const override { return {}; }