コード例 #1
0
ファイル: buf.c プロジェクト: P4N74/radare2
//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);
}
コード例 #2
0
ファイル: buf.c プロジェクト: P4N74/radare2
//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);
}
コード例 #3
0
ファイル: buf.c プロジェクト: dialeth/radare2
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);
}
コード例 #4
0
ファイル: buf.c プロジェクト: 8500616886/radare2
//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);
}
コード例 #5
0
ファイル: buf.c プロジェクト: dialeth/radare2
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);
}
コード例 #6
0
ファイル: buf.c プロジェクト: pixilla/radare2
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);
}