diff --git a/lib/libimhex/source/providers/provider.cpp b/lib/libimhex/source/providers/provider.cpp index c1808158b..97cc766ef 100644 --- a/lib/libimhex/source/providers/provider.cpp +++ b/lib/libimhex/source/providers/provider.cpp @@ -41,14 +41,22 @@ namespace hex::prv { if (file.isValid()) { std::vector buffer(std::min(0xFF'FFFF, this->getActualSize()), 0x00); - size_t bufferSize = buffer.size(); + size_t bufferSize = 0; for (u64 offset = 0; offset < this->getActualSize(); offset += bufferSize) { - if (bufferSize > this->getActualSize() - offset) - bufferSize = this->getActualSize() - offset; + bufferSize = buffer.size(); + + auto [region, valid] = this->getRegionValidity(offset + this->getBaseAddress()); + if (!valid) + offset = region.getEndAddress() + 1; + + auto [newRegion, newValid] = this->getRegionValidity(offset + this->getBaseAddress()); + bufferSize = std::min(bufferSize, (newRegion.getEndAddress() - offset) + 1); + bufferSize = std::min(bufferSize, this->getActualSize() - offset); this->read(offset + this->getBaseAddress(), buffer.data(), bufferSize, true); file.write(buffer.data(), bufferSize); + } } }