R_API int r_core_block_read(RCore *core, int next) { ut64 off; if (core->file == NULL) { memset (core->block, 0xff, core->blocksize); return -1; } r_io_set_fd (core->io, core->file->fd); off = r_io_seek (core->io, core->offset+((next)?core->blocksize:0), R_IO_SEEK_SET); if (off == UT64_MAX) { memset (core->block, 0xff, core->blocksize); return -1; } return (int)r_io_read (core->io, core->block, core->blocksize); }
R_API int r_io_write(struct r_io_t *io, const ut8 *buf, int len) { int i, ret = -1; ut8 *data = NULL; /* check section permissions */ if (io->enforce_rwx && !(r_io_section_get_rwx (io, io->off) & R_IO_WRITE)) return -1; if (io->cached) { ret = r_io_cache_write (io, io->off, buf, len); if (ret == len) return len; if (ret > 0) { len -= ret; buf += ret; } } /* TODO: implement IO cache here. to avoid dupping work on vm for example */ /* apply write binary mask */ if (io->write_mask_fd != -1) { data = malloc (len); r_io_seek (io, io->off, R_IO_SEEK_SET); r_io_read (io, data, len); r_io_seek (io, io->off, R_IO_SEEK_SET); for (i=0; i<len; i++) data[i] = buf[i] & \ io->write_mask_buf[i%io->write_mask_len]; buf = data; } r_io_map_select(io,io->off); if (io->plugin) { if (io->plugin->write) ret = io->plugin->write (io, io->fd, buf, len); else eprintf ("r_io_write: io handler with no write callback\n"); } else ret = write (io->fd->fd, buf, len); if (ret == -1) eprintf ("r_io_write: cannot write on fd %d\n", io->fd->fd); if (data) free (data); return ret; }
R_API int r_io_buffer_load(RIO* io, ut64 addr, int len) { ut64 at; int i, r; ut8 buf[512]; if (len<1) return R_FALSE; io->buffer_enabled = 0; for (i=0; i<len; i+=sizeof (buf)) { at = addr+i; r_io_seek (io, at, R_IO_SEEK_SET); memset (buf, 0xff, sizeof (buf)); r = r_io_read (io, buf, sizeof (buf)); if (r<1) break; r_cache_set (io->buffer, at, buf, sizeof (buf)); } io->buffer_enabled = 1; return R_TRUE; }
R_API int r_core_read_at(RCore *core, ut64 addr, ut8 *buf, int size) { int ret; if (!core->io || !core->file || size<1) return R_FALSE; #if 0 r_io_set_fd (core->io, core->file->fd); // XXX ignore ret? -- ultra slow method.. inverse resolution of io plugin brbrb ret = r_io_read_at (core->io, addr, buf, size); if (addr>=core->offset && addr<=core->offset+core->blocksize) r_core_block_read (core, 0); #else r_io_set_fd (core->io, core->file->fd); // XXX ignore ret? -- ultra slow method.. inverse resolution of io plugin brbrb //ret = r_io_read_at (core->io, addr, buf, size); r_io_seek (core->io, addr, R_IO_SEEK_SET); ret = r_io_read (core->io, buf, size); if (ret != size) { if (ret>=size || ret<0) ret = 0; memset (buf+ret, 0xff, size-ret); } if (addr>=core->offset && addr<=core->offset+core->blocksize) r_core_block_read (core, 0); #endif return (ret==size); //UT64_MAX); }