sys: Drastically revamp the relative vs absolute address mess

This commit is contained in:
WerWolv
2021-04-16 21:50:15 +02:00
parent 72eac9f149
commit 93e1c4c4e8
13 changed files with 73 additions and 49 deletions

View File

@@ -126,10 +126,11 @@ namespace hex::prv {
void FileProvider::read(u64 offset, void *buffer, size_t size, bool overlays) {
if ((offset + size) > this->getSize() || buffer == nullptr || size == 0)
if (((offset - this->getBaseAddress()) + size) > this->getSize() || buffer == nullptr || size == 0)
return;
std::memcpy(buffer, reinterpret_cast<u8*>(this->m_mappedFile) + PageSize * this->m_currPage + offset, size);
std::memcpy(buffer, reinterpret_cast<u8*>(this->m_mappedFile) + PageSize * this->m_currPage + offset - this->getBaseAddress(), size);
for (u64 i = 0; i < size; i++)
if (getPatches().contains(offset + i))
@@ -140,13 +141,15 @@ namespace hex::prv {
}
void FileProvider::write(u64 offset, const void *buffer, size_t size) {
if ((offset + size) > this->getSize() || buffer == nullptr || size == 0)
if (((offset - this->getBaseAddress()) + size) > this->getSize() || buffer == nullptr || size == 0)
return;
addPatch(offset, buffer, size);
}
void FileProvider::readRaw(u64 offset, void *buffer, size_t size) {
offset -= this->getBaseAddress();
if ((offset + size) > this->getSize() || buffer == nullptr || size == 0)
return;
@@ -154,6 +157,8 @@ namespace hex::prv {
}
void FileProvider::writeRaw(u64 offset, const void *buffer, size_t size) {
offset -= this->getBaseAddress();
if ((offset + size) > this->getSize() || buffer == nullptr || size == 0)
return;

View File

@@ -75,7 +75,7 @@ namespace hex {
{
u8 bytes[10] = { 0 };
(SharedData::currentProvider)->read(region.address, bytes, std::min(region.size, size_t(10)));
SharedData::currentProvider->read(region.address, bytes, std::min(region.size, size_t(10)));
std::string bytesString;
for (u8 i = 0; i < std::min(region.size, size_t(10)); i++) {

View File

@@ -59,8 +59,8 @@ namespace hex {
this->m_shouldInvalidate = true;
size_t dataSize = provider->getSize();
if (this->m_hashRegion[1] >= dataSize)
this->m_hashRegion[1] = dataSize - 1;
if (this->m_hashRegion[1] >= provider->getBaseAddress() + dataSize)
this->m_hashRegion[1] = provider->getBaseAddress() + dataSize - 1;
if (this->m_hashRegion[1] >= this->m_hashRegion[0]) {

View File

@@ -30,7 +30,7 @@ namespace hex {
return 0x00;
ImU8 byte;
provider->read(off, &byte, sizeof(ImU8));
provider->readRelative(off, &byte, sizeof(ImU8));
return byte;
};
@@ -40,7 +40,7 @@ namespace hex {
if (!provider->isAvailable() || !provider->isWritable())
return;
provider->write(off, &d, sizeof(ImU8));
provider->writeRelative(off, &d, sizeof(ImU8));
EventManager::post<EventDataChanged>();
ProjectFile::markDirty();
};
@@ -114,7 +114,7 @@ namespace hex {
size_t size = std::min<size_t>(_this->m_currEncodingFile.getLongestSequence(), provider->getActualSize() - addr);
std::vector<u8> buffer(size);
provider->read(addr, buffer.data(), size);
provider->readRelative(addr, buffer.data(), size);
auto [decoded, advance] = _this->m_currEncodingFile.getEncodingFor(buffer);
@@ -135,13 +135,16 @@ namespace hex {
EventManager::subscribe<RequestSelectionChange>(this, [this](Region region) {
auto provider = SharedData::currentProvider;
auto page = provider->getPageOfAddress(region.address - provider->getBaseAddress());
auto page = provider->getPageOfAddress(region.address);
if (!page.has_value())
return;
if (region.size == 0)
return;
provider->setCurrentPage(page.value());
u64 start = region.address - provider->getBaseAddress();
this->m_memoryEditor.GotoAddrAndHighlight(start, start + region.size - 1);
u64 start = region.address;
this->m_memoryEditor.GotoAddrAndSelect(start - provider->getBaseAddress(), start + region.size - provider->getBaseAddress() - 1);
EventManager::post<EventRegionSelected>(region);
});
@@ -266,7 +269,7 @@ namespace hex {
if (bufferSize > provider->getActualSize() - offset)
bufferSize = provider->getActualSize() - offset;
provider->read(offset, buffer.data(), bufferSize);
provider->readRelative(offset, buffer.data(), bufferSize);
fwrite(buffer.data(), 1, bufferSize, file);
}
@@ -650,7 +653,7 @@ namespace hex {
size_t copySize = (end - start) + 1;
std::vector<u8> buffer(copySize, 0x00);
provider->read(start, buffer.data(), buffer.size());
provider->readRelative(start, buffer.data(), buffer.size());
std::string str;
for (const auto &byte : buffer)
@@ -699,7 +702,7 @@ namespace hex {
}
// Write bytes
provider->write(start - provider->getBaseAddress(), buffer.data(), std::min(end - start + 1, buffer.size()));
provider->writeRelative(start, buffer.data(), std::min(end - start + 1, buffer.size()));
}
void ViewHexEditor::copyString() {
@@ -712,7 +715,7 @@ namespace hex {
std::string buffer(copySize, 0x00);
buffer.reserve(copySize + 1);
provider->read(start, buffer.data(), copySize);
provider->readRelative(start, buffer.data(), copySize);
ImGui::SetClipboardText(buffer.c_str());
}
@@ -726,7 +729,7 @@ namespace hex {
size_t copySize = (end - start) + 1;
std::vector<u8> buffer(copySize, 0x00);
provider->read(start, buffer.data(), buffer.size());
provider->readRelative(start, buffer.data(), buffer.size());
std::string str;
switch (language) {
@@ -828,7 +831,7 @@ namespace hex {
size_t copySize = (end - start) + 1;
std::vector<u8> buffer(copySize, 0x00);
provider->read(start, buffer.data(), buffer.size());
provider->readRelative(start, buffer.data(), buffer.size());
std::string str = "Hex View 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F\n\n";
@@ -875,7 +878,7 @@ namespace hex {
size_t copySize = (end - start) + 1;
std::vector<u8> buffer(copySize, 0x00);
provider->read(start, buffer.data(), buffer.size());
provider->readRelative(start, buffer.data(), buffer.size());
std::string str =
R"(
@@ -940,7 +943,7 @@ R"(
size_t dataSize = provider->getSize();
for (u64 offset = 0; offset < dataSize; offset += 1024) {
size_t usedBufferSize = std::min(u64(buffer.size()), dataSize - offset);
provider->read(offset, buffer.data(), usedBufferSize);
provider->readRelative(offset, buffer.data(), usedBufferSize);
for (u64 i = 0; i < usedBufferSize; i++) {
if (buffer[i] == string[foundCharacters])
@@ -978,7 +981,7 @@ R"(
size_t dataSize = provider->getSize();
for (u64 offset = 0; offset < dataSize; offset += 1024) {
size_t usedBufferSize = std::min(u64(buffer.size()), dataSize - offset);
provider->read(offset, buffer.data(), usedBufferSize);
provider->readRelative(offset, buffer.data(), usedBufferSize);
for (u64 i = 0; i < usedBufferSize; i++) {
if (buffer[i] == hex[foundCharacters])
@@ -1006,7 +1009,7 @@ R"(
_this->m_lastSearchIndex = 0;
if (_this->m_lastSearchBuffer->size() > 0)
_this->m_memoryEditor.GotoAddrAndHighlight((*_this->m_lastSearchBuffer)[0].first, (*_this->m_lastSearchBuffer)[0].second);
_this->m_memoryEditor.GotoAddrAndSelect((*_this->m_lastSearchBuffer)[0].first, (*_this->m_lastSearchBuffer)[0].second);
return 0;
};
@@ -1018,13 +1021,13 @@ R"(
this->m_lastSearchIndex = 0;
if (this->m_lastSearchBuffer->size() > 0)
this->m_memoryEditor.GotoAddrAndHighlight((*this->m_lastSearchBuffer)[0].first, (*this->m_lastSearchBuffer)[0].second);
this->m_memoryEditor.GotoAddrAndSelect((*this->m_lastSearchBuffer)[0].first, (*this->m_lastSearchBuffer)[0].second);
};
static auto FindNext = [this]() {
if (this->m_lastSearchBuffer->size() > 0) {
++this->m_lastSearchIndex %= this->m_lastSearchBuffer->size();
this->m_memoryEditor.GotoAddrAndHighlight((*this->m_lastSearchBuffer)[this->m_lastSearchIndex].first,
this->m_memoryEditor.GotoAddrAndSelect((*this->m_lastSearchBuffer)[this->m_lastSearchIndex].first,
(*this->m_lastSearchBuffer)[this->m_lastSearchIndex].second);
}
};
@@ -1038,7 +1041,7 @@ R"(
this->m_lastSearchIndex %= this->m_lastSearchBuffer->size();
this->m_memoryEditor.GotoAddrAndHighlight((*this->m_lastSearchBuffer)[this->m_lastSearchIndex].first,
this->m_memoryEditor.GotoAddrAndSelect((*this->m_lastSearchBuffer)[this->m_lastSearchIndex].first,
(*this->m_lastSearchBuffer)[this->m_lastSearchIndex].second);
}
};

View File

@@ -76,7 +76,7 @@ namespace hex {
for (u64 i = 0; i < provider->getSize(); i += this->m_blockSize) {
std::array<ImU64, 256> blockValueCounts = { 0 };
provider->read(i, buffer.data(), std::min(u64(this->m_blockSize), provider->getSize() - i));
provider->readRelative(i, buffer.data(), std::min(u64(this->m_blockSize), provider->getSize() - i));
for (size_t j = 0; j < this->m_blockSize; j++) {
blockValueCounts[buffer[j]]++;
@@ -91,7 +91,7 @@ namespace hex {
{
std::vector<u8> buffer(provider->getSize(), 0x00);
provider->read(0x00, buffer.data(), buffer.size());
provider->readRelative(0x00, buffer.data(), buffer.size());
this->m_fileDescription.clear();
this->m_mimeType.clear();
@@ -216,7 +216,7 @@ namespace hex {
ImPlot::PlotLine("##entropy_line", this->m_blockEntropy.data(), this->m_blockEntropy.size());
if (ImPlot::DragLineX("Position", &this->m_entropyHandlePosition, false)) {
EventManager::post<RequestSelectionChange>( Region{ u64(this->m_entropyHandlePosition * this->m_blockSize), 1 });
EventManager::post<RequestSelectionChange>( Region{ u64(this->m_entropyHandlePosition * this->m_blockSize) + provider->getBaseAddress(), 1 });
}
ImPlot::EndPlot();

View File

@@ -123,7 +123,7 @@ namespace hex {
return;
std::vector<u8> buffer(std::min(provider->getSize(), size_t(0xFFFF)), 0x00);
provider->read(0, buffer.data(), buffer.size());
provider->readRelative(0, buffer.data(), buffer.size());
std::string mimeType;

View File

@@ -57,7 +57,7 @@ namespace hex {
for (u64 offset = 0; offset < provider->getSize(); offset += buffer.size()) {
size_t readSize = std::min(u64(buffer.size()), provider->getSize() - offset);
provider->read(offset, buffer.data(), readSize);
provider->readRelative(offset, buffer.data(), readSize);
for (u32 i = 0; i < readSize; i++) {
if (buffer[i] >= 0x20 && buffer[i] <= 0x7E)
@@ -66,7 +66,7 @@ namespace hex {
if (foundCharacters >= this->m_minimumLength) {
FoundString foundString;
foundString.offset = offset + i - foundCharacters;
foundString.offset = offset + i - foundCharacters + provider->getBaseAddress();
foundString.size = foundCharacters;
foundString.string.reserve(foundCharacters);
foundString.string.resize(foundCharacters);
@@ -88,7 +88,6 @@ namespace hex {
void ViewStrings::drawContent() {
auto provider = SharedData::currentProvider;
if (ImGui::Begin(View::toWindowName("hex.view.strings.name").c_str(), &this->getWindowOpenState(), ImGuiWindowFlags_NoCollapse)) {
if (provider != nullptr && provider->isReadable()) {
ImGui::Disabled([this]{

View File

@@ -172,7 +172,7 @@ namespace hex {
if (context.buffer.empty()) return nullptr;
provider->read(context.currBlock.base, context.buffer.data(), context.buffer.size());
provider->readRelative(context.currBlock.base, context.buffer.data(), context.buffer.size());
return context.buffer.data();
};