Compare commits

..

9 Commits

Author SHA1 Message Date
WerWolv
0e6446b3ef build: Bumped version to 1.13.1 2022-01-10 22:16:02 +01:00
WerWolv
b496fedea8 tests: Fixed pointer test 2022-01-10 22:15:05 +01:00
WerWolv
dc064008f3 build: Fix use of libromfs in plugin templates 2022-01-10 22:06:37 +01:00
WerWolv
652896bd3a lang: Added missing translation 2022-01-10 21:44:42 +01:00
WerWolv
1fe6dc4c6e fix: Occasional crash when disassembling files 2022-01-10 21:38:52 +01:00
WerWolv
e35ea13f60 sys: Improved view const-correctness 2022-01-10 21:05:37 +01:00
WerWolv
e1fb0a5d72 ui: Fixed settings window being huge 2022-01-10 21:05:18 +01:00
WerWolv
e204ef629f patterns: Fixed passing structs to functions as argument
Fixes #385
2022-01-10 20:02:18 +01:00
WerWolv
d2704242f2 patterns: Fixed pointer_base attribute
Hopefully takes care of #367
2022-01-10 00:40:34 +01:00
19 changed files with 108 additions and 73 deletions

View File

@@ -1,11 +1,12 @@
cmake_minimum_required(VERSION 3.16)
# Updating the version here will update it throughout ImHex as well
set(IMHEX_VERSION "1.13.0")
set(IMHEX_VERSION "1.13.1")
project(imhex VERSION ${IMHEX_VERSION})
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake/modules")
set(IMHEX_BASE_FOLDER ${CMAKE_CURRENT_SOURCE_DIR})
include("${CMAKE_SOURCE_DIR}/cmake/build_helpers.cmake")
# List plugin names here. Project name must match folder name

View File

