//ret 0 or -1 if failed; ret copied length if success R_API int r_buf_write_at(RBuffer *b, ut64 addr, const ut8 *buf, int len) { if (!b || !buf || len < 1) { return 0; } if (b->fd != -1) { ut64 newlen = addr + len; if (r_sandbox_lseek (b->fd, addr, SEEK_SET) == -1) { return 0; } if (newlen > b->length) { b->length = newlen; #ifdef _MSC_VER _chsize (b->fd, newlen); #else ftruncate (b->fd, newlen); #endif } return r_sandbox_write (b->fd, buf, len); } if (b->sparse) { return (sparse_write (b->sparse, addr, buf, len) < 0) ? -1 : len; } if (b->empty) { b->empty = 0; free (b->buf); b->buf = (ut8 *) malloc (addr + len); } return r_buf_cpy (b, addr, b->buf, buf, len, true); }
//ret 0 if failed; ret copied length if successful R_API int r_buf_read_at(RBuffer *b, ut64 addr, ut8 *buf, int len) { st64 pa; if (!b || !buf || len < 1) { return 0; } #if R_BUF_CUR != UT64_MAX #error R_BUF_CUR must be UT64_MAX #endif if (addr == R_BUF_CUR) { addr = b->cur; } if (b->fd != -1) { if (r_sandbox_lseek (b->fd, addr, SEEK_SET) == -1) { return 0; } return r_sandbox_read (b->fd, buf, len); } if (!b->sparse) { if (addr < b->base || len < 1) { return 0; } pa = addr - b->base; if (pa + len > b->length) { memset (buf, 0xff, len); len = b->length - pa; if (len < 0) { return 0; } } } // must be +pa, but maybe its missused? //return r_buf_cpy (b, addr, buf, b->buf+pa, len, false); return r_buf_cpy (b, addr, buf, b->buf, len, false); }
R_API int r_buf_write_at(RBuffer *b, ut64 addr, const ut8 *buf, int len) { if (!b) return 0; if (b->empty) { b->empty = 0; free (b->buf); b->buf = (ut8 *) malloc (addr + len); } return r_buf_cpy (b, addr, b->buf, buf, len, R_TRUE); }
//ret 0 if failed; ret copied length if successful R_API int r_buf_read_at(RBuffer *b, ut64 addr, ut8 *buf, int len) { st64 pa; if (!b || !buf || len<1) return 0; #if R_BUF_CUR != UT64_MAX #error R_BUF_CUR must be UT64_MAX #endif if (addr == R_BUF_CUR) { addr = b->cur; } if (!b->sparse) { if (addr < b->base || len<1) return 0; pa = addr - b->base; if (pa+len > b->length) { memset (buf, 0xff, len); len = b->length - pa; if (len<0) return 0; } } // must be +pa, but maybe its missused? //return r_buf_cpy (b, addr, buf, b->buf+pa, len, R_FALSE); return r_buf_cpy (b, addr, buf, b->buf, len, R_FALSE); }
R_API int r_buf_read_at(RBuffer *b, ut64 addr, ut8 *buf, int len) { if (!b) return 0; return r_buf_cpy (b, addr, buf, b->buf, len, R_FALSE); }
R_API int r_buf_write_at(RBuffer *b, ut64 addr, const ut8 *buf, int len) { return r_buf_cpy (b, addr, b->buf, buf, len, R_TRUE); }