R_API int r_io_read_at(RIO *io, ut64 addr, ut8 *buf, int len) { #if 0 int ret; if (r_io_seek (io, addr, R_IO_SEEK_SET)==UT64_MAX) { memset (buf, 0xff, len); return -1; } ret = r_io_read_internal (io, buf, len); if (ret<1) memset (buf, 0xff, len); return ret; #else int ret, l, olen = len; int w = 0; #if 1 // HACK?: if io->va == 0 -> call seek+read without checking sections ? if (!io->va) { // r_io_seek (io, addr, R_IO_SEEK_SET); r_io_map_select (io, addr); ret = r_io_read_internal (io, buf, len); if (io->cached) { r_io_cache_read (io, addr, buf, len); } return ret; } #endif while (len>0) { ut64 last = r_io_section_next (io, addr); l = (len > (last-addr))? (last-addr): len; if (l<1) l = len; // ignore seek errors // eprintf ("0x%llx %llx\n", addr+w, //r_io_seek (io, addr+w, R_IO_SEEK_SET); r_io_map_select (io, addr+w); ret = r_io_read_internal (io, buf+w, l); if (ret <1) { memset (buf+w, 0xff, l); // reading out of file ret = 1; } else if (ret<l) { // eprintf ("FOUND EOF AT %llx\n", addr+ret); l = ret; } if (io->cached) { r_io_cache_read (io, addr+w, buf+w, l); } w += l; len -= l; } return olen; #endif }
R_API int r_io_read_at(RIO *io, ut64 addr, ut8 *buf, int len) { ut64 paddr, last, last2; int ms, ret, l, olen = len, w = 0; io->off = addr; memset (buf, 0xff, len); // probably unnecessary if (io->buffer_enabled) return r_io_buffer_read (io, addr, buf, len); while (len>0) { last = r_io_section_next (io, addr+w); last2 = r_io_map_next (io, addr+w); // XXX: must use physical address if (last == (addr+w)) last = last2; //else if (last2<last) last = last2; l = (len > (last-addr+w))? (last-addr+w): len; if (l<1) l = len; { paddr = w? r_io_section_vaddr_to_offset (io, addr+w): addr; if (len>0 && l>len) l = len; addr = paddr-w; if (r_io_seek (io, paddr, R_IO_SEEK_SET)==UT64_MAX) { memset (buf+w, 0xff, l); } } #if 0 if (io->zeromap) if (!r_io_map_get (io, addr+w)) { if (addr==0||r_io_section_getv (io, addr+w)) { memset (buf+w, 0xff, l); eprintf ("RETRERET\n"); return -1; } } #endif // XXX is this necessary? ms = r_io_map_select (io, addr+w); ret = r_io_read_internal (io, buf+w, l); //eprintf ("READ %d = %02x %02x %02x\n", ret, buf[w], buf[w+1], buf[w+2]); if (ret<1) { memset (buf+w, 0xff, l); // reading out of file ret = 1; } else if (ret<l) { l = ret; } #if USE_CACHE if (io->cached) { r_io_cache_read (io, addr+w, buf+w, len-w); } else if (r_list_length (io->maps) >1) { if (!io->debug && ms>0) { //eprintf ("FAIL MS=%d l=%d d=%d\n", ms, l, d); /* check if address is vaddred in sections */ ut64 o = r_io_section_offset_to_vaddr (io, addr+w); if (o == UT64_MAX) { ut64 o = r_io_section_vaddr_to_offset (io, addr+w); if (o == UT64_MAX) memset (buf+w, 0xff, l); } break; } } #endif w += l; len -= l; } return olen; }
R_API int r_io_read_at(RIO *io, ut64 addr, ut8 *buf, int len) { int ret, l, olen = len; int w = 0; #if 0 // HACK?: if io->va == 0 -> call seek+read without checking sections ? if (!io->va) { // r_io_seek (io, addr, R_IO_SEEK_SET); r_io_map_select (io, addr); ret = r_io_read_internal (io, buf, len); if (io->cached) { r_io_cache_read (io, addr, buf, len); } return ret; } #endif // XXX: this is buggy! while (len>0) { int ms; ut64 last = r_io_section_next (io, addr); l = (len > (last-addr))? (last-addr): len; if (l<1) l = len; // ignore seek errors // eprintf ("0x%llx %llx\n", addr+w, //r_io_seek (io, addr+w, R_IO_SEEK_SET); if (r_io_seek (io, addr+w, R_IO_SEEK_SET)==UT64_MAX) { memset (buf+w, 0xff, l); return -1; } ms = r_io_map_select (io, addr+w); ret = r_io_read_internal (io, buf+w, l); if (ret<1) { memset (buf+w, 0xff, l); // reading out of file ret = 1; } else if (ret<l) { // eprintf ("FOUND EOF AT %llx\n", addr+ret); l = ret; } if (io->cached) { r_io_cache_read (io, addr+w, buf+w, l); /* * XXX: The 'else' below is fixing the io.cache * with resized files. That may be wrong */ } else // hide non-mapped files here // do not allow reading on real addresses if mapped != 0 if (!io->debug && ms>0) { //eprintf ("FAIL MS=%d l=%d d=%d\n", ms, l, d); /* check if address is vaddred in sections */ ut64 o = r_io_section_offset_to_vaddr (io, addr); if (o == UT64_MAX) { ut64 o = r_io_section_vaddr_to_offset (io, addr); if (o == UT64_MAX) memset (buf+w, 0xff, l); } break; } w += l; len -= l; } return olen; }