2009-02-05 21:08:46 +00:00
|
|
|
#ifndef _LIB_R_IO_H_
|
|
|
|
#define _LIB_R_IO_H_
|
|
|
|
|
2010-01-26 00:28:33 +00:00
|
|
|
#include <r_types.h>
|
|
|
|
#include <r_util.h>
|
|
|
|
#include <list.h>
|
2009-02-05 21:08:46 +00:00
|
|
|
|
2009-09-08 18:16:52 +00:00
|
|
|
#define R_IO_READ 4
|
|
|
|
#define R_IO_WRITE 2
|
|
|
|
#define R_IO_EXEC 1
|
|
|
|
|
|
|
|
#define R_IO_SEEK_SET 0
|
|
|
|
#define R_IO_SEEK_CUR 1
|
|
|
|
#define R_IO_SEEK_END 2
|
2009-09-08 02:14:19 +00:00
|
|
|
|
2009-02-05 21:08:46 +00:00
|
|
|
#define R_IO_NFDS 32
|
|
|
|
|
2009-09-05 23:58:02 +00:00
|
|
|
#define IO_MAP_N 128
|
2009-12-24 02:17:53 +00:00
|
|
|
typedef struct r_io_map_t {
|
2009-02-05 21:08:46 +00:00
|
|
|
int fd;
|
2009-09-05 23:58:02 +00:00
|
|
|
int flags;
|
|
|
|
ut64 delta;
|
2009-07-08 11:49:55 +00:00
|
|
|
ut64 from;
|
|
|
|
ut64 to;
|
2009-02-05 21:08:46 +00:00
|
|
|
struct list_head list;
|
2010-02-05 11:21:37 +00:00
|
|
|
} RIOMap;
|
2009-02-05 21:08:46 +00:00
|
|
|
|
2009-02-16 23:09:40 +00:00
|
|
|
/* stores write and seek changes */
|
|
|
|
#define R_IO_UNDOS 64
|
2009-12-24 02:17:53 +00:00
|
|
|
typedef struct r_io_undo_t {
|
2009-09-09 00:35:00 +00:00
|
|
|
int s_enable;
|
|
|
|
int w_enable;
|
2009-09-08 18:16:52 +00:00
|
|
|
/* write stuff */
|
|
|
|
struct list_head w_list;
|
2009-02-16 23:09:40 +00:00
|
|
|
int w_init;
|
2009-09-08 18:16:52 +00:00
|
|
|
/* seek stuff */
|
2009-07-08 11:49:55 +00:00
|
|
|
ut64 seek[R_IO_UNDOS];
|
2009-02-16 23:09:40 +00:00
|
|
|
int fd[R_IO_UNDOS];
|
|
|
|
int idx;
|
2009-09-08 18:16:52 +00:00
|
|
|
int limit;
|
2010-02-05 11:21:37 +00:00
|
|
|
} RIOUndo;
|
2009-09-08 18:16:52 +00:00
|
|
|
|
2009-12-24 02:17:53 +00:00
|
|
|
typedef struct r_io_undo_w_t {
|
2009-09-08 18:16:52 +00:00
|
|
|
int set;
|
|
|
|
ut64 off;
|
|
|
|
ut8 *o; /* old data */
|
|
|
|
ut8 *n; /* new data */
|
|
|
|
int len; /* length */
|
|
|
|
struct list_head list;
|
2010-02-05 11:21:37 +00:00
|
|
|
} RIOUndoWrite;
|
2009-02-16 23:09:40 +00:00
|
|
|
|
2009-12-24 02:17:53 +00:00
|
|
|
typedef struct r_io_t {
|
2009-02-05 21:08:46 +00:00
|
|
|
int fd;
|
2009-09-08 02:14:19 +00:00
|
|
|
int enforce_rwx;
|
|
|
|
int enforce_seek;
|
|
|
|
int cached;
|
2009-09-17 09:48:36 +00:00
|
|
|
int cached_read;
|
2010-02-15 21:59:26 +00:00
|
|
|
ut64 off;
|
2010-02-18 17:58:28 +00:00
|
|
|
int va;
|
2009-02-05 21:08:46 +00:00
|
|
|
char *redirect;
|
|
|
|
/* write mask */
|
2009-08-22 04:54:41 +00:00
|
|
|
void (*printf)(const char *str, ...);
|
2009-02-05 21:08:46 +00:00
|
|
|
int write_mask_fd;
|
2009-07-08 11:49:55 +00:00
|
|
|
ut8 *write_mask_buf;
|
2009-02-05 21:08:46 +00:00
|
|
|
int write_mask_len;
|
2010-05-25 23:42:22 +00:00
|
|
|
struct r_io_plugin_t *plugin;
|
2009-09-08 18:16:52 +00:00
|
|
|
struct r_io_undo_t undo;
|
2009-02-05 21:08:46 +00:00
|
|
|
struct list_head io_list;
|
|
|
|
struct list_head sections;
|
2009-09-05 23:58:02 +00:00
|
|
|
/* maps */
|
2009-02-05 21:08:46 +00:00
|
|
|
struct list_head maps;
|
2010-02-18 17:58:28 +00:00
|
|
|
struct list_head desc;
|
2009-09-08 02:14:19 +00:00
|
|
|
struct list_head cache;
|
2010-02-05 11:21:37 +00:00
|
|
|
} RIO;
|
2009-02-05 21:08:46 +00:00
|
|
|
|
2010-05-26 16:25:35 +00:00
|
|
|
//struct r_io_plugin_fd_t {
|
2009-02-16 23:09:40 +00:00
|
|
|
// ... store io changes here
|
|
|
|
//};
|
|
|
|
|
2010-05-25 23:42:22 +00:00
|
|
|
typedef struct r_io_plugin_t {
|
2010-05-26 22:57:25 +00:00
|
|
|
void *plugin;
|
2009-02-05 21:08:46 +00:00
|
|
|
char *name;
|
|
|
|
char *desc;
|
|
|
|
void *widget;
|
|
|
|
int (*init)();
|
2009-02-16 23:09:40 +00:00
|
|
|
struct r_io_undo_t undo;
|
2009-02-18 00:43:57 +00:00
|
|
|
struct debug_t *debug; // ???
|
2010-03-26 10:59:28 +00:00
|
|
|
int (*system)(RIO *io, int fd, const char *);
|
|
|
|
int (*open)(RIO *io, const char *, int rw, int mode);
|
|
|
|
int (*read)(RIO *io, int fd, ut8 *buf, int count);
|
|
|
|
ut64 (*lseek)(RIO *io, int fildes, ut64 offset, int whence);
|
|
|
|
int (*write)(RIO *io, int fd, const ut8 *buf, int count);
|
|
|
|
int (*close)(RIO *io, int fd);
|
|
|
|
int (*resize)(RIO *io, int fd, ut64 size);
|
2010-05-26 22:57:25 +00:00
|
|
|
int (*plugin_open)(RIO *io, const char *);
|
|
|
|
//int (*plugin_fd)(RIO *, int);
|
2009-02-05 21:08:46 +00:00
|
|
|
int fds[R_IO_NFDS];
|
2010-05-25 23:42:22 +00:00
|
|
|
} RIOPlugin;
|
2009-02-05 21:08:46 +00:00
|
|
|
|
2009-12-24 02:17:53 +00:00
|
|
|
typedef struct r_io_list_t {
|
2010-05-25 23:42:22 +00:00
|
|
|
struct r_io_plugin_t *plugin;
|
2009-02-05 21:08:46 +00:00
|
|
|
struct list_head list;
|
2010-02-05 11:21:37 +00:00
|
|
|
} RIOList;
|
2009-02-05 21:08:46 +00:00
|
|
|
|
2010-02-05 11:21:37 +00:00
|
|
|
/* TODO: find better name... RIOSetFd_Callback? ..Func? .. too camels here */
|
|
|
|
typedef int (*RIOSetFd)(RIO *io, int fd);
|
|
|
|
typedef int (*RIOReadAt)(RIO *io, ut64 addr, ut8 *buf, int size);
|
|
|
|
typedef int (*RIOWriteAt)(RIO *io, ut64 addr, const ut8 *buf, int size);
|
2010-01-21 01:38:52 +00:00
|
|
|
|
2009-09-10 20:51:34 +00:00
|
|
|
/* compile time dependency */
|
2009-12-24 02:17:53 +00:00
|
|
|
typedef struct r_io_bind_t {
|
2009-09-10 20:51:34 +00:00
|
|
|
int init;
|
2010-03-26 10:59:28 +00:00
|
|
|
RIO *io;
|
2010-02-05 11:21:37 +00:00
|
|
|
RIOSetFd set_fd;
|
|
|
|
RIOReadAt read_at;
|
|
|
|
RIOWriteAt write_at;
|
|
|
|
} RIOBind;
|
2009-12-24 02:17:53 +00:00
|
|
|
|
|
|
|
/* sections */
|
2010-01-24 22:47:18 +00:00
|
|
|
typedef struct r_io_section_t {
|
2009-12-24 02:17:53 +00:00
|
|
|
char name[256];
|
2010-02-18 17:58:28 +00:00
|
|
|
ut64 offset;
|
2009-12-24 02:17:53 +00:00
|
|
|
ut64 vaddr;
|
2010-02-18 17:58:28 +00:00
|
|
|
ut64 size;
|
|
|
|
ut64 vsize;
|
2009-12-24 02:17:53 +00:00
|
|
|
int rwx;
|
|
|
|
struct list_head list;
|
2010-02-05 11:21:37 +00:00
|
|
|
} RIOSection;
|
2009-09-10 20:51:34 +00:00
|
|
|
|
2010-01-24 22:47:18 +00:00
|
|
|
typedef struct r_io_cache_t {
|
2009-12-24 02:17:53 +00:00
|
|
|
ut64 from;
|
|
|
|
ut64 to;
|
|
|
|
int size;
|
|
|
|
ut8 *data;
|
|
|
|
struct list_head list;
|
2010-02-05 11:21:37 +00:00
|
|
|
} RIOCache;
|
2009-12-24 02:17:53 +00:00
|
|
|
|
|
|
|
typedef struct r_io_desc_t {
|
|
|
|
int fd;
|
|
|
|
int flags;
|
2010-02-18 17:58:28 +00:00
|
|
|
char name[4096];
|
2010-05-26 22:57:25 +00:00
|
|
|
struct r_io_plugin_t *plugin;
|
2010-02-18 17:58:28 +00:00
|
|
|
struct list_head list;
|
2010-02-05 11:21:37 +00:00
|
|
|
} RIODesc;
|
2009-09-10 20:51:34 +00:00
|
|
|
|
2009-12-24 02:17:53 +00:00
|
|
|
#ifdef R_API
|
|
|
|
#define r_io_bind_init(x) memset(&x,0,sizeof(x))
|
2010-02-22 01:42:29 +00:00
|
|
|
|
2010-05-26 22:57:25 +00:00
|
|
|
/* io/plugin.c */
|
2010-03-26 10:59:28 +00:00
|
|
|
R_API RIO *r_io_new();
|
|
|
|
R_API RIO *r_io_free(RIO *io);
|
2010-05-26 16:25:35 +00:00
|
|
|
R_API int r_io_plugin_init(RIO *io);
|
|
|
|
R_API int r_io_plugin_open(RIO *io, int fd, struct r_io_plugin_t *plugin);
|
|
|
|
R_API int r_io_plugin_close(RIO *io, int fd, struct r_io_plugin_t *plugin);
|
|
|
|
R_API int r_io_plugin_generate(RIO *io);
|
|
|
|
R_API int r_io_plugin_add(RIO *io, struct r_io_plugin_t *plugin);
|
|
|
|
R_API int r_io_plugin_list(RIO *io);
|
2009-02-05 21:08:46 +00:00
|
|
|
// TODO: _del ??
|
2010-05-26 16:25:35 +00:00
|
|
|
R_API struct r_io_plugin_t *r_io_plugin_resolve(RIO *io, const char *filename);
|
|
|
|
R_API struct r_io_plugin_t *r_io_plugin_resolve_fd(RIO *io, int fd);
|
2009-02-05 21:08:46 +00:00
|
|
|
|
|
|
|
/* io/io.c */
|
2010-03-26 10:59:28 +00:00
|
|
|
R_API int r_io_set_write_mask(RIO *io, const ut8 *buf, int len);
|
|
|
|
R_API int r_io_open(RIO *io, const char *file, int flags, int mode);
|
|
|
|
R_API int r_io_open_as(RIO *io, const char *urihandler, const char *file, int flags, int mode);
|
|
|
|
R_API int r_io_redirect(RIO *io, const char *file);
|
|
|
|
R_API int r_io_set_fd(RIO *io, int fd);
|
|
|
|
R_API RBuffer *r_io_read_buf(RIO *io, ut64 addr, int len);
|
|
|
|
R_API int r_io_read(RIO *io, ut8 *buf, int len);
|
|
|
|
R_API int r_io_read_at(RIO *io, ut64 addr, ut8 *buf, int len);
|
|
|
|
R_API ut64 r_io_read_i(RIO *io, ut64 addr, int sz, int endian);
|
|
|
|
R_API int r_io_write(RIO *io, const ut8 *buf, int len);
|
|
|
|
R_API int r_io_write_at(RIO *io, ut64 addr, const ut8 *buf, int len);
|
|
|
|
R_API ut64 r_io_seek(RIO *io, ut64 offset, int whence);
|
|
|
|
R_API int r_io_system(RIO *io, const char *cmd);
|
|
|
|
R_API int r_io_close(RIO *io, int fd);
|
|
|
|
R_API ut64 r_io_size(RIO *io, int fd);
|
2009-02-05 21:08:46 +00:00
|
|
|
|
2009-09-08 02:14:19 +00:00
|
|
|
/* io/cache.c */
|
2010-03-30 21:12:19 +00:00
|
|
|
R_API void r_io_cache_commit(RIO *io);
|
2010-03-26 10:59:28 +00:00
|
|
|
R_API void r_io_cache_enable(RIO *io, int read, int write);
|
|
|
|
R_API void r_io_cache_init(RIO *io);
|
2010-03-30 21:12:19 +00:00
|
|
|
R_API int r_io_cache_list(struct r_io_t *io, int rad);
|
2010-03-30 15:37:15 +00:00
|
|
|
R_API void r_io_cache_reset(struct r_io_t *io, int set);
|
2010-03-26 10:59:28 +00:00
|
|
|
R_API int r_io_cache_write(RIO *io, ut64 addr, const ut8 *buf, int len);
|
|
|
|
R_API int r_io_cache_read(RIO *io, ut64 addr, ut8 *buf, int len);
|
2009-09-08 02:14:19 +00:00
|
|
|
|
2009-09-08 01:08:46 +00:00
|
|
|
/* io/bind.c */
|
2010-03-26 10:59:28 +00:00
|
|
|
R_API int r_io_bind(RIO *io, struct r_io_bind_t *bnd);
|
2009-09-08 01:08:46 +00:00
|
|
|
|
2009-02-05 21:08:46 +00:00
|
|
|
/* io/map.c */
|
2010-03-26 10:59:28 +00:00
|
|
|
R_API void r_io_map_init(RIO *io);
|
|
|
|
R_API int r_io_map_add(RIO *io, int fd, int flags, ut64 delta, ut64 offset, ut64 size);
|
|
|
|
R_API int r_io_map_del(RIO *io, int fd);
|
|
|
|
R_API int r_io_map_list(RIO *io);
|
|
|
|
R_API int r_io_map(RIO *io, const char *file, ut64 offset);
|
|
|
|
R_API int r_io_map_read_at(RIO *io, ut64 off, ut8 *buf, int len);
|
|
|
|
//R_API int r_io_map_read_rest(RIO *io, ut64 off, ut8 *buf, ut64 len);
|
|
|
|
R_API int r_io_map_write_at(RIO *io, ut64 off, const ut8 *buf, int len);
|
|
|
|
R_API RIOMap *r_io_map_resolve(RIO *io, int fd);
|
2009-02-05 21:08:46 +00:00
|
|
|
|
2010-02-18 17:58:28 +00:00
|
|
|
/* io/section.c */
|
2010-03-26 10:59:28 +00:00
|
|
|
R_API void r_io_section_init(RIO *io);
|
|
|
|
R_API void r_io_section_add(RIO *io, ut64 offset, ut64 vaddr, ut64 size, ut64 vsize, int rwx, const char *name);
|
|
|
|
R_API struct r_io_section_t *r_io_section_get_i(RIO *io, int idx);
|
|
|
|
R_API int r_io_section_rm(RIO *io, int idx);
|
|
|
|
R_API void r_io_section_list(RIO *io, ut64 offset, int rad);
|
|
|
|
R_API void r_io_section_list_visual(RIO *io, ut64 seek, ut64 len);
|
|
|
|
R_API struct r_io_section_t *r_io_section_get(RIO *io, ut64 offset);
|
|
|
|
R_API ut64 r_io_section_get_offset(RIO *io, ut64 offset);
|
|
|
|
R_API ut64 r_io_section_get_vaddr(RIO *io, ut64 offset);
|
|
|
|
R_API int r_io_section_get_rwx(RIO *io, ut64 offset);
|
|
|
|
R_API int r_io_section_overlaps(RIO *io, struct r_io_section_t *s);
|
|
|
|
R_API ut64 r_io_section_vaddr_to_offset(RIO *io, ut64 vaddr);
|
|
|
|
R_API ut64 r_io_section_offset_to_vaddr(RIO *io, ut64 offset);
|
2009-09-08 18:16:52 +00:00
|
|
|
|
|
|
|
/* undo api */
|
|
|
|
// track seeks and writes
|
|
|
|
// TODO: needs cleanup..kinda big?
|
2010-03-26 10:59:28 +00:00
|
|
|
R_API int r_io_undo_init(RIO *io);
|
|
|
|
R_API void r_io_undo_enable(RIO *io, int seek, int write);
|
2009-09-09 00:35:00 +00:00
|
|
|
/* seek undo */
|
2010-05-19 00:39:01 +00:00
|
|
|
R_API int r_io_sundo(RIO *io);
|
2010-03-26 10:59:28 +00:00
|
|
|
R_API ut64 r_io_sundo_last(RIO *io);
|
2010-05-19 00:39:01 +00:00
|
|
|
R_API int r_io_sundo_redo(RIO *io);
|
2010-03-26 10:59:28 +00:00
|
|
|
R_API void r_io_sundo_push(RIO *io);
|
|
|
|
R_API void r_io_sundo_reset(RIO *io);
|
|
|
|
R_API void r_io_sundo_list(RIO *io);
|
2009-09-09 00:35:00 +00:00
|
|
|
/* write undo */
|
2010-03-26 10:59:28 +00:00
|
|
|
R_API void r_io_wundo_new(RIO *io, ut64 off, const ut8 *data, int len);
|
|
|
|
R_API void r_io_wundo_clear(RIO *io);
|
|
|
|
R_API int r_io_wundo_size(RIO *io);
|
|
|
|
R_API void r_io_wundo_list(RIO *io);
|
|
|
|
R_API int r_io_wundo_set_t(RIO *io, struct r_io_undo_w_t *u, int set) ;
|
|
|
|
R_API void r_io_wundo_set_all(RIO *io, int set);
|
|
|
|
R_API int r_io_wundo_set(RIO *io, int n, int set);
|
2010-01-24 22:47:18 +00:00
|
|
|
|
2010-02-18 17:58:28 +00:00
|
|
|
/* io/desc.c */
|
2010-03-26 10:59:28 +00:00
|
|
|
R_API int r_io_desc_init(RIO *io);
|
2010-05-26 22:57:25 +00:00
|
|
|
R_API int r_io_desc_add(RIO *io, int fd, const char *file, int flags, struct r_io_plugin_t *plugin);
|
2010-03-26 10:59:28 +00:00
|
|
|
R_API int r_io_desc_del(RIO *io, int fd);
|
|
|
|
R_API struct r_io_desc_t *r_io_desc_get(RIO *io, int fd);
|
|
|
|
R_API int r_io_desc_generate(RIO *io);
|
2010-02-18 17:58:28 +00:00
|
|
|
|
|
|
|
|
2010-01-24 22:47:18 +00:00
|
|
|
/* plugins */
|
2010-05-25 23:42:22 +00:00
|
|
|
extern struct r_io_plugin_t r_io_plugin_procpid;
|
|
|
|
extern struct r_io_plugin_t r_io_plugin_malloc;
|
|
|
|
extern struct r_io_plugin_t r_io_plugin_ptrace;
|
|
|
|
extern struct r_io_plugin_t r_io_plugin_w32dbg;
|
|
|
|
extern struct r_io_plugin_t r_io_plugin_mach;
|
|
|
|
extern struct r_io_plugin_t r_io_plugin_debug;
|
|
|
|
extern struct r_io_plugin_t r_io_plugin_shm;
|
2009-12-24 02:17:53 +00:00
|
|
|
#endif
|
2009-09-08 18:16:52 +00:00
|
|
|
|
2009-08-22 03:11:33 +00:00
|
|
|
#if 0
|
2010-03-26 10:59:28 +00:00
|
|
|
#define CB_READ int (*cb_read)(RIO *user, int pid, ut64 addr, ut8 *buf, int len)
|
|
|
|
#define CB_WRITE int (*cb_write)(RIO *user, int pid, ut64 addr, const ut8 *buf, int len)
|
2009-08-22 03:11:33 +00:00
|
|
|
#define CB_IO int (*cb_io)(void *user, CB_READ, CB_WRITE)
|
2010-03-26 10:59:28 +00:00
|
|
|
R_API int r_io_hook(RIO *io, CB_IO);
|
2009-08-22 03:11:33 +00:00
|
|
|
#endif
|
|
|
|
|
2009-02-05 21:08:46 +00:00
|
|
|
#endif
|