1
0
mirror of synced 2025-01-18 09:04:52 +01:00

feat: Added Fill option to hex editor

This commit is contained in:
WerWolv 2023-08-02 13:09:21 +02:00
parent fbd4bc337b
commit 05ca498343
2 changed files with 57 additions and 0 deletions

View File

@ -778,6 +778,7 @@
"hex.builtin.view.hex_editor.goto.offset.relative": "Relative",
"hex.builtin.view.hex_editor.menu.edit.copy": "Copy",
"hex.builtin.view.hex_editor.menu.edit.copy_as": "Copy as...",
"hex.builtin.view.hex_editor.menu.edit.fill": "Fill...",
"hex.builtin.view.hex_editor.menu.edit.insert": "Insert...",
"hex.builtin.view.hex_editor.menu.edit.jump_to": "Jump to",
"hex.builtin.view.hex_editor.menu.edit.open_in_new_provider": "Open selection view...",

View File

@ -502,6 +502,53 @@ namespace hex::plugin::builtin {
u64 m_size;
};
class PopupFill : public ViewHexEditor::Popup {
public:
PopupFill(u64 address, size_t size) : m_address(address), m_size(size) {}
void draw(ViewHexEditor *editor) override {
ImGui::TextUnformatted("hex.builtin.view.hex_editor.menu.edit.fill"_lang);
ImGui::InputHexadecimal("hex.builtin.common.address"_lang, &this->m_address);
ImGui::InputHexadecimal("hex.builtin.common.size"_lang, &this->m_size);
ImGui::Separator();
ImGui::InputTextIcon("hex.builtin.common.bytes"_lang, ICON_VS_SYMBOL_NAMESPACE, this->m_input);
View::confirmButtons("hex.builtin.common.set"_lang, "hex.builtin.common.cancel"_lang,
[&, this] {
fill(this->m_address, static_cast<size_t>(this->m_size), this->m_input);
editor->closePopup();
},
[&] {
editor->closePopup();
});
}
private:
static void fill(u64 address, size_t size, const std::string &input) {
if (!ImHexApi::Provider::isValid())
return;
auto bytes = crypt::decode16(input);
if (bytes.empty())
return;
auto provider = ImHexApi::Provider::get();
for (u64 i = 0; i < size; i += bytes.size()) {
auto remainingSize = std::min<size_t>(size - i, bytes.size());
provider->write(provider->getBaseAddress() + address + i, bytes.data(), remainingSize);
}
}
private:
u64 m_address;
u64 m_size;
std::string m_input;
};
/* Hex Editor */
ViewHexEditor::ViewHexEditor() : View("hex.builtin.view.hex_editor.name") {
@ -1187,6 +1234,15 @@ namespace hex::plugin::builtin {
},
[] { return ImHexApi::HexEditor::isSelectionValid() && ImHexApi::Provider::isValid() && ImHexApi::Provider::get()->isResizable(); });
/* Fill */
ContentRegistry::Interface::addMenuItem({ "hex.builtin.menu.edit", "hex.builtin.view.hex_editor.menu.edit.fill" }, 1810, Shortcut::None,
[this] {
auto selection = ImHexApi::HexEditor::getSelection();
this->openPopup<PopupFill>(selection->getStartAddress(), selection->getSize());
},
[] { return ImHexApi::HexEditor::isSelectionValid() && ImHexApi::Provider::isValid() && ImHexApi::Provider::get()->isWritable(); });
/* Jump to */
ContentRegistry::Interface::addMenuItem({ "hex.builtin.menu.edit", "hex.builtin.view.hex_editor.menu.edit.jump_to" }, 1850, Shortcut::None,
[] {