| 293 | } |
| 294 | |
| 295 | ssize_t |
| 296 | ProcessMemoryManager::copyMemoryFromProcess(remote_addr_t addr, size_t len, void* dst) const |
| 297 | { |
| 298 | auto vmap = std::find_if(d_vmaps.begin(), d_vmaps.end(), [&](const auto& vmap) { |
| 299 | return vmap.containsAddr(addr) && vmap.containsAddr(addr + len - 1); |
| 300 | }); |
| 301 | |
| 302 | if (vmap == d_vmaps.end() || !d_lru_cache.can_fit(vmap->Size())) { |
| 303 | return readChunk(addr, len, reinterpret_cast<char*>(dst)); |
| 304 | } |
| 305 | |
| 306 | uintptr_t key = vmap->Start(); |
| 307 | size_t chunk_size = vmap->Size(); |
| 308 | remote_addr_t vmap_start_addr = vmap->Start(); |
| 309 | size_t offset_addr = addr - vmap_start_addr; |
| 310 | |
| 311 | if (!d_lru_cache.exists(key)) { |
| 312 | std::vector<char> buf(chunk_size); |
| 313 | readChunk(vmap_start_addr, chunk_size, buf.data()); |
| 314 | d_lru_cache.put(key, std::move(buf)); |
| 315 | } |
| 316 | |
| 317 | std::memcpy(dst, d_lru_cache.get(key).data() + offset_addr, len); |
| 318 | |
| 319 | return len; |
| 320 | } |
| 321 | |
| 322 | bool |
| 323 | ProcessMemoryManager::isAddressValid(remote_addr_t addr, const VirtualMap& map) const |
no test coverage detected