mirror of https://github.com/WerWolv/ImHex
53 lines
1.7 KiB
C++
53 lines
1.7 KiB
C++
#include <content/differing_byte_searcher.hpp>
|
|
#include <hex/api/imhex_api/provider.hpp>
|
|
#include <hex/api/imhex_api/hex_editor.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(¤tAddress);
|
|
if (currentAddress == endAddress) {
|
|
*didReachEndAddress = true;
|
|
}
|
|
provider->read(currentAddress, ¤tValue, 1);
|
|
if (currentValue != givenValue) {
|
|
*didFindNextValue = true;
|
|
*foundAddress = currentAddress;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
bool canSearchForDifferingByte() {
|
|
return ImHexApi::Provider::isValid() && ImHexApi::HexEditor::isSelectionValid() && ImHexApi::HexEditor::getSelection()->getSize() == 1;
|
|
}
|
|
} |