diff --git a/include/providers/file_provider.hpp b/include/providers/file_provider.hpp index 31e18666d..100d953a8 100644 --- a/include/providers/file_provider.hpp +++ b/include/providers/file_provider.hpp @@ -25,7 +25,7 @@ namespace hex::prv { bool isReadable() override; bool isWritable() override; - void read(u64 offset, void *buffer, size_t size) override; + void read(u64 offset, void *buffer, size_t size, bool overlays) override; void write(u64 offset, const void *buffer, size_t size) override; void readRaw(u64 offset, void *buffer, size_t size) override; diff --git a/plugins/libimhex/include/hex/providers/provider.hpp b/plugins/libimhex/include/hex/providers/provider.hpp index 6bb7f7a4a..6a52d43c7 100644 --- a/plugins/libimhex/include/hex/providers/provider.hpp +++ b/plugins/libimhex/include/hex/providers/provider.hpp @@ -23,13 +23,15 @@ namespace hex::prv { virtual bool isReadable() = 0; virtual bool isWritable() = 0; - virtual void read(u64 offset, void *buffer, size_t size); + virtual void read(u64 offset, void *buffer, size_t size, bool overlays = true); virtual void write(u64 offset, const void *buffer, size_t size); virtual void readRaw(u64 offset, void *buffer, size_t size) = 0; virtual void writeRaw(u64 offset, const void *buffer, size_t size) = 0; virtual size_t getActualSize() = 0; + void applyOverlays(u64 offset, void *buffer, size_t size); + std::map& getPatches(); void applyPatches(); diff --git a/plugins/libimhex/source/providers/provider.cpp b/plugins/libimhex/source/providers/provider.cpp index 218ea5a02..049085cf3 100644 --- a/plugins/libimhex/source/providers/provider.cpp +++ b/plugins/libimhex/source/providers/provider.cpp @@ -18,7 +18,7 @@ namespace hex::prv { this->deleteOverlay(overlay); } - void Provider::read(u64 offset, void *buffer, size_t size) { + void Provider::read(u64 offset, void *buffer, size_t size, bool overlays) { this->readRaw(offset, buffer, size); } @@ -26,6 +26,18 @@ namespace hex::prv { this->writeRaw(offset, buffer, size); } + void Provider::applyOverlays(u64 offset, void *buffer, size_t size) { + for (auto &overlay : this->m_overlays) { + auto overlayOffset = overlay->getAddress(); + auto overlaySize = overlay->getSize(); + + s128 overlapMin = std::max(offset, overlayOffset); + s128 overlapMax = std::min(offset + size, overlayOffset + overlaySize); + if (overlapMax > overlapMin) + std::memcpy(static_cast(buffer) + std::max(0, overlapMin - offset), overlay->getData().data() + std::max(0, overlapMin - overlayOffset), overlapMax - overlapMin); + } + } + std::map& Provider::getPatches() { return this->m_patches.back(); diff --git a/source/providers/file_provider.cpp b/source/providers/file_provider.cpp index 5e367852b..ca330d46f 100644 --- a/source/providers/file_provider.cpp +++ b/source/providers/file_provider.cpp @@ -124,7 +124,7 @@ namespace hex::prv { } - void FileProvider::read(u64 offset, void *buffer, size_t size) { + void FileProvider::read(u64 offset, void *buffer, size_t size, bool overlays) { if ((offset + size) > this->getSize() || buffer == nullptr || size == 0) return; @@ -133,6 +133,9 @@ namespace hex::prv { for (u64 i = 0; i < size; i++) if (this->m_patches.back().contains(offset + i)) reinterpret_cast(buffer)[i] = this->m_patches.back()[offset + PageSize * this->m_currPage + i]; + + if (overlays) + this->applyOverlays(offset, buffer, size); } void FileProvider::write(u64 offset, const void *buffer, size_t size) { diff --git a/source/views/view_hexeditor.cpp b/source/views/view_hexeditor.cpp index 1faaf6005..b8772298d 100644 --- a/source/views/view_hexeditor.cpp +++ b/source/views/view_hexeditor.cpp @@ -30,12 +30,6 @@ namespace hex { ImU8 byte; provider->read(off, &byte, sizeof(ImU8)); - for (auto &overlay : SharedData::currentProvider->getOverlays()) { - auto overlayAddress = overlay->getAddress(); - if (off >= overlayAddress && off < overlayAddress + overlay->getSize()) - byte = overlay->getData()[off - overlayAddress]; - } - return byte; };