@@ -11,8 +11,6 @@
namespace hex::plugin::builtin {
namespace prv { class Provider; }
class ViewCommandPalette : public View {
public:
ViewCommandPalette();
@@ -20,12 +18,12 @@ namespace hex::plugin::builtin {
void drawContent() override;
void drawMenu() override;
bool isAvailable() override { return true; }
bool shouldProcess() override { return true; }
[[nodiscard]] bool isAvailable() const override { return true; }
[[nodiscard]] bool shouldProcess() const override { return true; }
bool hasViewMenuItemEntry() override { return false; }
ImVec2 getMinSize() override { return ImVec2(400, 100); }
ImVec2 getMaxSize() override { return ImVec2(400, 100); }
[[nodiscard]] bool hasViewMenuItemEntry() const override { return false; }
[[nodiscard]] ImVec2 getMinSize() const override { return ImVec2(400, 100); }
[[nodiscard]] ImVec2 getMaxSize() const override { return ImVec2(400, 100); }
private:
enum class MatchType {

View File

@@ -20,11 +20,11 @@ namespace hex::plugin::builtin {
void drawContent() override;
void drawMenu() override;
bool isAvailable() override { return true; }
bool isAvailable() const override { return true; }
bool hasViewMenuItemEntry() override { return false; }
bool hasViewMenuItemEntry() const override { return false; }
ImVec2 getMinSize() override {
ImVec2 getMinSize() const override {
return ImVec2(400, 300);
}

View File

@@ -13,14 +13,14 @@ namespace hex::plugin::builtin {
class ViewProviderSettings : public hex::View {
public:
ViewProviderSettings();
~ViewProviderSettings();
~ViewProviderSettings() override;
void drawContent() override;
void drawAlwaysVisible() override;
bool hasViewMenuItemEntry() override;
[[nodiscard]] bool hasViewMenuItemEntry() const override;
bool isAvailable();
[[nodiscard]] bool isAvailable() const override;
};
}

View File

@@ -14,9 +14,13 @@ namespace hex::plugin::builtin {
void drawContent() override;
void drawMenu() override;
bool isAvailable() override { return true; }
[[nodiscard]] bool isAvailable() const override { return true; }
bool hasViewMenuItemEntry() override { return false; }
[[nodiscard]] bool hasViewMenuItemEntry() const override { return false; }
[[nodiscard]] ImVec2 getMinSize() const override {
return ImVec2(500, 300) * SharedData::globalScale;
}
};
}

View File

@@ -35,8 +35,8 @@ namespace hex::plugin::builtin {
void drawContent() override;
void drawMenu() override;
bool isAvailable() override { return true; }
bool hasViewMenuItemEntry() override { return false; }
[[nodiscard]] bool isAvailable() const override { return true; }
[[nodiscard]] bool hasViewMenuItemEntry() const override { return false; }
private:
Net m_net;

View File

@@ -281,31 +281,34 @@ namespace hex::plugin::builtin {
ImGui::TableSetupColumn("hex.builtin.view.disassembler.disassembly.bytes"_lang);
ImGui::TableSetupColumn("hex.builtin.view.disassembler.disassembly.title"_lang);
ImGuiListClipper clipper;
clipper.Begin(this->m_disassembly.size());
if (!this->m_disassembling) {
ImGuiListClipper clipper;
clipper.Begin(this->m_disassembly.size());
ImGui::TableHeadersRow();
while (clipper.Step()) {
for (u64 i = clipper.DisplayStart; i < clipper.DisplayEnd; i++) {
ImGui::TableNextRow();
ImGui::TableNextColumn();
if (ImGui::Selectable(("##DisassemblyLine"s + std::to_string(i)).c_str(), false, ImGuiSelectableFlags_SpanAllColumns)) {
EventManager::post<RequestSelectionChange>(Region { this->m_disassembly[i].offset, this->m_disassembly[i].size });
ImGui::TableHeadersRow();
while (clipper.Step()) {
for (u64 i = clipper.DisplayStart; i < clipper.DisplayEnd; i++) {
const auto &instruction = this->m_disassembly[i];
ImGui::TableNextRow();
ImGui::TableNextColumn();
if (ImGui::Selectable(("##DisassemblyLine"s + std::to_string(i)).c_str(), false, ImGuiSelectableFlags_SpanAllColumns)) {
EventManager::post<RequestSelectionChange>(Region { instruction.offset, instruction.size });
}
ImGui::SameLine();
ImGui::TextFormatted("0x{0:X}", instruction.address);
ImGui::TableNextColumn();
ImGui::TextFormatted("0x{0:X}", instruction.offset);
ImGui::TableNextColumn();
ImGui::TextUnformatted(instruction.bytes.c_str());
ImGui::TableNextColumn();
ImGui::TextFormattedColored(ImColor(0xFFD69C56), "{}", instruction.mnemonic);
ImGui::SameLine();
ImGui::TextUnformatted(instruction.operators.c_str());
}
ImGui::SameLine();
ImGui::TextFormatted("0x{0:X}", this->m_disassembly[i].address);
ImGui::TableNextColumn();
ImGui::TextFormatted("0x{0:X}", this->m_disassembly[i].offset);
ImGui::TableNextColumn();
ImGui::TextUnformatted(this->m_disassembly[i].bytes.c_str());
ImGui::TableNextColumn();
ImGui::TextFormattedColored(ImColor(0xFFD69C56), "{}", this->m_disassembly[i].mnemonic);
ImGui::SameLine();
ImGui::TextUnformatted(this->m_disassembly[i].operators.c_str());
}
}
clipper.End();
clipper.End();
}
ImGui::EndTable();
}

View File

@@ -52,11 +52,11 @@ namespace hex::plugin::builtin {
}
}
bool ViewProviderSettings::hasViewMenuItemEntry() {
bool ViewProviderSettings::hasViewMenuItemEntry() const {
return this->isAvailable();
}
bool ViewProviderSettings::isAvailable() {
bool ViewProviderSettings::isAvailable() const {
auto provider = hex::ImHexApi::Provider::get();
return provider != nullptr && provider->hasInterface();

View File

@@ -21,7 +21,6 @@ namespace hex::plugin::builtin {
void ViewSettings::drawContent() {
ImGui::SetNextWindowSize(ImVec2(500, 300) * SharedData::globalScale, ImGuiCond_Always);
if (ImGui::BeginPopupModal(View::toWindowName("hex.builtin.view.settings.name").c_str(), &this->getWindowOpenState(), ImGuiWindowFlags_NoResize)) {
if (ImGui::BeginTabBar("settings")) {
for (auto &[category, entries] : ContentRegistry::Settings::getEntries()) {

View File

@@ -185,6 +185,7 @@ namespace hex::plugin::builtin {
{ "hex.builtin.view.hexeditor.script.script.title", "Loader Script: Skript öffnen" },
{ "hex.builtin.view.hexeditor.script.file", "Datei" },
{ "hex.builtin.view.hexeditor.script.file.title", "Loader Script: Datei öffnen" },
{ "hex.builtin.view.hexeditor.processing", "Importieren / Exportieren" },
{ "hex.builtin.view.hexeditor.menu.file.open_file", "Datei öffnen..." },
{ "hex.builtin.view.hexeditor.menu.file.open_recent", "Kürzlich geöffnete Dateien" },

View File

@@ -188,7 +188,7 @@ namespace hex::plugin::builtin {
{ "hex.builtin.view.hexeditor.script.script.title", "Loader Script: Open Script" },
{ "hex.builtin.view.hexeditor.script.file", "File" },
{ "hex.builtin.view.hexeditor.script.file.title", "Loader Script: Open File" },
{ "hex.builtin.view.hexeditor.processing", "Processing" },
{ "hex.builtin.view.hexeditor.processing", "Importing / Exporting" },
{ "hex.builtin.view.hexeditor.menu.file.open_file", "Open File..." },
{ "hex.builtin.view.hexeditor.menu.file.open_recent", "Open Recent" },

View File

@@ -188,6 +188,7 @@ namespace hex::plugin::builtin {
{ "hex.builtin.view.hexeditor.script.script.title", "Caricatore Script: Apri Script" },
{ "hex.builtin.view.hexeditor.script.file", "File" },
{ "hex.builtin.view.hexeditor.script.file.title", "Caricatore Script: Apri File" },
//{ "hex.builtin.view.hexeditor.processing", "Importing / Exporting" },
{ "hex.builtin.view.hexeditor.menu.file.open_file", "Apri File..." },
{ "hex.builtin.view.hexeditor.menu.file.save", "Salva" },

View File

@@ -185,6 +185,7 @@ namespace hex::plugin::builtin {
{ "hex.builtin.view.hexeditor.script.script.title", "加载器脚本:打开脚本" },
{ "hex.builtin.view.hexeditor.script.file", "文件" },
{ "hex.builtin.view.hexeditor.script.file.title", "加载器脚本:打开文件" },
//{ "hex.builtin.view.hexeditor.processing", "Importing / Exporting" },
{ "hex.builtin.view.hexeditor.menu.file.open_file", "打开文件..." },
{ "hex.builtin.view.hexeditor.menu.file.open_recent", "打开最近" },

View File

@@ -13,7 +13,7 @@ set_target_properties(microtar PROPERTIES POSITION_INDEPENDENT_CODE ON)
add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/../../external/nativefiledialog ${CMAKE_CURRENT_BINARY_DIR}/external/nativefiledialog EXCLUDE_FROM_ALL)
set_target_properties(nfd PROPERTIES POSITION_INDEPENDENT_CODE ON)
set(LIBROMFS_RESOURCE_LOCATION ${CMAKE_SOURCE_DIR}/res/resources)
set(LIBROMFS_RESOURCE_LOCATION ${IMHEX_BASE_FOLDER}/res/resources)
add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/../../external/libromfs ${CMAKE_CURRENT_BINARY_DIR}/external/libromfs EXCLUDE_FROM_ALL)
set_target_properties(libromfs PROPERTIES POSITION_INDEPENDENT_CODE ON)

View File

@@ -718,16 +718,14 @@ namespace hex::pl {
LogConsole::abortEvaluation("pointer base function needs exactly one parameter", node);
if (auto pointerPattern = dynamic_cast<PatternDataPointer*>(pattern)) {
u128 value = 0;
evaluator->getProvider()->read(pattern->getOffset(), &value, pattern->getSize());
value = hex::changeEndianess(value, pattern->getSize(), pattern->getEndian());
u128 pointerValue = pointerPattern->getPointedAtAddress();
auto result = function.func(evaluator, { value });
auto result = function.func(evaluator, { pointerValue });
if (!result.has_value())
LogConsole::abortEvaluation("pointer base function did not return a value", node);
pointerPattern->rebase(Token::literalToUnsigned(result.value()));
pointerPattern->setPointedAtAddress(Token::literalToUnsigned(result.value()) + pointerValue);
} else {
LogConsole::abortEvaluation("pointer_base attribute may only be applied to a pointer");
}
@@ -1130,24 +1128,27 @@ namespace hex::pl {
}, offset->getValue());
}
auto offset = evaluator->dataOffset();
auto startOffset = evaluator->dataOffset();
auto sizePattern = this->m_sizeType->createPatterns(evaluator).front();
ON_SCOPE_EXIT { delete sizePattern; };
auto pattern = new PatternDataPointer(offset, sizePattern->getSize(), evaluator);
auto pattern = new PatternDataPointer(startOffset, sizePattern->getSize(), evaluator);
pattern->setVariableName(this->m_name);
applyVariableAttributes(evaluator, this, pattern);
offset = evaluator->dataOffset();
auto endOffset = evaluator->dataOffset();
{
u128 pointerAddress = 0;
evaluator->getProvider()->read(pattern->getOffset(), &pointerAddress, pattern->getSize());
pointerAddress = hex::changeEndianess(pointerAddress, sizePattern->getSize(), sizePattern->getEndian());
evaluator->dataOffset() = pointerAddress;
evaluator->dataOffset() = startOffset;
pattern->setPointedAtAddress(pointerAddress);
applyVariableAttributes(evaluator, this, pattern);
evaluator->dataOffset() = pattern->getPointedAtAddress();
auto pointedAtPattern = this->m_type->createPatterns(evaluator).front();
@@ -1155,7 +1156,7 @@ namespace hex::pl {
pattern->setEndian(sizePattern->getEndian());
}
evaluator->dataOffset() = offset;
evaluator->dataOffset() = endOffset;
return { pattern };
}
@@ -1716,15 +1717,21 @@ namespace hex::pl {
currPattern = newPattern;
}
if (auto structPattern = dynamic_cast<PatternDataStruct*>(currPattern))
PatternData *indexPattern;
if (currPattern->isLocal())
indexPattern = std::get<PatternData*>(evaluator->getStack()[currPattern->getOffset()]);
else
indexPattern = currPattern;
if (auto structPattern = dynamic_cast<PatternDataStruct*>(indexPattern))
searchScope = structPattern->getMembers();
else if (auto unionPattern = dynamic_cast<PatternDataUnion*>(currPattern))
else if (auto unionPattern = dynamic_cast<PatternDataUnion*>(indexPattern))
searchScope = unionPattern->getMembers();
else if (auto bitfieldPattern = dynamic_cast<PatternDataBitfield*>(currPattern))
else if (auto bitfieldPattern = dynamic_cast<PatternDataBitfield*>(indexPattern))
searchScope = bitfieldPattern->getFields();
else if (auto dynamicArrayPattern = dynamic_cast<PatternDataDynamicArray*>(currPattern))
else if (auto dynamicArrayPattern = dynamic_cast<PatternDataDynamicArray*>(indexPattern))
searchScope = dynamicArrayPattern->getEntries();
else if (auto staticArrayPattern = dynamic_cast<PatternDataStaticArray*>(currPattern))
else if (auto staticArrayPattern = dynamic_cast<PatternDataStaticArray*>(indexPattern))
searchScope = { staticArrayPattern->getTemplate() };
}

View File

@@ -378,7 +378,7 @@ namespace hex::pl {
ImGui::TableNextColumn();
ImGui::TextFormattedColored(ImColor(0xFF9BC64D), "{}", this->getFormattedName());
ImGui::TableNextColumn();
ImGui::TextFormatted("*(0x{0})", data);
ImGui::TextFormatted("*(0x{0:X})", data);
if (open) {
this->m_pointedAt->createEntry(provider);
@@ -423,6 +423,15 @@ namespace hex::pl {
void setPointedAtPattern(PatternData *pattern) {
this->m_pointedAt = pattern;
this->m_pointedAt->setVariableName(hex::format("*({})", this->getVariableName()));
this->m_pointedAt->setOffset(this->m_pointedAtAddress);
}
void setPointedAtAddress(u64 address) {
this->m_pointedAtAddress = address;
}
[[nodiscard]] u64 getPointedAtAddress() const {
return this->m_pointedAtAddress;
}
[[nodiscard]] PatternData* getPointedAtPattern() {
@@ -440,14 +449,18 @@ namespace hex::pl {
}
void rebase(u64 base) {
if (this->m_pointedAt != nullptr)
this->m_pointedAt->setOffset((this->m_pointedAt->getOffset() - this->m_pointerBase) + base);
if (this->m_pointedAt != nullptr) {
this->m_pointedAtAddress = (this->m_pointedAt->getOffset() - this->m_pointerBase) + base;
this->m_pointedAt->setOffset(this->m_pointedAtAddress);
}
this->m_pointerBase = base;
}
private:
PatternData *m_pointedAt = nullptr;
u64 m_pointedAtAddress = 0;
u64 m_pointerBase = 0;
};

View File

@@ -33,8 +33,8 @@ namespace hex {
virtual void drawContent() = 0;
virtual void drawAlwaysVisible() { }
virtual void drawMenu();
virtual bool isAvailable();
virtual bool shouldProcess() { return this->isAvailable() && this->getWindowOpenState(); }
virtual bool isAvailable() const;
virtual bool shouldProcess() const { return this->isAvailable() && this->getWindowOpenState(); }
static void doLater(std::function<void()> &&function);
static std::vector<std::function<void()>>& getDeferedCalls();
@@ -45,11 +45,12 @@ namespace hex {
static void showErrorPopup(const std::string &errorMessage);
static void showFatalPopup(const std::string &errorMessage);
virtual bool hasViewMenuItemEntry();
virtual ImVec2 getMinSize();
virtual ImVec2 getMaxSize();
virtual bool hasViewMenuItemEntry() const;
virtual ImVec2 getMinSize() const;
virtual ImVec2 getMaxSize() const;
bool& getWindowOpenState();
const bool& getWindowOpenState() const;
[[nodiscard]] const std::string& getUnlocalizedName() const;

View File

@@ -14,7 +14,7 @@ namespace hex {
void View::drawMenu() { }
bool View::isAvailable() {
bool View::isAvailable() const {
return ImHexApi::Provider::isValid() && ImHexApi::Provider::get()->isAvailable();
}
@@ -80,15 +80,15 @@ namespace hex {
View::doLater([] { ImGui::OpenPopup("hex.common.fatal"_lang); });
}
bool View::hasViewMenuItemEntry() {
bool View::hasViewMenuItemEntry() const {
return true;
}
ImVec2 View::getMinSize() {
ImVec2 View::getMinSize() const {
return ImVec2(480, 720) * SharedData::globalScale;
}
ImVec2 View::getMaxSize() {
ImVec2 View::getMaxSize() const {
return { FLT_MAX, FLT_MAX };
}
@@ -97,6 +97,10 @@ namespace hex {
return this->m_windowOpen;
}
const bool& View::getWindowOpenState() const {
return this->m_windowOpen;
}
const std::string& View::getUnlocalizedName() const {
return this->m_unlocalizedViewName;
}

View File

@@ -10,6 +10,8 @@ namespace hex::test {
// placementPointer
{
auto placementPointer = create<PatternDataPointer>("", "placementPointer", 0x0C, sizeof(u8), nullptr);
placementPointer->setPointedAtAddress(0x49);
auto pointedTo = create<PatternDataUnsigned>("u32", "", 0x49, sizeof(u32), nullptr);
placementPointer->setPointedAtPattern(pointedTo);
addPattern(placementPointer);