Exemplo n.º 1
0
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
}
Exemplo n.º 2
0
Arquivo: io.c Projeto: Rogunix/radare2
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;
}
Exemplo n.º 3
0
Arquivo: io.c Projeto: moon2l/radare2
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;
}