| 89 | }; |
| 90 | |
| 91 | class VirtualMemoryReader |
| 92 | { |
| 93 | std::shared_ptr<VirtualMemory> m_memory; |
| 94 | uint64_t m_cursor; |
| 95 | uint64_t m_addressSize; |
| 96 | BNEndianness m_endianness = LittleEndian; |
| 97 | |
| 98 | public: |
| 99 | explicit VirtualMemoryReader(std::shared_ptr<VirtualMemory> memory, uint64_t addressSize = 8); |
| 100 | |
| 101 | void SetEndianness(BNEndianness endianness) { m_endianness = endianness; } |
| 102 | |
| 103 | BNEndianness GetEndianness() const { return m_endianness; } |
| 104 | |
| 105 | void Seek(const uint64_t address) { m_cursor = address; }; |
| 106 | |
| 107 | void SeekRelative(const size_t offset) { m_cursor += offset; }; |
| 108 | |
| 109 | size_t GetOffset() const { return m_cursor; } |
| 110 | |
| 111 | std::string ReadCString(uint64_t address, size_t maxLength = -1); |
| 112 | |
| 113 | uint64_t ReadULEB128(size_t cursorLimit); |
| 114 | |
| 115 | int64_t ReadSLEB128(size_t cursorLimit); |
| 116 | |
| 117 | uint64_t ReadPointer(); |
| 118 | |
| 119 | uint64_t ReadPointer(uint64_t address); |
| 120 | |
| 121 | uint8_t ReadUInt8(); |
| 122 | |
| 123 | uint8_t ReadUInt8(uint64_t address); |
| 124 | |
| 125 | int8_t ReadInt8(); |
| 126 | |
| 127 | int8_t ReadInt8(uint64_t address); |
| 128 | |
| 129 | uint16_t ReadUInt16(); |
| 130 | |
| 131 | uint16_t ReadUInt16(uint64_t address); |
| 132 | |
| 133 | int16_t ReadInt16(); |
| 134 | |
| 135 | int16_t ReadInt16(uint64_t address); |
| 136 | |
| 137 | uint32_t ReadUInt32(); |
| 138 | |
| 139 | uint32_t ReadUInt32(uint64_t address); |
| 140 | |
| 141 | int32_t ReadInt32(); |
| 142 | |
| 143 | int32_t ReadInt32(uint64_t address); |
| 144 | |
| 145 | uint64_t ReadUInt64(); |
| 146 | |
| 147 | uint64_t ReadUInt64(uint64_t address); |
| 148 | |