summaryrefslogtreecommitdiff
path: root/view/sharedcache/core/MappedFileAccessor.cpp
diff options
context:
space:
mode:
authorMason Reed <mason@vector35.com>2025-03-10 11:05:40 -0400
committerMason Reed <mason@vector35.com>2025-04-02 05:36:54 -0400
commit25cc02431b61097b2adfc2fbc493b648b0300c3b (patch)
treea79d9c4f4f67234d3bf9bda413e8608f479a4cc8 /view/sharedcache/core/MappedFileAccessor.cpp
parentfa85bf28502286c4821427c5d0ed91a7ed46f8f6 (diff)
[SharedCache] Refactor Shared Cache
In absence of a better name, this commit refactors the shared cache code.
Diffstat (limited to 'view/sharedcache/core/MappedFileAccessor.cpp')
-rw-r--r--view/sharedcache/core/MappedFileAccessor.cpp101
1 files changed, 101 insertions, 0 deletions
diff --git a/view/sharedcache/core/MappedFileAccessor.cpp b/view/sharedcache/core/MappedFileAccessor.cpp
new file mode 100644
index 00000000..ddd6ce9b
--- /dev/null
+++ b/view/sharedcache/core/MappedFileAccessor.cpp
@@ -0,0 +1,101 @@
+#include "MappedFileAccessor.h"
+
+
+std::shared_ptr<MappedFileAccessor> MappedFileAccessor::Open(const std::string& filePath)
+{
+ auto file = MappedFile::OpenFile(filePath);
+ if (!file.has_value())
+ return nullptr;
+ if (file->Map() != MapStatus::Success)
+ return nullptr;
+ return std::make_shared<MappedFileAccessor>(std::move(*file));
+}
+
+// TODO: Will obviously not work on 32bit binaries, need to make WritePointer64 and 32 equiv.
+void MappedFileAccessor::WritePointer(size_t address, size_t pointer)
+{
+ m_dirty = true;
+ *reinterpret_cast<size_t*>(&m_file._mmap[address]) = pointer;
+}
+
+std::string MappedFileAccessor::ReadNullTermString(size_t address, size_t maxLength) const
+{
+ if (address > Length())
+ return "";
+ auto start = m_file._mmap + address;
+ auto endLen = (maxLength > 0) ? maxLength : m_file.len;
+ auto end = start + endLen;
+ auto nul = std::find(start, end, 0);
+ return {start, nul};
+}
+
+uint8_t MappedFileAccessor::ReadUInt8(size_t address)
+{
+ return Read<uint8_t>(address);
+}
+
+int8_t MappedFileAccessor::ReadInt8(size_t address)
+{
+ return Read<int8_t>(address);
+}
+
+uint16_t MappedFileAccessor::ReadUInt16(size_t address)
+{
+ return Read<uint16_t>(address);
+}
+
+int16_t MappedFileAccessor::ReadInt16(size_t address)
+{
+ return Read<int16_t>(address);
+}
+
+
+uint32_t MappedFileAccessor::ReadUInt32(size_t address)
+{
+ return Read<uint32_t>(address);
+}
+
+int32_t MappedFileAccessor::ReadInt32(size_t address)
+{
+ return Read<int32_t>(address);
+}
+
+uint64_t MappedFileAccessor::ReadUInt64(size_t address)
+{
+ return Read<uint64_t>(address);
+}
+
+int64_t MappedFileAccessor::ReadInt64(size_t address)
+{
+ return Read<int64_t>(address);
+}
+
+BinaryNinja::DataBuffer MappedFileAccessor::ReadBuffer(size_t addr, size_t length)
+{
+ if (addr + length > Length())
+ throw UnmappedAccessException(addr + length, Length());
+ return {&m_file._mmap[addr], length};
+}
+
+std::pair<const uint8_t*, const uint8_t*> MappedFileAccessor::ReadSpan(size_t addr, size_t length)
+{
+ if (addr + length > Length())
+ throw UnmappedAccessException(addr + length, Length());
+ const uint8_t* data = &m_file._mmap[addr];
+ return {data, data + length};
+}
+
+void MappedFileAccessor::Read(void* dest, size_t addr, size_t length) const
+{
+ if (addr + length > Length())
+ throw UnmappedAccessException(addr + length, Length());
+ memcpy(dest, &m_file._mmap[addr], length);
+}
+
+template <typename T>
+T MappedFileAccessor::Read(size_t address)
+{
+ T result;
+ Read(&result, address, sizeof(T));
+ return result;
+}