Skip to content

Implement differing byte search #2228

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 9 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions plugins/builtin/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ add_imhex_plugin(
source/content/command_line_interface.cpp
source/content/communication_interface.cpp
source/content/data_inspector.cpp
source/content/differing_byte_searcher.cpp
source/content/pl_builtin_functions.cpp
source/content/pl_builtin_types.cpp
source/content/pl_pragmas.cpp
Expand Down
19 changes: 19 additions & 0 deletions plugins/builtin/include/content/differing_byte_searcher.hpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
#pragma once

#include <functional>
#include <hex/providers/provider.hpp>
#include <wolv/types.hpp>

namespace hex::plugin::builtin {

void findNextDifferingByte(
const std::function< u64(prv::Provider*) >& lastValidAddressProvider,
const std::function< bool(u64, u64) >& addressComparator,
const std::function< void(u64*) >& addressStepper,
bool *didFindNextValue,
bool *didReachEndAddress,
u64* foundAddress
);

bool canSearchForDifferingByte();
}
3 changes: 3 additions & 0 deletions plugins/builtin/romfs/lang/de_DE.json
Original file line number Diff line number Diff line change
Expand Up @@ -778,6 +778,9 @@
"hex.builtin.view.hex_editor.menu.edit.set_base": "Basisadresse setzen",
"hex.builtin.view.hex_editor.menu.edit.set_page_size": "Pagegrösse setzen...",
"hex.builtin.view.hex_editor.menu.file.goto": "Gehe zu",
"hex.builtin.view.hex_editor.menu.file.goto.address": "Adresse...",
"hex.builtin.view.hex_editor.menu.file.goto.previous_differing_byte": "Vorheriges unterschiedliches Byte",
"hex.builtin.view.hex_editor.menu.file.goto.next_differing_byte": "Nächstes unterschiedliches Byte",
"hex.builtin.view.hex_editor.menu.file.load_encoding_file": "Benutzerdefinierte Enkodierung laden...",
"hex.builtin.view.hex_editor.menu.file.save": "Speichern",
"hex.builtin.view.hex_editor.menu.file.save_as": "Speichern unter...",
Expand Down
5 changes: 4 additions & 1 deletion plugins/builtin/romfs/lang/en_US.json
Original file line number Diff line number Diff line change
Expand Up @@ -845,7 +845,10 @@
"hex.builtin.view.hex_editor.menu.edit.select_all": "Select all",
"hex.builtin.view.hex_editor.menu.edit.set_base": "Set Base Address...",
"hex.builtin.view.hex_editor.menu.edit.set_page_size": "Set Page Size...",
"hex.builtin.view.hex_editor.menu.file.goto": "Go to address...",
"hex.builtin.view.hex_editor.menu.file.goto": "Go To",
"hex.builtin.view.hex_editor.menu.file.goto.address": "Address...",
"hex.builtin.view.hex_editor.menu.file.goto.previous_differing_byte": "Previous Differing Byte",
"hex.builtin.view.hex_editor.menu.file.goto.next_differing_byte": "Next Differing Byte",
"hex.builtin.view.hex_editor.menu.file.load_encoding_file": "Load custom encoding...",
"hex.builtin.view.hex_editor.menu.file.save": "Save",
"hex.builtin.view.hex_editor.menu.file.save_as": "Save As...",
Expand Down
5 changes: 4 additions & 1 deletion plugins/builtin/romfs/lang/es_ES.json
Original file line number Diff line number Diff line change
Expand Up @@ -773,7 +773,10 @@
"hex.builtin.view.hex_editor.menu.edit.select_all": "Seleccionar todo",
"hex.builtin.view.hex_editor.menu.edit.set_base": "Establecer dirección base",
"hex.builtin.view.hex_editor.menu.edit.set_page_size": "",
"hex.builtin.view.hex_editor.menu.file.goto": "Saltar a",
"hex.builtin.view.hex_editor.menu.file.goto": "Ir a",
"hex.builtin.view.hex_editor.menu.file.goto.address": "Dirección...",
"hex.builtin.view.hex_editor.menu.file.goto.previous_differing_byte": "Byte diferente anterior",
"hex.builtin.view.hex_editor.menu.file.goto.next_differing_byte": "Siguiente byte diferente",
"hex.builtin.view.hex_editor.menu.file.load_encoding_file": "Cargar codificación personalizada...",
"hex.builtin.view.hex_editor.menu.file.save": "Guardar",
"hex.builtin.view.hex_editor.menu.file.save_as": "Guardar como...",
Expand Down
5 changes: 4 additions & 1 deletion plugins/builtin/romfs/lang/fr_FR.json
Original file line number Diff line number Diff line change
Expand Up @@ -845,7 +845,10 @@
"hex.builtin.view.hex_editor.menu.edit.select_all": "Sélectionner tout",
"hex.builtin.view.hex_editor.menu.edit.set_base": "Définir l'adresse de base...",
"hex.builtin.view.hex_editor.menu.edit.set_page_size": "Définir la taille de la page...",
"hex.builtin.view.hex_editor.menu.file.goto": "Aller à l'adresse...",
"hex.builtin.view.hex_editor.menu.file.goto": "Aller à",
"hex.builtin.view.hex_editor.menu.file.goto.address": "Adresse...",
"hex.builtin.view.hex_editor.menu.file.goto.previous_differing_byte": "Octet précédent différent",
"hex.builtin.view.hex_editor.menu.file.goto.next_differing_byte": "Octet suivant différent",
"hex.builtin.view.hex_editor.menu.file.load_encoding_file": "Charger un encodage personnalisé...",
"hex.builtin.view.hex_editor.menu.file.save": "Sauvegarder",
"hex.builtin.view.hex_editor.menu.file.save_as": "Enregistrer sous...",
Expand Down
5 changes: 4 additions & 1 deletion plugins/builtin/romfs/lang/hu_HU.json
Original file line number Diff line number Diff line change
Expand Up @@ -774,7 +774,10 @@
"hex.builtin.view.hex_editor.menu.edit.select_all": "Mind kijelölése",
"hex.builtin.view.hex_editor.menu.edit.set_base": "Alapcím beállítása",
"hex.builtin.view.hex_editor.menu.edit.set_page_size": "Lapméret beállítása",
"hex.builtin.view.hex_editor.menu.file.goto": "Ugrás",
"hex.builtin.view.hex_editor.menu.file.goto": "Ugrás ide",
"hex.builtin.view.hex_editor.menu.file.goto.address": "Cím...",
"hex.builtin.view.hex_editor.menu.file.goto.previous_differing_byte": "Előző eltérő bájt",
"hex.builtin.view.hex_editor.menu.file.goto.next_differing_byte": "Következő eltérő bájt",
"hex.builtin.view.hex_editor.menu.file.load_encoding_file": "Saját kódolás betöltése...",
"hex.builtin.view.hex_editor.menu.file.save": "Mentés",
"hex.builtin.view.hex_editor.menu.file.save_as": "Mentés másként...",
Expand Down
3 changes: 3 additions & 0 deletions plugins/builtin/romfs/lang/it_IT.json
Original file line number Diff line number Diff line change
Expand Up @@ -774,6 +774,9 @@
"hex.builtin.view.hex_editor.menu.edit.set_base": "Imposta indirizzo di base",
"hex.builtin.view.hex_editor.menu.edit.set_page_size": "",
"hex.builtin.view.hex_editor.menu.file.goto": "Vai a",
"hex.builtin.view.hex_editor.menu.file.goto.address": "Indirizzo...",
"hex.builtin.view.hex_editor.menu.file.goto.previous_differing_byte": "Byte precedente diverso",
"hex.builtin.view.hex_editor.menu.file.goto.next_differing_byte": "Byte successivo diverso",
"hex.builtin.view.hex_editor.menu.file.load_encoding_file": "Carica una codifica personalizzata...",
"hex.builtin.view.hex_editor.menu.file.save": "Salva",
"hex.builtin.view.hex_editor.menu.file.save_as": "Salva come...",
Expand Down
3 changes: 3 additions & 0 deletions plugins/builtin/romfs/lang/ja_JP.json
Original file line number Diff line number Diff line change
Expand Up @@ -774,6 +774,9 @@
"hex.builtin.view.hex_editor.menu.edit.set_base": "ベースアドレスをセット",
"hex.builtin.view.hex_editor.menu.edit.set_page_size": "",
"hex.builtin.view.hex_editor.menu.file.goto": "移動",
"hex.builtin.view.hex_editor.menu.file.goto.address": "アドレス...",
"hex.builtin.view.hex_editor.menu.file.goto.previous_differing_byte": "前の異なるバイト",
"hex.builtin.view.hex_editor.menu.file.goto.next_differing_byte": "次の異なるバイト",
"hex.builtin.view.hex_editor.menu.file.load_encoding_file": "カスタムデコードを読み込む…",
"hex.builtin.view.hex_editor.menu.file.save": "保存",
"hex.builtin.view.hex_editor.menu.file.save_as": "名前をつけて保存…",
Expand Down
3 changes: 3 additions & 0 deletions plugins/builtin/romfs/lang/ko_KR.json
Original file line number Diff line number Diff line change
Expand Up @@ -774,6 +774,9 @@
"hex.builtin.view.hex_editor.menu.edit.set_base": "베이스 주소 설정",
"hex.builtin.view.hex_editor.menu.edit.set_page_size": "페이지 크기 설정",
"hex.builtin.view.hex_editor.menu.file.goto": "이동",
"hex.builtin.view.hex_editor.menu.file.goto.address": "주소...",
"hex.builtin.view.hex_editor.menu.file.goto.previous_differing_byte": "이전 다른 바이트",
"hex.builtin.view.hex_editor.menu.file.goto.next_differing_byte": "다음 다른 바이트",
"hex.builtin.view.hex_editor.menu.file.load_encoding_file": "사용자 정의 인코딩 불러오기...",
"hex.builtin.view.hex_editor.menu.file.save": "저장",
"hex.builtin.view.hex_editor.menu.file.save_as": "다른 이름으로 저장...",
Expand Down
3 changes: 3 additions & 0 deletions plugins/builtin/romfs/lang/pt_BR.json
Original file line number Diff line number Diff line change
Expand Up @@ -774,6 +774,9 @@
"hex.builtin.view.hex_editor.menu.edit.set_base": "Definir endereço base",
"hex.builtin.view.hex_editor.menu.edit.set_page_size": "",
"hex.builtin.view.hex_editor.menu.file.goto": "Ir para",
"hex.builtin.view.hex_editor.menu.file.goto.address": "Endereço...",
"hex.builtin.view.hex_editor.menu.file.goto.previous_differing_byte": "Byte diferente anterior",
"hex.builtin.view.hex_editor.menu.file.goto.next_differing_byte": "Próximo byte diferente",
"hex.builtin.view.hex_editor.menu.file.load_encoding_file": "Carregar codificação personalizada...",
"hex.builtin.view.hex_editor.menu.file.save": "Salvar",
"hex.builtin.view.hex_editor.menu.file.save_as": "Salvar como...",
Expand Down
3 changes: 3 additions & 0 deletions plugins/builtin/romfs/lang/ru_RU.json
Original file line number Diff line number Diff line change
Expand Up @@ -823,6 +823,9 @@
"hex.builtin.view.hex_editor.menu.edit.set_base": "Установить начальный адрес",
"hex.builtin.view.hex_editor.menu.edit.set_page_size": "Установить количество строк",
"hex.builtin.view.hex_editor.menu.file.goto": "Перейти к",
"hex.builtin.view.hex_editor.menu.file.goto.address": "Адресу...",
"hex.builtin.view.hex_editor.menu.file.goto.previous_differing_byte": "Предыдущему отличному байту",
"hex.builtin.view.hex_editor.menu.file.goto.next_differing_byte": "Следующему отличному байту",
"hex.builtin.view.hex_editor.menu.file.load_encoding_file": "Загрузить пользовательскую кодировку",
"hex.builtin.view.hex_editor.menu.file.save": "Сохранить",
"hex.builtin.view.hex_editor.menu.file.save_as": "Сохранить как",
Expand Down
5 changes: 4 additions & 1 deletion plugins/builtin/romfs/lang/zh_CN.json
Original file line number Diff line number Diff line change
Expand Up @@ -853,7 +853,10 @@
"hex.builtin.view.hex_editor.menu.edit.select_all": "全选",
"hex.builtin.view.hex_editor.menu.edit.set_base": "设置基地址",
"hex.builtin.view.hex_editor.menu.edit.set_page_size": "设置页面大小",
"hex.builtin.view.hex_editor.menu.file.goto": "转到",
"hex.builtin.view.hex_editor.menu.file.goto": "跳转到",
"hex.builtin.view.hex_editor.menu.file.goto.address": "地址...",
"hex.builtin.view.hex_editor.menu.file.goto.previous_differing_byte": "上一个不同的字节",
"hex.builtin.view.hex_editor.menu.file.goto.next_differing_byte": "下一个不同的字节",
"hex.builtin.view.hex_editor.menu.file.load_encoding_file": "加载自定义编码……",
"hex.builtin.view.hex_editor.menu.file.save": "保存",
"hex.builtin.view.hex_editor.menu.file.save_as": "另存为……",
Expand Down
3 changes: 3 additions & 0 deletions plugins/builtin/romfs/lang/zh_TW.json
Original file line number Diff line number Diff line change
Expand Up @@ -774,6 +774,9 @@
"hex.builtin.view.hex_editor.menu.edit.set_base": "設置基址",
"hex.builtin.view.hex_editor.menu.edit.set_page_size": "",
"hex.builtin.view.hex_editor.menu.file.goto": "跳至",
"hex.builtin.view.hex_editor.menu.file.goto.address": "位址...",
"hex.builtin.view.hex_editor.menu.file.goto.previous_differing_byte": "上一個不同的位元組",
"hex.builtin.view.hex_editor.menu.file.goto.next_differing_byte": "下一個不同的位元組",
"hex.builtin.view.hex_editor.menu.file.load_encoding_file": "載入自訂編碼...",
"hex.builtin.view.hex_editor.menu.file.save": "儲存",
"hex.builtin.view.hex_editor.menu.file.save_as": "另存為...",
Expand Down
52 changes: 52 additions & 0 deletions plugins/builtin/source/content/differing_byte_searcher.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
#include <content/differing_byte_searcher.hpp>
#include <hex/api/imhex_api.hpp>

namespace hex::plugin::builtin {

void findNextDifferingByte(
const std::function< u64(prv::Provider*) >& lastValidAddressProvider,
const std::function< bool(u64, u64) >& addressComparator,
const std::function< void(u64*) >& addressStepper,
bool *didFindNextValue,
bool *didReachEndAddress,
u64* foundAddress
) {
auto provider = ImHexApi::Provider::get();
if (provider == nullptr)
return;
const auto selection = ImHexApi::HexEditor::getSelection();
if (!selection.has_value())
return;
if (selection->getSize() != 1)
return;

auto currentAddress = selection->getStartAddress();

u8 givenValue = 0;
provider->read(currentAddress, &givenValue, 1);

u8 currentValue = 0;

*didFindNextValue = false;
*didReachEndAddress = false;

auto endAddress = lastValidAddressProvider(provider);

while (addressComparator(currentAddress, endAddress)) {
addressStepper(&currentAddress);
if (currentAddress == endAddress) {
*didReachEndAddress = true;
}
provider->read(currentAddress, &currentValue, 1);
if (currentValue != givenValue) {
*didFindNextValue = true;
*foundAddress = currentAddress;
break;
}
}
}

bool canSearchForDifferingByte() {
return ImHexApi::Provider::isValid() && ImHexApi::HexEditor::isSelectionValid() && ImHexApi::HexEditor::getSelection()->getSize() == 1;
}
}
Loading