1 /* radare2 - LGPL - Copyright 2017-2020 - condret, pancake, alvaro */ 2 3 #ifndef R2_IO_H 4 #define R2_IO_H 5 6 #include "r_list.h" 7 #include <r_util.h> 8 #include "r_socket.h" 9 #include "r_vector.h" 10 #include "r_skyline.h" 11 12 #define R_IO_SEEK_SET 0 13 #define R_IO_SEEK_CUR 1 14 #define R_IO_SEEK_END 2 15 16 #define R_IO_UNDOS 64 17 18 #define r_io_map_begin(map) r_itv_begin (map->itv) 19 #define r_io_map_to(map) ( r_itv_end (map->itv) - 1 ) 20 #define r_io_map_end(map) r_itv_end (map->itv) 21 #define r_io_map_size(map) r_itv_size (map->itv) 22 #define r_io_map_contain(map, addr) r_itv_contain (map->itv, addr) 23 24 #define r_io_map_set_begin(map, new_addr) \ 25 do { \ 26 map->itv.addr = new_addr; \ 27 } while (0) 28 #define r_io_map_set_size(map, new_size) \ 29 do { \ 30 map->itv.size = new_size; \ 31 } while (0) 32 33 #if HAVE_PTRACE 34 35 #if __sun 36 #include <sys/types.h> 37 #else 38 #if DEBUGGER && HAVE_PTRACE 39 #include <sys/ptrace.h> 40 #endif 41 #endif 42 43 #if (defined(__GLIBC__) && defined(__linux__)) 44 typedef enum __ptrace_request r_ptrace_request_t; 45 typedef void * r_ptrace_data_t; 46 #define R_PTRACE_NODATA NULL 47 #else 48 #if __ANDROID__ 49 typedef int r_ptrace_request_t; 50 typedef void * r_ptrace_data_t; 51 #define R_PTRACE_NODATA NULL 52 #else 53 typedef int r_ptrace_request_t; 54 typedef int r_ptrace_data_t; 55 #define R_PTRACE_NODATA 0 56 #endif 57 #endif 58 #endif 59 60 #if __cplusplus 61 extern "C" { 62 #endif 63 64 R_LIB_VERSION_HEADER(r_io); 65 66 typedef struct r_io_undos_t { 67 ut64 off; 68 int cursor; 69 } RIOUndos; 70 71 typedef struct r_io_undo_t { 72 int s_enable; 73 int w_enable; 74 /* write stuff */ 75 RList *w_list; 76 int w_init; 77 /* seek stuff */ 78 int idx; 79 int undos; /* available undos */ 80 int redos; /* available redos */ 81 RIOUndos seek[R_IO_UNDOS]; 82 /*int fd[R_IO_UNDOS]; // XXX: Must be RIODesc* */ 83 } RIOUndo; 84 85 typedef struct r_io_undo_w_t { 86 int set; 87 ut64 off; 88 ut8 *o; /* old data */ 89 ut8 *n; /* new data */ 90 int len; /* length */ 91 } RIOUndoWrite; 92 93 typedef struct r_io_t { 94 struct r_io_desc_t *desc; // XXX deprecate... we should use only the fd integer, not hold a weak pointer 95 ut64 off; 96 int bits; 97 int va; //all of this config stuff must be in 1 int 98 int ff; 99 int Oxff; 100 size_t addrbytes; 101 int aslr; 102 int autofd; 103 int cached; 104 bool cachemode; // write in cache all the read operations (EXPERIMENTAL) 105 int p_cache; 106 RIDPool *map_ids; 107 RPVector maps; //from tail backwards maps with higher priority are found 108 RSkyline map_skyline; // map parts that are not covered by others 109 RIDStorage *files; 110 RCache *buffer; 111 RPVector cache; 112 RSkyline cache_skyline; 113 ut8 *write_mask; 114 int write_mask_len; 115 RIOUndo undo; 116 SdbList *plugins; 117 char *runprofile; 118 char *envprofile; 119 #if USE_PTRACE_WRAP 120 struct ptrace_wrap_instance_t *ptrace_wrap; 121 #endif 122 #if __WINDOWS__ 123 struct w32dbg_wrap_instance_t *w32dbg_wrap; 124 #endif 125 char *args; 126 REvent *event; 127 PrintfCallback cb_printf; 128 RCoreBind corebind; 129 } RIO; 130 131 typedef struct r_io_desc_t { 132 int fd; 133 int perm; 134 char *uri; 135 char *name; 136 char *referer; 137 HtUP/*<ut64, RIODescCache *>*/ *cache; 138 void *data; 139 struct r_io_plugin_t *plugin; 140 RIO *io; 141 } RIODesc; 142 143 typedef struct { 144 ut32 magic; 145 int pid; 146 int tid; 147 void *data; 148 } RIODescData; 149 150 // Move somewhere else? 151 typedef struct { 152 RSocket *fd; 153 RSocket *client; 154 bool listener; 155 } RIORap; 156 157 typedef struct r_io_plugin_t { 158 const char *name; 159 const char *desc; 160 const char *version; 161 const char *author; 162 const char *license; 163 void *widget; 164 const char *uris; 165 int (*listener)(RIODesc *io); 166 int (*init)(void); 167 RIOUndo undo; 168 bool isdbg; 169 // int (*is_file_opened)(RIO *io, RIODesc *fd, const char *); 170 char *(*system)(RIO *io, RIODesc *fd, const char *); 171 RIODesc* (*open)(RIO *io, const char *, int perm, int mode); 172 RList* /*RIODesc* */ (*open_many)(RIO *io, const char *, int perm, int mode); 173 int (*read)(RIO *io, RIODesc *fd, ut8 *buf, int count); 174 ut64 (*lseek)(RIO *io, RIODesc *fd, ut64 offset, int whence); 175 int (*write)(RIO *io, RIODesc *fd, const ut8 *buf, int count); 176 int (*close)(RIODesc *desc); 177 bool (*is_blockdevice)(RIODesc *desc); 178 bool (*is_chardevice)(RIODesc *desc); 179 int (*getpid)(RIODesc *desc); 180 int (*gettid)(RIODesc *desc); 181 bool (*getbase)(RIODesc *desc, ut64 *base); 182 bool (*resize)(RIO *io, RIODesc *fd, ut64 size); 183 int (*extend)(RIO *io, RIODesc *fd, ut64 size); 184 bool (*accept)(RIO *io, RIODesc *desc, int fd); 185 int (*create)(RIO *io, const char *file, int mode, int type); 186 bool (*check)(RIO *io, const char *, bool many); 187 } RIOPlugin; 188 189 typedef struct r_io_map_t { 190 int fd; 191 int perm; 192 ut32 id; 193 RInterval itv; 194 ut64 delta; // paddr = itv.addr + delta 195 char *name; 196 } RIOMap; 197 198 typedef struct r_io_cache_t { 199 RInterval itv; 200 ut8 *data; 201 ut8 *odata; 202 int written; 203 } RIOCache; 204 205 #define R_IO_DESC_CACHE_SIZE (sizeof(ut64) * 8) 206 typedef struct r_io_desc_cache_t { 207 ut64 cached; 208 ut8 cdata[R_IO_DESC_CACHE_SIZE]; 209 } RIODescCache; 210 211 struct r_io_bind_t; 212 213 typedef bool (*RIODescUse)(RIO *io, int fd); 214 typedef RIODesc *(*RIODescGet)(RIO *io, int fd); 215 typedef ut64(*RIODescSize)(RIODesc *desc); 216 typedef RIODesc *(*RIOOpen)(RIO *io, const char *uri, int flags, int mode); 217 typedef RIODesc *(*RIOOpenAt)(RIO *io, const char *uri, int flags, int mode, ut64 at); 218 typedef bool (*RIOClose)(RIO *io, int fd); 219 typedef bool (*RIOReadAt)(RIO *io, ut64 addr, ut8 *buf, int len); 220 typedef bool (*RIOWriteAt)(RIO *io, ut64 addr, const ut8 *buf, int len); 221 typedef char *(*RIOSystem)(RIO *io, const char* cmd); 222 typedef int (*RIOFdOpen)(RIO *io, const char *uri, int flags, int mode); 223 typedef bool (*RIOFdClose)(RIO *io, int fd); 224 typedef ut64 (*RIOFdSeek)(RIO *io, int fd, ut64 addr, int whence); 225 typedef ut64 (*RIOFdSize)(RIO *io, int fd); 226 typedef bool (*RIOFdResize)(RIO *io, int fd, ut64 newsize); 227 typedef ut64 (*RIOP2V)(RIO *io, ut64 pa); 228 typedef ut64 (*RIOV2P)(RIO *io, ut64 va); 229 typedef int (*RIOFdRead)(RIO *io, int fd, ut8 *buf, int len); 230 typedef int (*RIOFdWrite)(RIO *io, int fd, const ut8 *buf, int len); 231 typedef int (*RIOFdReadAt)(RIO *io, int fd, ut64 addr, ut8 *buf, int len); 232 typedef int (*RIOFdWriteAt)(RIO *io, int fd, ut64 addr, const ut8 *buf, int len); 233 typedef bool (*RIOFdIsDbg)(RIO *io, int fd); 234 typedef const char *(*RIOFdGetName)(RIO *io, int fd); 235 typedef RList *(*RIOFdGetMap)(RIO *io, int fd); 236 typedef bool (*RIOFdRemap)(RIO *io, int fd, ut64 addr); 237 typedef bool (*RIOIsValidOff)(RIO *io, ut64 addr, int hasperm); 238 typedef RIOMap *(*RIOMapGet)(RIO *io, ut64 addr); 239 typedef RIOMap *(*RIOMapGetPaddr)(RIO *io, ut64 paddr); 240 typedef bool (*RIOAddrIsMapped)(RIO *io, ut64 addr); 241 typedef RIOMap *(*RIOMapAdd)(RIO *io, int fd, int flags, ut64 delta, ut64 addr, ut64 size); 242 #if HAVE_PTRACE 243 typedef long (*RIOPtraceFn)(RIO *io, r_ptrace_request_t request, pid_t pid, void *addr, r_ptrace_data_t data); 244 typedef void *(*RIOPtraceFuncFn)(RIO *io, void *(*func)(void *), void *user); 245 #endif 246 247 typedef struct r_io_bind_t { 248 int init; 249 RIO *io; 250 RIODescUse desc_use; 251 RIODescGet desc_get; 252 RIODescSize desc_size; 253 RIOOpen open; 254 RIOOpenAt open_at; 255 RIOClose close; 256 RIOReadAt read_at; 257 RIOWriteAt write_at; 258 RIOSystem system; 259 RIOFdOpen fd_open; 260 RIOFdClose fd_close; 261 RIOFdSeek fd_seek; //needed for esil 262 RIOFdSize fd_size; 263 RIOFdResize fd_resize; 264 RIOFdRead fd_read; //needed for esil 265 RIOFdWrite fd_write; //needed for esil 266 RIOFdReadAt fd_read_at; 267 RIOFdWriteAt fd_write_at; 268 RIOFdIsDbg fd_is_dbg; 269 RIOFdGetName fd_get_name; 270 RIOFdGetMap fd_get_map; 271 RIOFdRemap fd_remap; 272 RIOIsValidOff is_valid_offset; 273 RIOAddrIsMapped addr_is_mapped; 274 RIOMapGet map_get; 275 RIOMapGetPaddr map_get_paddr; 276 RIOMapAdd map_add; 277 RIOV2P v2p; 278 RIOP2V p2v; 279 #if HAVE_PTRACE 280 RIOPtraceFn ptrace; 281 RIOPtraceFuncFn ptrace_func; 282 #endif 283 } RIOBind; 284 285 //map.c 286 R_API RIOMap *r_io_map_new(RIO *io, int fd, int flags, ut64 delta, ut64 addr, ut64 size); 287 R_API void r_io_map_init(RIO *io); 288 R_API bool r_io_map_remap(RIO *io, ut32 id, ut64 addr); 289 R_API bool r_io_map_remap_fd(RIO *io, int fd, ut64 addr); 290 R_API ut64 r_io_map_location(RIO *io, ut64 size); 291 R_API bool r_io_map_exists(RIO *io, RIOMap *map); 292 R_API bool r_io_map_exists_for_id(RIO *io, ut32 id); 293 R_API RIOMap *r_io_map_resolve(RIO *io, ut32 id); 294 R_API RIOMap *r_io_map_add(RIO *io, int fd, int flags, ut64 delta, ut64 addr, ut64 size); 295 // same as r_io_map_add but used when many maps need to be added. Call r_io_update when all maps have been added. 296 R_API RIOMap *r_io_map_add_batch(RIO *io, int fd, int flags, ut64 delta, ut64 addr, ut64 size); 297 R_API RIOMap *r_io_map_get(RIO *io, ut64 addr); //returns the map at vaddr with the highest priority 298 // update the internal state of RIO after a series of _batch operations 299 R_API void r_io_update(RIO *io); 300 R_API bool r_io_map_is_mapped(RIO* io, ut64 addr); 301 R_API RIOMap *r_io_map_get_paddr(RIO *io, ut64 paddr); //returns the map at paddr with the highest priority 302 R_API void r_io_map_reset(RIO* io); 303 R_API bool r_io_map_del(RIO *io, ut32 id); 304 R_API bool r_io_map_del_for_fd(RIO *io, int fd); 305 R_API bool r_io_map_depriorize(RIO* io, ut32 id); 306 R_API bool r_io_map_priorize(RIO *io, ut32 id); 307 R_API bool r_io_map_priorize_for_fd(RIO *io, int fd); 308 R_API void r_io_map_cleanup(RIO *io); 309 R_API void r_io_map_fini(RIO *io); 310 R_API bool r_io_map_is_in_range(RIOMap *map, ut64 from, ut64 to); 311 R_API void r_io_map_set_name(RIOMap *map, const char *name); 312 R_API void r_io_map_del_name(RIOMap *map); 313 R_API RList* r_io_map_get_for_fd(RIO *io, int fd); 314 R_API bool r_io_map_resize(RIO *io, ut32 id, ut64 newsize); 315 316 // next free address to place a map.. maybe just unify 317 R_API ut64 r_io_map_next_available(RIO* io, ut64 addr, ut64 size, ut64 load_align); 318 R_API ut64 r_io_map_next_address(RIO* io, ut64 addr); 319 320 // p2v/v2p 321 322 R_API ut64 r_io_p2v(RIO *io, ut64 pa); 323 R_API ut64 r_io_v2p(RIO *io, ut64 va); 324 325 //io.c 326 R_API RIO *r_io_new(void); 327 R_API RIO *r_io_init(RIO *io); 328 R_API RIODesc *r_io_open_nomap(RIO *io, const char *uri, int flags, int mode); //should return int 329 R_API RIODesc *r_io_open(RIO *io, const char *uri, int flags, int mode); 330 R_API RIODesc *r_io_open_at(RIO *io, const char *uri, int flags, int mode, ut64 at); 331 R_API RList *r_io_open_many(RIO *io, const char *uri, int flags, int mode); 332 R_API RIODesc* r_io_open_buffer(RIO *io, RBuffer *b, int flags, int mode); 333 R_API bool r_io_close(RIO *io); 334 R_API bool r_io_reopen(RIO *io, int fd, int flags, int mode); 335 R_API int r_io_close_all(RIO *io); 336 R_API int r_io_pread_at(RIO *io, ut64 paddr, ut8 *buf, int len); 337 R_API int r_io_pwrite_at(RIO *io, ut64 paddr, const ut8 *buf, int len); 338 R_API bool r_io_vread_at_mapped(RIO* io, ut64 vaddr, ut8* buf, int len); 339 R_API bool r_io_read_at(RIO *io, ut64 addr, ut8 *buf, int len); 340 R_API bool r_io_read_at_mapped(RIO *io, ut64 addr, ut8 *buf, int len); 341 R_API int r_io_nread_at(RIO *io, ut64 addr, ut8 *buf, int len); 342 R_API void r_io_alprint(RList *ls); 343 R_API bool r_io_write_at(RIO *io, ut64 addr, const ut8 *buf, int len); 344 R_API bool r_io_read(RIO *io, ut8 *buf, int len); 345 R_API bool r_io_write(RIO *io, ut8 *buf, int len); 346 R_API ut64 r_io_size(RIO *io); 347 R_API bool r_io_is_listener(RIO *io); 348 R_API char *r_io_system(RIO *io, const char* cmd); 349 R_API bool r_io_resize(RIO *io, ut64 newsize); 350 R_API int r_io_extend_at(RIO *io, ut64 addr, ut64 size); 351 R_API bool r_io_set_write_mask(RIO *io, const ut8 *mask, int len); 352 R_API void r_io_bind(RIO *io, RIOBind *bnd); 353 R_API bool r_io_shift(RIO *io, ut64 start, ut64 end, st64 move); 354 R_API ut64 r_io_seek(RIO *io, ut64 offset, int whence); 355 R_API int r_io_fini(RIO *io); 356 R_API void r_io_free(RIO *io); 357 #define r_io_bind_init(x) memset(&x,0,sizeof(x)) 358 359 R_API bool r_io_plugin_init(RIO *io); 360 R_API bool r_io_plugin_add(RIO *io, RIOPlugin *plugin); 361 R_API int r_io_plugin_list(RIO *io); 362 R_API int r_io_plugin_list_json(RIO *io); 363 R_API int r_io_plugin_read(RIODesc *desc, ut8 *buf, int len); 364 R_API int r_io_plugin_write(RIODesc *desc, const ut8 *buf, int len); 365 R_API int r_io_plugin_read_at(RIODesc *desc, ut64 addr, ut8 *buf, int len); 366 R_API int r_io_plugin_write_at(RIODesc *desc, ut64 addr, const ut8 *buf, int len); 367 R_API RIOPlugin *r_io_plugin_resolve(RIO *io, const char *filename, bool many); 368 R_API RIOPlugin *r_io_plugin_get_default(RIO *io, const char *filename, bool many); 369 370 /* undo api */ 371 // track seeks and writes 372 // TODO: needs cleanup..kinda big? 373 R_API int r_io_undo_init(RIO *io); 374 R_API void r_io_undo_enable(RIO *io, int seek, int write); 375 /* seek undo */ 376 R_API RIOUndos *r_io_sundo(RIO *io, ut64 offset); 377 R_API RIOUndos *r_io_sundo_redo(RIO *io); 378 R_API void r_io_sundo_push(RIO *io, ut64 off, int cursor); 379 R_API void r_io_sundo_reset(RIO *io); 380 R_API RList *r_io_sundo_list(RIO *io, int mode); 381 /* write undo */ 382 R_API void r_io_wundo_new(RIO *io, ut64 off, const ut8 *data, int len); 383 R_API void r_io_wundo_apply_all(RIO *io, int set); 384 R_API int r_io_wundo_apply(RIO *io, struct r_io_undo_w_t *u, int set); 385 R_API void r_io_wundo_clear(RIO *io); 386 R_API int r_io_wundo_size(RIO *io); 387 R_API void r_io_wundo_list(RIO *io); 388 R_API int r_io_wundo_set_t(RIO *io, RIOUndoWrite *u, int set) ; 389 R_API void r_io_wundo_set_all(RIO *io, int set); 390 R_API int r_io_wundo_set(RIO *io, int n, int set); 391 392 //desc.c 393 R_API RIODesc *r_io_desc_new(RIO *io, RIOPlugin *plugin, const char *uri, int flags, int mode, void *data); 394 R_API RIODesc *r_io_desc_open(RIO *io, const char *uri, int flags, int mode); 395 R_API RIODesc *r_io_desc_open_plugin(RIO *io, RIOPlugin *plugin, const char *uri, int flags, int mode); 396 R_API bool r_io_desc_close(RIODesc *desc); 397 R_API int r_io_desc_read(RIODesc *desc, ut8 *buf, int count); 398 R_API int r_io_desc_write(RIODesc *desc, const ut8 *buf, int count); 399 R_API void r_io_desc_free(RIODesc *desc); 400 R_API bool r_io_desc_add(RIO *io, RIODesc *desc); 401 R_API bool r_io_desc_del(RIO *io, int fd); 402 R_API RIODesc *r_io_desc_get(RIO *io, int fd); 403 R_API RIODesc *r_io_desc_get_next(RIO *io, RIODesc *desc); 404 R_API RIODesc *r_io_desc_get_prev(RIO *io, RIODesc *desc); 405 R_API RIODesc *r_io_desc_get_highest(RIO *io); 406 R_API RIODesc *r_io_desc_get_lowest(RIO *io); 407 R_API ut64 r_io_desc_seek(RIODesc *desc, ut64 offset, int whence); 408 R_API bool r_io_desc_resize(RIODesc *desc, ut64 newsize); 409 R_API ut64 r_io_desc_size(RIODesc *desc); 410 R_API bool r_io_desc_is_blockdevice(RIODesc *desc); 411 R_API bool r_io_desc_is_chardevice(RIODesc *desc); 412 R_API bool r_io_desc_exchange(RIO *io, int fd, int fdx); //this should get 2 descs 413 R_API bool r_io_desc_is_dbg(RIODesc *desc); 414 R_API int r_io_desc_get_pid(RIODesc *desc); 415 R_API int r_io_desc_get_tid(RIODesc *desc); 416 R_API bool r_io_desc_get_base(RIODesc *desc, ut64 *base); 417 R_API int r_io_desc_read_at(RIODesc *desc, ut64 addr, ut8 *buf, int len); 418 R_API int r_io_desc_write_at(RIODesc *desc, ut64 addr, const ut8 *buf, int len); 419 420 /* lifecycle */ 421 R_IPI bool r_io_desc_init(RIO *io); 422 R_IPI bool r_io_desc_fini(RIO *io); 423 424 /* io/cache.c */ 425 R_API int r_io_cache_invalidate(RIO *io, ut64 from, ut64 to); 426 R_API bool r_io_cache_at(RIO *io, ut64 addr); 427 R_API void r_io_cache_commit(RIO *io, ut64 from, ut64 to); 428 R_API void r_io_cache_init(RIO *io); 429 R_API void r_io_cache_fini(RIO *io); 430 R_API bool r_io_cache_list(RIO *io, int rad); 431 R_API void r_io_cache_reset(RIO *io, int set); 432 R_API bool r_io_cache_write(RIO *io, ut64 addr, const ut8 *buf, int len); 433 R_API bool r_io_cache_read(RIO *io, ut64 addr, ut8 *buf, int len); 434 435 /* io/p_cache.c */ 436 R_API bool r_io_desc_cache_init(RIODesc *desc); 437 R_API int r_io_desc_cache_write(RIODesc *desc, ut64 paddr, const ut8 *buf, int len); 438 R_API int r_io_desc_cache_read(RIODesc *desc, ut64 paddr, ut8 *buf, int len); 439 R_API bool r_io_desc_cache_commit(RIODesc *desc); 440 R_API void r_io_desc_cache_cleanup(RIODesc *desc); 441 R_API void r_io_desc_cache_fini(RIODesc *desc); 442 R_API void r_io_desc_cache_fini_all(RIO *io); 443 R_API RList *r_io_desc_cache_list(RIODesc *desc); 444 R_API int r_io_desc_extend(RIODesc *desc, ut64 size); 445 446 /* io/buffer.c */ 447 R_API int r_io_buffer_read(RIO* io, ut64 addr, ut8* buf, int len); 448 R_API int r_io_buffer_load(RIO* io, ut64 addr, int len); 449 R_API void r_io_buffer_close(RIO* io); 450 451 /* io/fd.c */ 452 R_API int r_io_fd_open(RIO *io, const char *uri, int flags, int mode); 453 R_API bool r_io_fd_close(RIO *io, int fd); 454 R_API int r_io_fd_read(RIO *io, int fd, ut8 *buf, int len); 455 R_API int r_io_fd_write(RIO *io, int fd, const ut8 *buf, int len); 456 R_API ut64 r_io_fd_seek(RIO *io, int fd, ut64 addr, int whence); 457 R_API ut64 r_io_fd_size(RIO *io, int fd); 458 R_API bool r_io_fd_resize(RIO *io, int fd, ut64 newsize); 459 R_API bool r_io_fd_is_blockdevice(RIO *io, int fd); 460 R_API bool r_io_fd_is_chardevice(RIO *io, int fd); 461 R_API int r_io_fd_read_at(RIO *io, int fd, ut64 addr, ut8 *buf, int len); 462 R_API int r_io_fd_write_at(RIO *io, int fd, ut64 addr, const ut8 *buf, int len); 463 R_API bool r_io_fd_is_dbg(RIO *io, int fd); 464 R_API int r_io_fd_get_pid(RIO *io, int fd); 465 R_API int r_io_fd_get_tid(RIO *io, int fd); 466 R_API bool r_io_fd_get_base(RIO *io, int fd, ut64 *base); 467 R_API const char *r_io_fd_get_name(RIO *io, int fd); 468 R_API int r_io_fd_get_current(RIO *io); 469 R_API bool r_io_use_fd(RIO *io, int fd); 470 R_API int r_io_fd_get_next(RIO *io, int fd); 471 R_API int r_io_fd_get_prev(RIO *io, int fd); 472 R_API int r_io_fd_get_highest(RIO *io); 473 R_API int r_io_fd_get_lowest(RIO *io); 474 475 476 #define r_io_range_new() R_NEW0(RIORange) 477 #define r_io_range_free(x) free(x) 478 479 /* io/ioutils.c */ 480 R_API bool r_io_is_valid_offset(RIO *io, ut64 offset, int hasperm); 481 R_API bool r_io_addr_is_mapped(RIO *io, ut64 vaddr); 482 R_API bool r_io_read_i(RIO* io, ut64 addr, ut64 *val, int size, bool endian); 483 R_API bool r_io_write_i(RIO* io, ut64 addr, ut64 *val, int size, bool endian); 484 485 #if HAVE_PTRACE 486 R_API long r_io_ptrace(RIO *io, r_ptrace_request_t request, pid_t pid, void *addr, r_ptrace_data_t data); 487 R_API pid_t r_io_ptrace_fork(RIO *io, void (*child_callback)(void *), void *child_callback_user); 488 R_API void *r_io_ptrace_func(RIO *io, void *(*func)(void *), void *user); 489 #endif 490 491 extern RIOPlugin r_io_plugin_procpid; 492 extern RIOPlugin r_io_plugin_malloc; 493 extern RIOPlugin r_io_plugin_sparse; 494 extern RIOPlugin r_io_plugin_ptrace; 495 extern RIOPlugin r_io_plugin_w32dbg; 496 extern RIOPlugin r_io_plugin_windbg; 497 extern RIOPlugin r_io_plugin_mach; 498 extern RIOPlugin r_io_plugin_debug; 499 extern RIOPlugin r_io_plugin_shm; 500 extern RIOPlugin r_io_plugin_gdb; 501 extern RIOPlugin r_io_plugin_rap; 502 extern RIOPlugin r_io_plugin_http; 503 extern RIOPlugin r_io_plugin_bfdbg; 504 extern RIOPlugin r_io_plugin_w32; 505 extern RIOPlugin r_io_plugin_zip; 506 extern RIOPlugin r_io_plugin_mmap; 507 extern RIOPlugin r_io_plugin_default; 508 extern RIOPlugin r_io_plugin_ihex; 509 extern RIOPlugin r_io_plugin_self; 510 extern RIOPlugin r_io_plugin_gzip; 511 extern RIOPlugin r_io_plugin_winkd; 512 extern RIOPlugin r_io_plugin_r2pipe; 513 extern RIOPlugin r_io_plugin_r2web; 514 extern RIOPlugin r_io_plugin_qnx; 515 extern RIOPlugin r_io_plugin_r2k; 516 extern RIOPlugin r_io_plugin_tcp; 517 extern RIOPlugin r_io_plugin_bochs; 518 extern RIOPlugin r_io_plugin_null; 519 extern RIOPlugin r_io_plugin_ar; 520 extern RIOPlugin r_io_plugin_rbuf; 521 extern RIOPlugin r_io_plugin_winedbg; 522 extern RIOPlugin r_io_plugin_gprobe; 523 extern RIOPlugin r_io_plugin_fd; 524 525 #if __cplusplus 526 } 527 #endif 528 529 #endif 530