/** Compare memory between snapshots * * @param addr1 Address in the first snapshot * @param snapshot1 First snapshot * @param addr2 Address in the second snapshot * @param snapshot2 Second snapshot * @return same as memcmp * */ int MC_snapshot_memcmp( const void* addr1, mc_snapshot_t snapshot1, const void* addr2, mc_snapshot_t snapshot2, int process_index, size_t size) { mc_mem_region_t region1 = mc_get_snapshot_region(addr1, snapshot1, process_index); mc_mem_region_t region2 = mc_get_snapshot_region(addr2, snapshot2, process_index); return MC_snapshot_region_memcmp(addr1, region1, addr2, region2, size); }
const void* Snapshot::read_bytes(void* buffer, std::size_t size, RemotePtr<void> address, int process_index, ReadOptions options) const { mc_mem_region_t region = mc_get_snapshot_region((void*)address.address(), this, process_index); if (region) { const void* res = MC_region_read(region, buffer, (void*)address.address(), size); if (buffer == res || options & ReadOptions::lazy()) return res; else { memcpy(buffer, res, size); return buffer; } } else return this->process()->read_bytes(buffer, size, address, process_index, options); }
const void* Snapshot::read_bytes(void* buffer, std::size_t size, remote_ptr<void> address, int process_index, AddressSpace::ReadMode mode) const { mc_mem_region_t region = mc_get_snapshot_region((void*)address.address(), this, process_index); if (region) { const void* res = MC_region_read(region, buffer, (void*)address.address(), size); if (buffer == res || mode == AddressSpace::Lazy) return res; else { memcpy(buffer, res, size); return buffer; } } else return this->process()->read_bytes( buffer, size, address, process_index, mode); }