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

@@ -123,8 +123,8 @@ namespace hex::lang {
size_t biggerSize = std::max(left->getSize(), right->getSize());
std::vector<u8> leftBuffer(biggerSize, 0x00), rightBuffer(biggerSize, 0x00);
provider->read(left->getOffset() - provider->getBaseAddress(), leftBuffer.data(), left->getSize());
provider->read(right->getOffset() - provider->getBaseAddress(), rightBuffer.data(), right->getSize());
provider->read(left->getOffset(), leftBuffer.data(), left->getSize());
provider->read(right->getOffset(), rightBuffer.data(), right->getSize());
if (left->m_endian != std::endian::native)
std::reverse(leftBuffer.begin(), leftBuffer.end());
@@ -237,7 +237,7 @@ namespace hex::lang {
void createEntry(prv::Provider* &provider) override {
u64 data = 0;
provider->read(this->getOffset() - provider->getBaseAddress(), &data, this->getSize());
provider->read(this->getOffset(), &data, this->getSize());
data = hex::changeEndianess(data, this->getSize(), this->getEndian());
ImGui::TableNextRow();
@@ -319,7 +319,7 @@ namespace hex::lang {
void createEntry(prv::Provider* &provider) override {
u64 data = 0;
provider->read(this->getOffset() - provider->getBaseAddress(), &data, this->getSize());
provider->read(this->getOffset(), &data, this->getSize());
data = hex::changeEndianess(data, this->getSize(), this->getEndian());
this->createDefaultEntry(hex::format("{:d} (0x{:0{}X})", data, data, this->getSize() * 2));
@@ -348,7 +348,7 @@ namespace hex::lang {
void createEntry(prv::Provider* &provider) override {
u128 data = 0;
provider->read(this->getOffset() - provider->getBaseAddress(), &data, this->getSize());
provider->read(this->getOffset(), &data, this->getSize());
data = hex::changeEndianess(data, this->getSize(), this->getEndian());
switch (this->getSize()) {
@@ -409,13 +409,13 @@ namespace hex::lang {
void createEntry(prv::Provider* &provider) override {
if (this->getSize() == 4) {
u32 data = 0;
provider->read(this->getOffset() - provider->getBaseAddress(), &data, 4);
provider->read(this->getOffset(), &data, 4);
data = hex::changeEndianess(data, 4, this->getEndian());
this->createDefaultEntry(hex::format("{:e} (0x{:0{}X})", *reinterpret_cast<float*>(&data), data, this->getSize() * 2));
} else if (this->getSize() == 8) {
u64 data = 0;
provider->read(this->getOffset() - provider->getBaseAddress(), &data, 8);
provider->read(this->getOffset(), &data, 8);
data = hex::changeEndianess(data, 8, this->getEndian());
this->createDefaultEntry(hex::format("{:e} (0x{:0{}X})", *reinterpret_cast<double*>(&data), data, this->getSize() * 2));
@@ -442,7 +442,7 @@ namespace hex::lang {
void createEntry(prv::Provider* &provider) override {
u8 boolean;
provider->read(this->getOffset() - provider->getBaseAddress(), &boolean, 1);
provider->read(this->getOffset(), &boolean, 1);
if (boolean == 0)
this->createDefaultEntry("false");
@@ -468,7 +468,7 @@ namespace hex::lang {
void createEntry(prv::Provider* &provider) override {
char character;
provider->read(this->getOffset() - provider->getBaseAddress(), &character, 1);
provider->read(this->getOffset(), &character, 1);
this->createDefaultEntry(hex::format("'{0}'", character));
}
@@ -489,7 +489,7 @@ namespace hex::lang {
void createEntry(prv::Provider* &provider) override {
std::vector<u8> buffer(this->getSize() + 1, 0x00);
provider->read(this->getOffset() - provider->getBaseAddress(), buffer.data(), this->getSize());
provider->read(this->getOffset(), buffer.data(), this->getSize());
buffer[this->getSize()] = '\0';
this->createDefaultEntry(hex::format("\"{0}\"", makeDisplayable(buffer.data(), this->getSize()).c_str()));
@@ -808,7 +808,7 @@ namespace hex::lang {
void createEntry(prv::Provider* &provider) override {
u64 value = 0;
provider->read(this->getOffset() - provider->getBaseAddress(), &value, this->getSize());
provider->read(this->getOffset(), &value, this->getSize());
value = hex::changeEndianess(value, this->getSize(), this->getEndian());
std::string valueString = PatternData::getTypeName() + "::";
@@ -880,7 +880,7 @@ namespace hex::lang {
void createEntry(prv::Provider* &provider) override {
std::vector<u8> value(this->getSize(), 0);
provider->read(this->getOffset() - provider->getBaseAddress(), &value[0], value.size());
provider->read(this->getOffset(), &value[0], value.size());
if (this->m_endian == std::endian::big)
std::reverse(value.begin(), value.end());

View File

@@ -24,7 +24,9 @@ namespace hex::prv {
virtual bool isWritable() = 0;
virtual void read(u64 offset, void *buffer, size_t size, bool overlays = true);
virtual void readRelative(u64 offset, void *buffer, size_t size, bool overlays = true);
virtual void write(u64 offset, const void *buffer, size_t size);
virtual void writeRelative(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;

View File

@@ -843,7 +843,7 @@ namespace hex::lang {
size_t pointerSize = sizeType->getSize();
u128 pointedAtOffset = 0;
this->m_provider->read(pointerOffset - this->m_provider->getBaseAddress(), &pointedAtOffset, pointerSize);
this->m_provider->read(pointerOffset, &pointedAtOffset, pointerSize);
this->m_currOffset = hex::changeEndianess(pointedAtOffset, pointerSize, underlyingType->getEndian().value_or(this->m_defaultDataEndian));
delete sizeType;

View File

@@ -22,10 +22,18 @@ namespace hex::prv {
this->readRaw(offset, buffer, size);
}
void Provider::readRelative(u64 offset, void *buffer, size_t size, bool overlays) {
this->read(offset + this->getBaseAddress(), buffer, size);
}
void Provider::write(u64 offset, const void *buffer, size_t size) {
this->writeRaw(offset, buffer, size);
}
void Provider::writeRelative(u64 offset, const void *buffer, size_t size) {
this->write(offset + this->getBaseAddress(), buffer, size);
}
void Provider::applyOverlays(u64 offset, void *buffer, size_t size) {
for (auto &overlay : this->m_overlays) {
auto overlayOffset = overlay->getAddress();
@@ -90,7 +98,7 @@ namespace hex::prv {
}
std::optional<u32> Provider::getPageOfAddress(u64 address) {
u32 page = std::floor(address / double(PageSize));
u32 page = std::floor((address - this->getBaseAddress()) / double(PageSize));
if (page >= this->getPageCount())
return { };
@@ -107,7 +115,7 @@ namespace hex::prv {
this->m_patches.push_back(getPatches());
for (u64 i = 0; i < size; i++)
getPatches()[offset + this->getBaseAddress() + i] = reinterpret_cast<const u8*>(buffer)[i];
getPatches()[offset + i] = reinterpret_cast<const u8*>(buffer)[i];
}
void Provider::undo() {