rizin/librz/include/rz_core.h
2026-04-10 15:46:11 +08:00

1456 lines
75 KiB
C

// SPDX-FileCopyrightText: 2009-2021 pancake <pancake@nopcode.org>
// SPDX-License-Identifier: LGPL-3.0-only
#ifndef RZ_CORE_H
#define RZ_CORE_H
#include <rz_main.h>
#include <rz_arch.h>
#include <rz_types.h>
#include <rz_magic.h>
#include <rz_agraph.h>
#include <rz_io.h>
#include <rz_lib.h>
#include <rz_diff.h>
#include <rz_egg.h>
#include <rz_lang.h>
#include <rz_asm.h>
#include <rz_parse.h>
#include <rz_analysis.h>
#include <rz_cmd.h>
#include <rz_cons.h>
#include <rz_search.h>
#include <rz_sign.h>
#include <rz_debug.h>
#include <rz_flag.h>
#include <rz_config.h>
#include <rz_bin.h>
#include <rz_hash.h>
#include <rz_util.h>
#include <rz_util/ht_uu.h>
#include <rz_util/rz_print.h>
#include <rz_crypto.h>
#include <rz_bind.h>
#include <rz_util/rz_annotated_code.h>
#include <rz_windows_heap.h>
#include <rz_mark.h>
#ifdef __cplusplus
extern "C" {
#endif
RZ_LIB_VERSION_HEADER(rz_core);
#define RZ_CORE_CMD_OK 0
#define RZ_CORE_CMD_INVALID -1
#define RZ_CORE_CMD_EXIT -2
#define RZ_CORE_BLOCKSIZE 0x100
#define RZ_CORE_BLOCKSIZE_MAX 0x3200000 /* 32MB */
#define RZ_FLAGS_FS_CLASSES "classes"
#define RZ_FLAGS_FS_FUNCTIONS "functions"
#define RZ_FLAGS_FS_IMPORTS "imports"
#define RZ_FLAGS_FS_RELOCS "relocs"
#define RZ_FLAGS_FS_REGISTERS "registers"
#define RZ_FLAGS_FS_RESOURCES "resources"
#define RZ_FLAGS_FS_SECTIONS "sections"
#define RZ_FLAGS_FS_SEGMENTS "segments"
#define RZ_FLAGS_FS_SIGNS "sign"
#define RZ_FLAGS_FS_STRINGS "strings"
#define RZ_FLAGS_FS_SYMBOLS "symbols"
#define RZ_FLAGS_FS_SYMBOLS_SECTIONS "symbols.sections"
#define RZ_FLAGS_FS_SYSCALLS "syscalls"
#define RZ_FLAGS_FS_MMIO_REGISTERS "registers.mmio"
#define RZ_FLAGS_FS_MMIO_REGISTERS_EXTENDED "registers.extended"
#define RZ_FLAGS_FS_PLATFORM_PORTS "platform.ports"
#define RZ_FLAGS_FS_GLOBALS "globals"
#define RZ_FLAGS_FS_DEBUG_MAPS "maps"
#define RZ_FLAGS_FS_POINTERS "pointers"
///
#define RZ_CONS_COLOR_DEF(x, def) ((core->cons && core->cons->context->pal.x) ? core->cons->context->pal.x : def)
#define RZ_CONS_COLOR(x) RZ_CONS_COLOR_DEF(x, "")
/* rtr */
#define RTR_PROTOCOL_RAP 0
#define RTR_PROTOCOL_TCP 1
#define RTR_PROTOCOL_UDP 2
#define RTR_PROTOCOL_HTTP 3
#define RTR_PROTOCOL_UNIX 4
#define RTR_MAX_HOSTS 255
typedef enum {
RZ_CORE_WRITE_OP_BYTESWAP2, ///< Swap the endianess of 2-bytes values
RZ_CORE_WRITE_OP_BYTESWAP4, ///< Swap the endianess of 4-bytes values
RZ_CORE_WRITE_OP_BYTESWAP8, ///< Swap the endianess of 8-bytes values
RZ_CORE_WRITE_OP_ADD, ///< Write the addition of existing byte and argument value
RZ_CORE_WRITE_OP_SUB, ///< Write the subtraction of existing byte and argument value
RZ_CORE_WRITE_OP_DIV, ///< Write the division of existing byte and argument value
RZ_CORE_WRITE_OP_MUL, ///< Write the multiplication of existing byte and argument value
RZ_CORE_WRITE_OP_AND, ///< Write the bitwise-and of existing byte and argument value
RZ_CORE_WRITE_OP_OR, ///< Write the bitwise-or of existing byte and argument value
RZ_CORE_WRITE_OP_XOR, ///< Write the bitwise-xor of existing byte and argument value
RZ_CORE_WRITE_OP_SHIFT_LEFT, ///< Write the shift left of existing byte by argument value
RZ_CORE_WRITE_OP_SHIFT_RIGHT, ///< Write the shift right of existing byte and argument value
} RzCoreWriteOp;
typedef bool (*RzCorePluginCallback)(RzCore *core);
typedef struct rz_core_plugin_t {
const char *name;
const char *desc;
const char *license;
const char *author;
const char *version;
RzCorePluginCallback init; ///< Is called when the plugin is loaded by rizin
RzCorePluginCallback fini; ///< Is called when the plugin is unloaded by rizin
RzCorePluginCallback analysis; ///< Is called when automatic analysis is performed.
} RzCorePlugin;
typedef struct rz_core_rtr_host_t RzCoreRtrHost;
typedef enum {
AUTOCOMPLETE_DEFAULT,
AUTOCOMPLETE_MS
} RAutocompleteType;
/**
* Represent an entry in the seek history.
* This is the "full state" of that point in time.
*/
typedef struct rz_core_seek_undo_t {
ut64 offset; ///< Value of core->offset at the given time in history
int cursor; ///< Position of the cursor at the given time in history
bool is_current; ///< True if this is the current seek value
int idx; ///< Position of the item relative to the current seek item (0 current seek, < 0 for undos, > 0 for redos)
} RzCoreSeekItem;
typedef struct rz_core_file_t {
struct rz_core_t *core;
int dbg;
int fd;
RzPVector /*<RzBinFile *>*/ binfiles; ///< all bin files that have been created for this core file
RzPVector /*<RzIODesc *>*/ extra_files; ///< additional files opened during mapping, for example for zeroed maps
RzPVector /*<RzIOMap *>*/ maps; ///< all maps that have been created as a result of loading this file
} RzCoreFile;
/**
* Data to be stored inside RzIOMap.user to track back to its origin
*/
typedef struct rz_core_io_map_info_t {
RzCoreFile *cf;
/**
* Original perms as specified for example by the RzBinMap.
*
* This may be different from the RzIOMap's perms because io will disable writing if the
* file has been opened read-only. If one needs the info whether a e.g. the segment causing
* this map is writeable, this is the place to look for.
* Used by rz-ghidra for example.
*/
int perm_orig;
} RzCoreIOMapInfo;
typedef struct rz_core_times_t {
ut64 loadlibs_init_time;
ut64 loadlibs_time;
ut64 file_open_time;
} RzCoreTimes;
#define RZ_CORE_ASMQJMPS_NUM 10
#define RZ_CORE_ASMQJMPS_LETTERS 26
#define RZ_CORE_ASMQJMPS_MAX_LETTERS (26 * 26 * 26 * 26 * 26)
#define RZ_CORE_ASMQJMPS_LEN_LETTERS 5
typedef enum rz_core_autocomplete_types_t {
RZ_CORE_AUTOCMPLT_DFLT = 0,
RZ_CORE_AUTOCMPLT_FLAG,
RZ_CORE_AUTOCMPLT_FLSP,
RZ_CORE_AUTOCMPLT_SEEK,
RZ_CORE_AUTOCMPLT_FCN,
RZ_CORE_AUTOCMPLT_EVAL,
RZ_CORE_AUTOCMPLT_MINS,
RZ_CORE_AUTOCMPLT_BRKP,
RZ_CORE_AUTOCMPLT_MACR,
RZ_CORE_AUTOCMPLT_FILE,
RZ_CORE_AUTOCMPLT_THME,
RZ_CORE_AUTOCMPLT_OPTN,
RZ_CORE_AUTOCMPLT_MS,
RZ_CORE_AUTOCMPLT_SDB,
// --- left as last always
RZ_CORE_AUTOCMPLT_END,
} RzCoreAutocompleteType;
typedef struct rz_core_autocomplete_t {
const char *cmd;
int length;
int n_subcmds;
bool locked;
int type;
struct rz_core_autocomplete_t **subcmds;
} RzCoreAutocomplete;
typedef struct {
int x;
int y;
int w;
int h;
char *cmd;
} RzCoreGadget;
/**
* \brief Options for controlling address description output.
*
* This structure contains flags that control how addresses are described
* and formatted. It can be passed to rz_core_addr_describe() and related
* functions to customize the output.
*/
typedef struct rz_core_addr_options_t {
bool show_offset; ///< Show the address offset if no name is found
bool prefer_function; ///< Prefer function names over flag names
bool show_flag; ///< Include flag names in the description
bool use_decimal; ///< Use decimal instead of hexadecimal for offsets
bool show_color; ///< Include color codes in the output
bool show_source_info; ///< Include source file/line information
bool use_realnames; ///< Use realnames for flags instead of names
st64 max_flag_delta; ///< Maximum delta from flag offset to show (0 = unlimited, negative = use default 8192)
bool use_spaces_around_delta; ///< Use spaces around +/- in delta format (e.g., "sym + 10" vs "sym+10")
} RzCoreAddrOptions;
/**
* \brief Description of an address with human-readable information
*
* This structure contains comprehensive information about an address,
* including its relation to functions, flags, and source code.
*/
typedef struct rz_core_addr_t {
ut64 addr; ///< The address being described
char *name; ///< Combined name (deprecated, use fcn_name or flag_name)
char *fcn_name; ///< Name of the function containing the address
ut64 fcn_addr; ///< Address of the function
st64 fcn_delta; ///< Delta from function start (addr - fcn_addr)
char *flag_name; ///< Name of the flag at or before the address
ut64 flag_offset; ///< Offset of the flag
st64 flag_delta; ///< Delta from flag (addr - flag_offset)
char *source_file; ///< Source file name (if debug info available)
ut32 source_line; ///< Source line number (0 if unknown)
ut32 source_column; ///< Source column number (0 if unknown)
} RzCoreAddr;
typedef struct rz_core_task_t RzCoreTask;
/**
* Scheduler-wide callback to switch any necessary context from cur to next.
*/
typedef void (*RzCoreTaskContextSwitch)(RzCoreTask *next, void *user);
/**
* Scheduler-wide callback for breaking a task.
*/
typedef void (*RzCoreTaskBreak)(RzCoreTask *task, void *user);
typedef struct rz_core_tasks_t {
RzCoreTaskContextSwitch ctx_switch;
void *ctx_switch_user;
RzCoreTaskBreak break_cb;
void *break_cb_user;
int task_id_next;
RzList /*<RzCoreTask *>*/ *tasks;
RzList /*<RzCoreTask *>*/ *tasks_queue;
RzList /*<OneShot *>*/ *oneshot_queue;
int oneshots_enqueued;
struct rz_core_task_t *current_task;
struct rz_core_task_t *main_task;
RzThreadLock *lock;
int tasks_running;
bool oneshot_running;
} RzCoreTaskScheduler;
/**
* Keep track of the seek history, by allowing undo/redo behaviour. Each seek
* is saved in the undos stack (unless cfg.seek.silent is set), so you can go
* back to where you previously were. Once an undo is done, the previously set
* address is put in the redos stack, so it is possible to go back and forth.
* Once a new seek is performed, all redos are lost.
*/
typedef struct rz_core_seek_history_t {
RzVector /*<RzCoreSeekItem>*/ undos; ///< Stack of RzCoreSeekItems, allowing to "go back in time"
RzVector /*<RzCoreSeekItem>*/ redos; ///< Stack of RzCoreSeekItems, allowing to re-do an action that was undone.
bool saved_set; ///< When true, the \p saved field is set
RzCoreSeekItem saved_item; ///< Position to save in history
} RzCoreSeekHistory;
struct rz_core_t {
RzAsm *rasm;
ut8 ptr_alignment_I;
RzAnalysis *analysis;
ut8 ptr_alignment_II;
RzBin *bin;
ut8 ptr_alignment_III;
// NOTE: Do not change the order of fields above!
// They are used in pointer passing hacks in rz_types.h.
RzIO *io;
HtSP /*<RzCorePlugin *>*/ *plugins; ///< List of registered core plugins
RzConfig *config;
HtSP /*<plugin_name: RzConfig>*/ *plugin_configs; ///< Pointers to plugin configurations. Indexed by plugin name
ut64 offset; // current seek
ut64 prompt_offset; // temporarily set to offset to have $$ in expressions always stay the same during temp seeks
ut32 blocksize;
ut32 blocksize_max;
ut8 *block;
RzBuffer *yank_buf;
ut64 yank_addr;
bool tmpseek;
bool vmode;
int interrupted; // XXX IS THIS DUPPED SOMEWHERE?
/* files */
RzCons *cons;
RzCoreFile *file;
RzList /*<RzCoreFile *>*/ *files;
RzNum *num;
ut64 rc; // command's return code .. related to num->value;
RzLib *lib;
RzCmd *rcmd;
RzCmdDescriptor root_cmd_descriptor;
RzList /*<RzCmdDescriptor *>*/ *cmd_descriptors;
/* ^^ */
RzCoreTimes *times;
RzParse *parser;
RzPrint *print;
RzLang *lang;
RzDebug *dbg;
RzFlag *flags;
RzMark *marks;
char *lastsearch; ///< Legacy search. Will be removed
RzSearch *search; ///< Legacy search. Will be removed
RzEgg *egg;
RzCrypto *crypto;
RzAGraph *graph;
char *cmdqueue;
char *lastcmd;
bool is_lastcmd;
bool is_pipe;
char *cmdlog;
int cmdrepeat; // cmd.repeat
const char *cmdtimes; // cmd.times
RZ_DEPRECATE bool cmd_in_backticks; // whether currently executing a cmd out of backticks
int rtr_n;
RzCoreRtrHost *rtr_host; // array of RzCoreRtrHost
ut64 *asmqjmps;
int asmqjmps_count;
int asmqjmps_size;
bool is_asmqjmps_letter;
bool keep_asmqjmps;
/* TODO: Remove this from RzCore */
void *visual; /* RzCoreVisual */
int http_up;
int gdbserver_up;
char *stkcmd;
bool in_search;
RzList /*<RzCoreCmpWatcher *>*/ *watchers;
RzList /*<char *>*/ *scriptstack;
RzCoreTaskScheduler tasks;
int max_cmd_depth;
ut8 switch_file_view;
Sdb *sdb;
int incomment;
/* TODO: Move this to RzCoreVisual instead */
int curtab; // current tab
int seltab; // selected tab
char *cmdremote;
char *cmdfilter;
char *curtheme;
bool break_loop;
bool binat;
bool fixedbits; // will be true when using @b:
bool fixedarch; // will be true when using @a:
bool fixedblock;
char *table_query;
struct rz_core_t *c2;
RzCoreAutocomplete *autocomplete;
int autocomplete_type;
int maxtab;
RzEvent *ev;
RzList /*<RzCoreGadget *>*/ *gadgets;
bool scr_gadgets;
bool log_events; // core.c:cb_event_handler : log actions from events if cfg.log.events is set
RzList /*<char *>*/ *ropchain;
RzCoreSeekHistory seek_history;
RzHash *hash;
RzList /*<char *>*/ *warnings_after;
RzPath *sys_path; ///< pointer to RzPath, contains path prefix of the system
bool vmarks_init;
ut64 vmarks[UT8_MAX + 1];
RzMainCallback rz_main_rizin;
// int (*rz_main_rizin)(int argc, char **argv);
int (*rz_main_rz_find)(int argc, const char **argv);
int (*rz_main_rz_diff)(int argc, const char **argv);
int (*rz_main_rz_bin)(int argc, const char **argv);
int (*rz_main_rz_run)(int argc, const char **argv);
int (*rz_main_rz_gg)(int argc, const char **argv);
int (*rz_main_rz_asm)(int argc, const char **argv);
int (*rz_main_rz_ax)(int argc, const char **argv);
};
// maybe move into RzAnalysis
typedef struct rz_core_item_t {
const char *type;
ut64 addr;
ut64 next;
ut64 prev;
int size;
int perm;
char *data;
char *comment;
char *sectname;
char *fcnname;
} RzCoreItem;
typedef int (*RzCoreSearchCallback)(RzCore *core, ut64 from, ut8 *buf, int len);
/**
* \brief Store some display name from RzBinSymbol
* \see rz_core_sym_name_init
* \see rz_core_sym_name_fini
*/
typedef struct rz_bin_sym_names_t {
const char *pfx; ///< prefix for flags
char *name; ///< raw symbol name
char *symbolname; ///< display symbol name
char *libname; ///< name of the lib this symbol is specific to, if any
char *nameflag; ///< flag name for symbol
char *demname; ///< demangled raw symbol name
char *demflag; ///< flag name for demangled symbol
char *classname; ///< classname
char *classflag; ///< flag for classname
char *methname; ///< methods [class]::[method]
char *methflag; ///< methods flag sym.[class].[method]
} RzBinSymNames;
/**
* \brief Message for `pdJ`
*/
typedef struct rz_analysis_disasm_text_t {
ut64 offset;
ut64 arrow; ///< In general, arrow = UT64_MAX, if there is a jump(jmp, ...), arrow = dst offset
char *text;
} RzAnalysisDisasmText;
#ifdef RZ_API
RZ_API int rz_core_bind(RzCore *core, RzCoreBind *bnd);
RZ_API void rz_core_notify_begin(RZ_NONNULL RzCore *core, RZ_NONNULL const char *format, ...) RZ_PRINTF_CHECK(2, 3);
RZ_API void rz_core_notify_done(RZ_NONNULL RzCore *core, RZ_NONNULL const char *format, ...) RZ_PRINTF_CHECK(2, 3);
RZ_API void rz_core_notify_error(RZ_NONNULL RzCore *core, RZ_NONNULL const char *format, ...) RZ_PRINTF_CHECK(2, 3);
RZ_API void rz_core_notify_begin_str(RZ_NONNULL RzCore *core, RZ_NONNULL const char *text);
RZ_API void rz_core_notify_done_str(RZ_NONNULL RzCore *core, RZ_NONNULL const char *text);
RZ_API void rz_core_notify_error_str(RZ_NONNULL RzCore *core, RZ_NONNULL const char *text);
RZ_API void rz_core_log_after(RZ_NONNULL RzCore *core, const char *funcname, const char *filename,
ut32 lineno, RzLogLevel level, const char *fmtstr, ...) RZ_PRINTF_CHECK(6, 7);
#define RZ_LOG_WARN_AFTER(core, fmtstr, ...) rz_core_log_after(core, MACRO_LOG_FUNC, __FILE__, \
__LINE__, RZ_LOGLVL_WARN, fmtstr, ##__VA_ARGS__);
RZ_API bool rz_core_plugin_init(RzCore *core);
RZ_API bool rz_core_plugin_add(RzCore *core, RZ_NONNULL RzCorePlugin *plugin);
RZ_API bool rz_core_plugin_del(RzCore *core, RZ_NONNULL RzCorePlugin *plugin);
RZ_API bool rz_core_plugin_fini(RzCore *core);
// #define rz_core_ncast(x) (RzCore*)(size_t)(x)
RZ_API RZ_OWN RzPVector /*<char *>*/ *rz_core_get_themes(RZ_NONNULL RzCore *core);
RZ_API char *rz_core_theme_get(RzCore *core);
RZ_API bool rz_core_theme_load(RzCore *core, const char *name);
RZ_API void rz_core_theme_nextpal(RzCore *core, RzConsPalSeekMode mode);
RZ_API RZ_OWN char *rz_core_get_section_name(RzCore *core, ut64 addr);
RZ_API RzCons *rz_core_get_cons(RzCore *core);
RZ_API RzBin *rz_core_get_bin(RzCore *core);
RZ_API RzConfig *rz_core_get_config(RzCore *core);
RZ_API bool rz_core_init(RzCore *core);
RZ_API void rz_core_bind_cons(RzCore *core); // to restore pointers in cons
RZ_API RzCore *rz_core_new(void);
RZ_API void rz_core_free(RzCore *core);
RZ_API void rz_core_fini(RzCore *c);
RZ_API void rz_core_wait(RzCore *core);
RZ_API RzCore *rz_core_ncast(ut64 p);
RZ_API RzCore *rz_core_cast(void *p);
RZ_API bool rz_core_bin_load_structs(RZ_NONNULL RzCore *core, RZ_NONNULL const char *file);
RZ_API int rz_core_config_init(RzCore *core);
RZ_API void rz_core_config_print_all(RzConfig *cfg, const char *str, RzCmdStateOutput *state);
RZ_API void rz_core_parse_rizinrc(RzCore *r);
RZ_API RZ_OWN RzList /*<char *>*/ *rz_core_config_in_space(RZ_NONNULL RzCore *core, RZ_NULLABLE const char *space);
RZ_API int rz_core_prompt(RzCore *core, int sync);
RZ_API int rz_core_prompt_exec(RzCore *core);
RZ_API void rz_core_prompt_loop(RzCore *core);
RZ_API ut64 rz_core_pava(RzCore *core, ut64 addr);
RZ_API int rz_core_cmd(RzCore *core, const char *cmd, int log);
RZ_API RzCmdStatus rz_core_cmd_rzshell(RzCore *core, const char *cmd, int log);
RZ_API RZ_OWN char *rz_core_editor(const RzCore *core, RZ_NULLABLE const char *file, RZ_NULLABLE const char *str);
RZ_API int rz_core_fgets(char *buf, int len, void *user);
RZ_API RzFlagItem *rz_core_flag_get_by_spaces(RzFlag *f, ut64 off);
RZ_API int rz_core_flush(RzCore *core, const char *cmd);
RZ_API void rz_core_cmd_init(RzCore *core);
RZ_API char *rz_core_cmd_str(RzCore *core, const char *cmd);
RZ_API ut8 *rz_core_cmd_raw(RzCore *core, const char *cmd, int *length);
RZ_API char *rz_core_cmd_strf(RzCore *core, const char *fmt, ...) RZ_PRINTF_CHECK(2, 3);
RZ_API char *rz_core_cmd_str_pipe(RzCore *core, const char *cmd);
RZ_API int rz_core_cmd_file(RzCore *core, const char *file);
RZ_API int rz_core_cmd_lines(RzCore *core, const char *lines);
RZ_API RzCmdStatus rz_core_cmd_lines_rzshell(RzCore *core, const char *lines);
RZ_API int rz_core_cmd_command(RzCore *core, const char *command);
RZ_API bool rz_core_run_script(RzCore *core, RZ_NONNULL const char *file);
RZ_API void rz_core_seek_item_free(RzCoreSeekItem *item);
RZ_API bool rz_core_seek(RzCore *core, ut64 addr, bool rb);
RZ_API bool rz_core_seek_and_save(RzCore *core, ut64 addr, bool rb);
RZ_API bool rz_core_seek_opt(RzCore *core, ut64 addr, bool read_block, bool save);
RZ_API bool rz_core_seek_mark(RzCore *core);
RZ_API bool rz_core_seek_save(RzCore *core);
RZ_API bool rz_core_seek_undo(RzCore *core);
RZ_API bool rz_core_seek_redo(RzCore *core);
RZ_API void rz_core_seek_reset(RzCore *core);
RZ_API void rz_core_seek_free(RzCore *core);
RZ_API RzList /*<RzCoreSeekItem *>*/ *rz_core_seek_list(RzCore *core);
RZ_API RzCoreSeekItem *rz_core_seek_peek(RzCore *core, int idx);
RZ_API int rz_core_seek_base(RzCore *core, const char *hex, bool save);
RZ_API bool rz_core_seek_prev(RzCore *core, const char *type, bool save);
RZ_API bool rz_core_seek_next(RzCore *core, const char *type, bool save);
RZ_API bool rz_core_seek_align(RzCore *core, ut64 align, bool save);
RZ_API bool rz_core_seek_delta(RzCore *core, st64 delta, bool save);
RZ_API bool rz_core_seek_analysis_bb(RzCore *core, ut64 addr, bool save);
RZ_API void rz_core_arch_bits_at(RzCore *core, ut64 addr, RZ_OUT RZ_NULLABLE int *bits, RZ_OUT RZ_BORROW RZ_NULLABLE const char **arch);
RZ_API void rz_core_seek_arch_bits(RzCore *core, ut64 addr);
RZ_API int rz_core_block_read(RzCore *core);
RZ_API bool rz_core_block_size(RzCore *core, ut32 bsize);
RZ_API int rz_core_is_valid_offset(RZ_NONNULL RzCore *core, ut64 offset);
RZ_API int rz_core_write_hexpair(RzCore *core, ut64 addr, const char *pairs);
RZ_API int rz_core_write_assembly(RzCore *core, ut64 addr, RZ_NONNULL const char *instructions);
RZ_API int rz_core_write_assembly_fill(RzCore *core, ut64 addr, RZ_NONNULL const char *instructions);
RZ_API bool rz_core_write_block(RzCore *core, ut64 addr, ut8 *data, size_t len);
RZ_API bool rz_core_write_seq_at(RzCore *core, ut64 addr, ut64 from, ut64 to, ut64 step, int value_size);
RZ_API bool rz_core_shift_block(RzCore *core, ut64 addr, ut64 b_size, st64 dist);
RZ_API RzLineNSCompletionResult *rz_core_autocomplete_rzshell(RzCore *core, RzLineBuffer *buf, RzLinePromptType prompt_type);
RZ_DEPRECATE RZ_API void rz_core_help_vars_print(RzCore *core);
RZ_API bool rz_core_prevop_addr(RzCore *core, ut64 start_addr, int numinstrs, RZ_OUT RZ_BORROW RZ_NONNULL ut64 *prev_addr);
RZ_API ut64 rz_core_prevop_addr_force(RzCore *core, ut64 start_addr, int numinstrs);
RZ_API RzBinReloc *rz_core_getreloc(RzCore *core, ut64 addr, int size);
RZ_API RzBinReloc *rz_core_get_reloc_to(RzCore *core, ut64 addr);
RZ_API ut64 rz_core_get_asmqjmps(RzCore *core, const char *str);
RZ_API void rz_core_set_asmqjmps(RzCore *core, char *str, size_t len, int i);
RZ_API char *rz_core_add_asmqjmp(RzCore *core, ut64 addr);
RZ_API void rz_core_analysis_type_init(RzCore *core);
RZ_API char *rz_core_analysis_hasrefs_to_depth(RzCore *core, ut64 value, PJ *pj, int depth);
RZ_API void rz_core_global_vars_propagate_types(RzCore *core, RzAnalysisFunction *fcn);
RZ_API bool rz_core_analysis_objc_refs(RzCore *core, bool auto_analysis);
RZ_API void rz_core_analysis_objc_stubs(RzCore *core);
RZ_API void rz_core_analysis_cc_init_by_path(RzCore *core, RZ_NULLABLE const char *path, RZ_NULLABLE const char *homepath);
RZ_API void rz_core_analysis_cc_init(RzCore *core);
RZ_API void rz_core_analysis_paths(RzCore *core, ut64 from, ut64 to, bool followCalls, int followDepth, bool is_json);
RZ_API RZ_OWN char *rz_core_types_as_c(RZ_NONNULL RzCore *core, RZ_NONNULL const char *name, bool multiline);
RZ_API RZ_OWN char *rz_core_types_as_c_all(RZ_NONNULL RzCore *core, bool multiline);
RZ_API bool rz_core_analysis_esil_trace_start(RzCore *core);
RZ_API bool rz_core_analysis_esil_trace_stop(RzCore *core);
RZ_API int rz_core_search_cb(RzCore *core, ut64 from, ut64 to, RzCoreSearchCallback cb);
RZ_API bool rz_core_file_reopen(RzCore *core, const char *args, int perm, int binload);
RZ_API void rz_core_file_reopen_in_malloc(RzCore *core);
RZ_API void rz_core_file_reopen_debug(RzCore *core, const char *args);
RZ_API void rz_core_file_reopen_remote_debug(RzCore *core, const char *uri, ut64 addr);
RZ_API bool rz_core_file_resize(RzCore *core, ut64 newsize);
RZ_API bool rz_core_file_resize_delta(RzCore *core, st64 delta);
RZ_API RzCoreFile *rz_core_file_find_by_fd(RzCore *core, ut64 fd);
RZ_API RzCoreFile *rz_core_file_find_by_name(RzCore *core, const char *name);
RZ_API RzCoreFile *rz_core_file_cur(RzCore *r);
RZ_API int rz_core_file_set_by_fd(RzCore *core, ut64 fd);
RZ_API int rz_core_file_set_by_name(RzCore *core, const char *name);
RZ_API int rz_core_file_set_by_file(RzCore *core, RzCoreFile *cf);
RZ_API int rz_core_setup_debugger(RzCore *r, const char *debugbackend, bool attach);
RZ_API bool rz_core_file_open_load(RZ_NONNULL RzCore *core, RZ_NONNULL const char *filepath, ut64 addr, int perms, bool write_mode);
RZ_API RZ_BORROW RzCoreFile *rz_core_file_open(RZ_NONNULL RzCore *core, RZ_NONNULL const char *file, int flags, ut64 loadaddr);
RZ_API RZ_BORROW RzCoreFile *rz_core_file_open_many(RZ_NONNULL RzCore *r, RZ_NULLABLE const char *file, int perm, ut64 loadaddr);
RZ_API bool rz_core_file_malloc_copy_chunk(RzCore *core, size_t len, ut64 offset);
RZ_API RzCoreFile *rz_core_file_get_by_fd(RzCore *core, int fd);
RZ_API void rz_core_file_close(RzCoreFile *fh);
RZ_API bool rz_core_file_close_fd(RzCore *core, int fd);
RZ_API bool rz_core_file_close_all_but(RzCore *core);
RZ_API bool rz_core_raw_file_print(RzCore *core);
RZ_API bool rz_core_file_print(RzCore *core, RzOutputMode mode);
RZ_API int rz_core_file_binlist(RzCore *core);
RZ_API bool rz_core_file_bin_raise(RzCore *core, ut32 num);
RZ_API void rz_core_io_file_open(RZ_NONNULL RzCore *core, int fd);
RZ_API void rz_core_io_file_reopen(RZ_NONNULL RzCore *core, int fd, int perms);
RZ_API bool rz_core_extend_at(RzCore *core, ut64 addr, ut64 size);
RZ_API bool rz_core_write_at(RzCore *core, ut64 addr, const ut8 *buf, int size);
RZ_API bool rz_core_write_value_at(RzCore *core, ut64 addr, ut64 value, int sz);
RZ_API bool rz_core_write_value_inc_at(RzCore *core, ut64 addr, st64 value, int sz);
RZ_API bool rz_core_write_string_at(RzCore *core, ut64 addr, RZ_NONNULL const char *s);
RZ_API bool rz_core_write_string_zero_at(RzCore *core, ut64 addr, const char *s);
RZ_API bool rz_core_write_string_wide_at(RzCore *core, ut64 addr, const char *s);
RZ_API bool rz_core_write_length_string_at(RzCore *core, ut64 addr, const char *s);
RZ_API bool rz_core_write_base64d_at(RzCore *core, ut64 addr, RZ_NONNULL const char *s);
RZ_API bool rz_core_write_base64_at(RzCore *core, ut64 addr, RZ_NONNULL const char *s);
RZ_API bool rz_core_write_random_at(RzCore *core, ut64 addr, size_t len);
RZ_API bool rz_core_write_block_op_at(RzCore *core, ut64 addr, RzCoreWriteOp op, RZ_NULLABLE ut8 *hex, size_t hexlen);
RZ_API bool rz_core_write_duplicate_at(RzCore *core, ut64 addr, ut64 from, int len);
RZ_API RZ_OWN ut8 *rz_core_transform_op(RzCore *core, ut64 addr, RzCoreWriteOp op, RZ_NULLABLE ut8 *hex, size_t hexlen, size_t *buflen);
RZ_API ut32 rz_core_file_cur_fd(RzCore *core);
RZ_API RzCmdStatus rz_core_io_cache_print(RzCore *core, RzCmdStateOutput *state);
RZ_API RzCmdStatus rz_core_io_pcache_print(RzCore *core, RzIODesc *desc, RzCmdStateOutput *state);
/* creg.c */
RZ_API RzReg *rz_core_reg_default(RzCore *core);
RZ_API ut64 rz_core_reg_getv_by_role_or_name(RzCore *core, const char *name);
RZ_API bool rz_core_reg_set_by_role_or_name(RzCore *core, const char *name, ut64 num);
RZ_API void rz_core_reg_update_flags(RzCore *core);
/* cdebug.c */
RZ_API bool rz_core_is_debug(RzCore *core);
RZ_API bool rz_core_debug_step_one(RzCore *core, int times);
RZ_API bool rz_core_debug_continue_until(RzCore *core, ut64 addr);
RZ_API void rz_core_debug_bp_add_noreturn_func(RzCore *core);
RZ_API void rz_core_debug_breakpoint_toggle(RZ_NONNULL RzCore *core, ut64 addr);
RZ_API void rz_core_debug_set_register_flags(RzCore *core);
RZ_API void rz_core_debug_clear_register_flags(RzCore *core);
RZ_API bool rz_core_debug_process_close(RzCore *core);
RZ_API bool rz_core_debug_step_until_frame(RzCore *core);
RZ_API bool rz_core_debug_step_back(RzCore *core, int steps);
RZ_API bool rz_core_debug_step_over(RzCore *core, int steps);
RZ_API bool rz_core_debug_step_skip(RzCore *core, int times);
RZ_API void rz_core_dbg_follow_seek_register(RzCore *core);
RZ_API RZ_OWN RzList /*<RzBacktrace *>*/ *rz_core_debug_backtraces(RzCore *core);
RZ_API void rz_backtrace_free(RZ_NULLABLE RzBacktrace *bt);
RZ_API RzCmdStatus rz_core_debug_plugins_print(RZ_NONNULL RZ_BORROW RzCore *core, RZ_OUT RzCmdStateOutput *state);
RZ_API void rz_core_debug_map_update_flags(RzCore *core);
RZ_API void rz_core_debug_map_print(RzCore *core, ut64 addr, RzCmdStateOutput *state);
/**
* \defgroup caddr Address Description API
* \brief Unified API for describing addresses in human-readable formats
*
* This API provides functions to generate human-readable descriptions of memory
* addresses, combining information from flags, functions, and debug symbols.
* It supports various output formats including name+offset notation (e.g., "main+0x10"),
* source file information, and JSON output.
*
* Example usage:
* \code
* char *desc = rz_core_addr_get_name_delta(core, 0x401010);
* // Returns "main+16" or "0x401010" if no symbol found
* rz_cons_printf("Address: %s\n", desc);
* free(desc);
* \endcode
*
*/
RZ_API RZ_OWN RzCoreAddrOptions *rz_core_addr_options_new(void);
RZ_API void rz_core_addr_options_free(RZ_NULLABLE RzCoreAddrOptions *opts);
RZ_API void rz_core_addr_free(RZ_NULLABLE RzCoreAddr *desc);
RZ_API RZ_OWN RzCoreAddr *rz_core_addr_describe(RZ_NONNULL RzCore *core, ut64 addr, RZ_NULLABLE const RzCoreAddrOptions *opts);
RZ_API RZ_OWN char *rz_core_addr_to_string(RZ_NONNULL const RzCoreAddr *desc, RZ_NULLABLE const RzCoreAddrOptions *opts);
RZ_API RZ_OWN char *rz_core_addr_describe_string(RZ_NONNULL RzCore *core, ut64 addr, RZ_NULLABLE const RzCoreAddrOptions *opts);
RZ_API RZ_OWN char *rz_core_addr_get_name_delta(RZ_NONNULL RzCore *core, ut64 addr);
RZ_API RZ_OWN RzCoreAddr *rz_core_addr_describe_with_function(RZ_NONNULL RzCore *core, ut64 addr);
RZ_API RZ_OWN RzCoreAddr *rz_core_addr_describe_with_source(RZ_NONNULL RzCore *core, ut64 addr);
RZ_API RZ_OWN char *rz_core_addr_format_for_display(RZ_NULLABLE RzPrint *print, ut64 addr, RZ_NULLABLE const RzCoreAddrOptions *opts);
RZ_API void rz_core_addr_to_pj(RZ_NONNULL PJ *pj, RZ_NONNULL const RzCoreAddr *desc, RZ_NULLABLE const RzCoreAddrOptions *opts);
RZ_API void rz_core_addr_describe_pj(RZ_NONNULL RzCore *core, RZ_NONNULL PJ *pj, ut64 addr, RZ_NULLABLE const RzCoreAddrOptions *opts);
RZ_API bool rz_core_addr_get_reloff_info(RZ_NONNULL RzCore *core, ut64 addr, bool prefer_function, bool use_flags, RZ_OUT RZ_NULLABLE char **out_name, RZ_OUT RZ_NULLABLE st64 *out_delta);
RZ_API RZ_OWN char *rz_core_addr_get_function_offset(RZ_NONNULL RzCore *core, ut64 addr);
RZ_API RZ_OWN char *rz_core_addr_get_flag_offset(RZ_NONNULL RzFlag *flags, ut64 addr);
RZ_API RZ_OWN char *rz_core_addr_get_flag_offset_prompt(RZ_NONNULL RzFlag *flags, ut64 addr);
/* chash.c */
RZ_API RzCmdStatus rz_core_hash_plugins_print(RZ_NONNULL RZ_BORROW RzHash *hash, RZ_OUT RzCmdStateOutput *state);
/* ccrypto.c */
RZ_API RzCmdStatus rz_core_crypto_plugins_print(RzCrypto *cry, RzCmdStateOutput *state);
/* cio.c */
RZ_API RzCmdStatus rz_core_io_plugins_print(RZ_NONNULL RZ_BORROW RzIO *io, RzCmdStateOutput *state);
/* cio.c */
RZ_API RzCmdStatus rz_core_parser_plugins_print(RzParse *parser, RzCmdStateOutput *state);
/* fortune */
RZ_API void rz_core_fortune_list_types(void);
RZ_API void rz_core_fortune_list(RzCore *core);
RZ_API RZ_OWN char *rz_core_fortune_get_random(RzCore *core);
RZ_API void rz_core_fortune_print_random(RzCore *core);
#define RZ_CORE_FOREIGN_ADDR -1
RZ_API RZ_OWN char *rz_core_yank_as_string(RzCore *core, ut64 pos);
RZ_API bool rz_core_yank(RzCore *core, ut64 addr, ut64 len);
RZ_API bool rz_core_yank_string(RzCore *core, ut64 addr, ut64 maxlen);
RZ_API bool rz_core_yank_hexpair(RzCore *core, const char *str);
RZ_API bool rz_core_yank_paste(RzCore *core, ut64 addr, ut64 len);
RZ_API bool rz_core_yank_set(RzCore *core, ut64 addr, RZ_NONNULL const ut8 *buf, ut64 len);
RZ_API bool rz_core_yank_set_str(RzCore *core, ut64 addr, RZ_NONNULL const char *str);
RZ_API bool rz_core_yank_to(RzCore *core, ut64 len, ut64 addr);
RZ_API bool rz_core_yank_dump(RzCore *core, ut64 pos, RzCmdStateOutput *state);
RZ_API bool rz_core_yank_print_hexdump(RzCore *core, ut64 pos);
RZ_API bool rz_core_yank_print(RzCore *core, ut64 pos);
RZ_API bool rz_core_yank_print_string(RzCore *core, ut64 pos);
RZ_API bool rz_core_yank_hud_file(RzCore *core, const char *input);
RZ_API bool rz_core_yank_hud_path(RzCore *core, const char *input, int dir);
RZ_API bool rz_core_yank_file(RzCore *core, ut64 len, ut64 addr, const char *filename);
RZ_API bool rz_core_yank_file_all(RzCore *core, const char *filename);
#define RZ_CORE_LOADLIBS_ENV (1 << 0)
#define RZ_CORE_LOADLIBS_HOME (1 << 1)
#define RZ_CORE_LOADLIBS_SYSTEM (1 << 2)
#define RZ_CORE_LOADLIBS_CONFIG (1 << 3)
#define RZ_CORE_LOADLIBS_EXTRA (1 << 4)
#define RZ_CORE_LOADLIBS_ALL UT32_MAX
RZ_API void rz_core_loadlibs_init(RzCore *core);
RZ_API int rz_core_loadlibs(RzCore *core, int where);
RZ_API RzCmd *rz_core_cmd_new(RzCore *core, bool has_cons);
RZ_API int rz_core_cmd_buffer(RzCore *core, const char *buf);
RZ_API int rz_core_cmdf(RzCore *core, const char *fmt, ...) RZ_PRINTF_CHECK(2, 3);
RZ_API int rz_core_cmd0(RzCore *core, const char *cmd);
RZ_API RzCmdStatus rz_core_cmd0_rzshell(RzCore *core, const char *cmd);
RZ_API char *rz_core_op_str(RzCore *core, ut64 addr);
RZ_API RzAnalysisOp *rz_core_op_analysis(RzCore *core, ut64 addr, RzAnalysisOpMask mask);
RZ_API char *rz_core_disassemble_instr(RzCore *core, ut64 addr, int l);
RZ_API char *rz_core_disassemble_bytes(RzCore *core, ut64 addr, int b);
/* carg.c */
RZ_DEPRECATE RZ_API ut64 rz_core_arg_get(RzCore *core, const char *cc, int num);
RZ_API RZ_OWN RzList /*<RzAnalysisFuncArg *>*/ *rz_core_get_func_args(RzCore *core, const char *func_name);
RZ_API void rz_core_print_func_args(RzCore *core);
/* clang.c */
RZ_API RzCmdStatus rz_core_lang_plugins_print(RzLang *lang, RzCmdStateOutput *state);
/* ccore.c */
RZ_API RzCmdStatus rz_core_core_plugins_print(RzCore *core, RzCmdStateOutput *state);
/* cil.c */
RZ_API void rz_core_analysis_esil(RzCore *core, ut64 addr, ut64 size, RZ_NULLABLE RzAnalysisFunction *fcn);
RZ_API bool rz_core_esil_cmd(RzAnalysisEsil *esil, const char *cmd, ut64 a1, ut64 a2);
RZ_API int rz_core_esil_step(RzCore *core, ut64 until_addr, const char *until_expr, ut64 *prev_addr, bool stepOver);
RZ_API int rz_core_esil_step_back(RzCore *core);
RZ_API bool rz_core_esil_dumpstack(RzAnalysisEsil *esil);
RZ_API bool rz_core_esil_continue_back(RZ_NONNULL RzCore *core);
RZ_API void rz_core_analysis_esil_step_over(RZ_NONNULL RzCore *core);
RZ_API void rz_core_analysis_esil_reinit(RZ_NONNULL RzCore *core);
RZ_API void rz_core_analysis_esil_deinit(RZ_NONNULL RzCore *core);
RZ_API void rz_core_analysis_esil_init_mem(RZ_NONNULL RzCore *core, RZ_NULLABLE const char *name, ut64 addr, ut32 size);
RZ_API void rz_core_analysis_esil_init_mem_del(RZ_NONNULL RzCore *core, RZ_NULLABLE const char *name, ut64 addr, ut32 size);
RZ_API void rz_core_analysis_esil_init_regs(RZ_NONNULL RzCore *core);
RZ_API void rz_core_analysis_il_reinit(RZ_NONNULL RzCore *core);
RZ_API bool rz_core_il_step(RZ_NONNULL RzCore *core, ut64 n);
RZ_API bool rz_core_il_step_until(RZ_NONNULL RzCore *core, ut64 until);
RZ_API bool rz_core_il_step_until_with_events(RZ_NONNULL RzCore *core, ut64 until);
/* canalysis.c */
typedef enum rz_core_analysis_name_type {
RZ_CORE_ANALYSIS_NAME_TYPE_VAR = 0,
RZ_CORE_ANALYSIS_NAME_TYPE_FUNCTION,
RZ_CORE_ANALYSIS_NAME_TYPE_FLAG,
RZ_CORE_ANALYSIS_NAME_TYPE_ADDRESS,
} RzCoreAnalysisNameType;
typedef struct rz_core_analysis_name_t {
char *name;
char *realname;
RzCoreAnalysisNameType type;
ut64 offset;
} RzCoreAnalysisName;
/**
* Defines the level of analysis performed by
* `rz_core_perform_auto_analysis`
* */
typedef enum {
RZ_CORE_ANALYSIS_SIMPLE, ///< aa
RZ_CORE_ANALYSIS_DEEP, ///< aaa
RZ_CORE_ANALYSIS_EXPERIMENTAL, ///< aaaa
} RzCoreAnalysisType;
RZ_DEPRECATE RZ_API bool rz_core_set_endianness(RZ_NONNULL RzCore *core, bool big_endian);
RZ_DEPRECATE RZ_API bool rz_core_arch_configure(RZ_NONNULL RzCore *core, RZ_NULLABLE const char *arch, int bits, RZ_NULLABLE const char *cpu, RZ_NULLABLE const char *os, RZ_NULLABLE const char *platform);
RZ_API RzAnalysisOp *rz_core_analysis_op(RzCore *core, ut64 addr, int mask);
RZ_API void rz_core_analysis_fcn_merge(RzCore *core, ut64 addr, ut64 addr2);
RZ_API const char *rz_core_analysis_optype_colorfor(RzCore *core, ut64 addr, bool verbose);
RZ_API ut64 rz_core_analysis_address(RzCore *core, ut64 addr);
RZ_API void rz_core_analysis_undefine(RzCore *core, ut64 off);
RZ_API void rz_core_analysis_hint_print(RzAnalysis *a, ut64 addr, RzCmdStateOutput *state);
RZ_API void rz_core_analysis_hint_list_print(RzAnalysis *a, RzCmdStateOutput *state);
RZ_API int rz_core_analysis_search(RzCore *core, ut64 from, ut64 to, ut64 ref, int mode);
RZ_API int rz_core_analysis_search_xrefs(RZ_NONNULL RzCore *core, ut64 from, ut64 to);
RZ_API void rz_core_analysis_data(RZ_NONNULL RzCore *core, ut64 addr, ut32 count, ut32 depth, ut32 wordsize);
RZ_API void rz_core_analysis_resolve_jumps(RZ_NONNULL RzCore *core);
RZ_API bool rz_core_analysis_refs(RZ_NONNULL RzCore *core, size_t nbytes);
RZ_API void rz_core_analysis_flag_every_function(RzCore *core);
RZ_API bool rz_core_analysis_function_rename(RzCore *core, ut64 addr, const char *_name);
RZ_API bool rz_core_analysis_function_add(RzCore *core, const char *name, ut64 addr, bool analyze_recursively);
RZ_API int rz_core_analysis_fcn(RzCore *core, ut64 at, ut64 from, int reftype, int depth);
RZ_API RZ_OWN char *rz_core_analysis_function_autoname(RZ_NONNULL RzCore *core, RZ_NONNULL RzAnalysisFunction *fcn);
RZ_API void rz_core_analysis_function_strings_print(RZ_NONNULL RzCore *core, RZ_NONNULL RzAnalysisFunction *fcn, RZ_NULLABLE PJ *pj);
RZ_API void rz_core_analysis_autoname_all_fcns(RzCore *core);
RZ_API bool rz_core_analysis_recover_golang_functions(RzCore *core);
RZ_API void rz_core_analysis_resolve_golang_strings(RzCore *core);
RZ_API int rz_core_analysis_fcn_clean(RzCore *core, ut64 addr);
RZ_API RzList /*<RzAnalysisBlock *>*/ *rz_core_analysis_graph_to(RzCore *core, ut64 addr, int n);
RZ_API int rz_core_analysis_all(RzCore *core);
RZ_API bool rz_core_analysis_everything(RzCore *core, bool experimental, char *dh_orig);
RZ_API RZ_OWN RzList /*<RzSigDBEntry *>*/ *rz_core_analysis_sigdb_list(RZ_NONNULL RzCore *core, bool with_details);
RZ_API bool rz_core_analysis_sigdb_apply(RZ_NONNULL RzCore *core, RZ_NULLABLE int *n_applied, RZ_NULLABLE const char *filter);
RZ_API void rz_core_analysis_sigdb_print(RZ_NONNULL RzCore *core, RZ_NONNULL RzTable *table);
RZ_API RzList /*<RzAnalysisCycleHook *>*/ *rz_core_analysis_cycles(RzCore *core, int ccl);
RZ_API RZ_OWN RzList /*<RzAnalysisXRef *>*/ *rz_core_analysis_fcn_get_calls(RzCore *core, RzAnalysisFunction *fcn); // get all calls from a function
RZ_API void rz_core_analysis_calls(RZ_NONNULL RzCore *core, bool imports_only);
RZ_API int rz_core_get_stacksz(RzCore *core, ut64 from, ut64 to);
RZ_API bool rz_core_analysis_hint_set_offset(RZ_NONNULL RzCore *core, RZ_NONNULL const char *struct_member);
RZ_API bool rz_core_analysis_continue_until_syscall(RZ_NONNULL RzCore *core);
RZ_API bool rz_core_analysis_continue_until_call(RZ_NONNULL RzCore *core);
RZ_API bool rz_core_is_debugging(RZ_NONNULL RzCore *core);
RZ_API void rz_core_perform_auto_analysis(RZ_NONNULL RzCore *core, RzCoreAnalysisType type);
RZ_API size_t rz_core_analysis_coverage_count(RZ_NONNULL RzCore *core);
RZ_API size_t rz_core_analysis_code_count(RZ_NONNULL RzCore *core);
RZ_API size_t rz_core_analysis_calls_count(RZ_NONNULL RzCore *core);
RZ_API RZ_BORROW const char *rz_core_analysis_name_type_to_str(RzCoreAnalysisNameType typ);
RZ_API void rz_core_analysis_name_free(RZ_NULLABLE RzCoreAnalysisName *p);
RZ_API RZ_OWN RzCoreAnalysisName *rz_core_analysis_name(RZ_NONNULL RzCore *core, ut64 addr);
RZ_API bool rz_core_analysis_rename(RZ_NONNULL RzCore *core, RZ_NONNULL const char *name, ut64 addr);
/**
* Save useful infomation when analyze and disassemble bytes
* \see rz_core_analysis_bytes
*/
typedef struct rz_core_decoded_bytes_t {
RzAnalysisOp an_op;
RzAsmOp as_op;
RzAnalysisHint *hint;
char *opcode;
char *disasm;
char *pseudo;
char *mnemonic;
char *description;
char *mask;
char *bytes;
int oplen;
} RzCoreDecodedBytes;
RZ_API RZ_OWN RzIterator *rz_core_analysis_bytes(RZ_NONNULL RzCore *core, ut64 start_addr, RZ_NONNULL const ut8 *buf, ut64 n_bytes, ut64 max_ops);
RZ_API RZ_OWN RzIterator *rz_core_analysis_op_chunk_iter(RZ_NONNULL RzCore *core, ut64 start_addr, ut64 n_bytes, ut64 max_ops, RzAnalysisOpMask mask);
RZ_API RZ_OWN RzIterator *rz_core_analysis_op_function_iter(RZ_NONNULL RzCore *core, RZ_NONNULL RZ_BORROW RzAnalysisFunction *fcn, RzAnalysisOpMask mask);
RZ_API ut64 rz_core_analysis_ops_size(RZ_NONNULL RzCore *core, ut64 start_addr, RZ_NONNULL const ut8 *buf, ut64 len, ut64 nops);
/* cgraph.c */
/**
* \brief RzGraph format for print/convert
*/
typedef enum {
RZ_CORE_GRAPH_FORMAT_VISUAL = 0,
RZ_CORE_GRAPH_FORMAT_SDB,
RZ_CORE_GRAPH_FORMAT_GML,
RZ_CORE_GRAPH_FORMAT_DOT,
RZ_CORE_GRAPH_FORMAT_JSON,
RZ_CORE_GRAPH_FORMAT_JSON_DISASM,
RZ_CORE_GRAPH_FORMAT_CMD,
RZ_CORE_GRAPH_FORMAT_ASCII_ART,
RZ_CORE_GRAPH_FORMAT_UNK,
} RzCoreGraphFormat;
/**
* \brief RzGraph type
*/
typedef enum {
RZ_CORE_GRAPH_TYPE_DATAREF = 0, ///< Data reference graph
RZ_CORE_GRAPH_TYPE_FUNCALL, ///< Function callgraph
RZ_CORE_GRAPH_TYPE_DIFF, ///< Diff graph
RZ_CORE_GRAPH_TYPE_BLOCK_FUN, ///< Basic blocks function graph
RZ_CORE_GRAPH_TYPE_IMPORT, ///< Imports graph
RZ_CORE_GRAPH_TYPE_REF, ///< References graph
RZ_CORE_GRAPH_TYPE_LINE, ///< Line graph
RZ_CORE_GRAPH_TYPE_XREF, ///< Cross-references graph
RZ_CORE_GRAPH_TYPE_CUSTOM, ///< Custom graph
RZ_CORE_GRAPH_TYPE_NORMAL, ///< Normal graph
RZ_CORE_GRAPH_TYPE_IL, ///< RzIL graph
RZ_CORE_GRAPH_TYPE_ICFG, ///< Inter-procedual control flow graph
RZ_CORE_GRAPH_TYPE_CFG, ///< control flow graph (without calls)
RZ_CORE_GRAPH_TYPE_UNK ///< Unknown graph
} RzCoreGraphType;
RZ_API RZ_OWN RzGraph /*<RzGraphNodeInfo *, None *>*/ *rz_core_graph_datarefs(RZ_NONNULL RzCore *core, ut64 addr);
RZ_API RZ_OWN RzGraph /*<RzGraphNodeInfo *, None *>*/ *rz_core_graph_coderefs(RZ_NONNULL RzCore *core, ut64 addr);
RZ_API RZ_OWN RzGraph /*<RzGraphNodeInfo *, None *>*/ *rz_core_graph_codexrefs(RZ_NONNULL RzCore *core, ut64 addr);
RZ_API RZ_OWN RzGraph /*<RzGraphNodeInfo *, None *>*/ *rz_core_graph_importxrefs(RZ_NONNULL RzCore *core);
RZ_API RZ_OWN RzGraph /*<RzGraphNodeInfo *, None *>*/ *rz_core_graph_callgraph(RZ_NONNULL RzCore *core, ut64 addr);
RZ_API RZ_OWN RzGraph /*<RzGraphNodeInfo *, None *>*/ *rz_core_graph_function(RzCore *core, ut64 addr);
RZ_API RZ_OWN RzGraph /*<RzGraphNodeInfo *, None *>*/ *rz_core_graph_line(RzCore *core, ut64 addr);
RZ_API RZ_OWN RzGraph /*<RzGraphNodeInfo *, None *>*/ *rz_core_graph_il(RZ_NONNULL RzCore *core, ut64 addr);
RZ_API RZ_OWN RzGraph /*<RzGraphNodeInfo *, None *>*/ *rz_core_graph(RzCore *core, RzCoreGraphType type, ut64 addr);
RZ_API RZ_OWN RzGraph /*<RzGraphNodeInfo *, None *>*/ *rz_core_graph_icfg(RZ_NONNULL RzCore *core);
RZ_API RZ_OWN RzGraph /*<RzGraphNodeInfo *, None *>*/ *rz_core_graph_cfg(RZ_NONNULL RzCore *core, ut64 addr);
RZ_API RzCoreGraphFormat rz_core_graph_format_from_string(RZ_NULLABLE const char *x);
RZ_API RzCoreGraphType rz_core_graph_type_from_string(RZ_NULLABLE const char *x);
RZ_API bool rz_core_graph_write_graph(RZ_NONNULL RzCore *core, RZ_NONNULL RzGraph /*<RzGraphNodeInfo *, None *>*/ *graph, RZ_NONNULL const char *filename);
RZ_API bool rz_core_graph_write(RZ_NONNULL RzCore *core, ut64 addr, RzCoreGraphType type, RZ_NONNULL const char *path);
RZ_API RZ_OWN char *rz_core_graph_to_dot_str(RZ_NONNULL RzCore *core, RZ_NONNULL RzGraph /*<RzGraphNodeInfo *, None *>*/ *graph);
RZ_API RZ_OWN char *rz_core_graph_to_sdb_str(RZ_NONNULL RzCore *core, RZ_NONNULL RzGraph /*<RzGraphNodeInfo *, None *>*/ *graph);
/*tp.c*/
RZ_API void rz_core_analysis_type_match(RzCore *core, RzAnalysisFunction *fcn, HtUU *addr_loop_table);
/* asm.c */
#define RZ_MIDFLAGS_HIDE 0
#define RZ_MIDFLAGS_SHOW 1
#define RZ_MIDFLAGS_REALIGN 2
#define RZ_MIDFLAGS_SYMALIGN 3
typedef struct rz_core_asm_hit {
char *code;
int len;
ut64 addr;
ut8 valid;
} RzCoreAsmHit;
/**
* \brief Disassemble Options, just for rz_core_print_disasm
*/
typedef struct rz_core_disasm_options {
int invbreak;
int cbytes; ///< set false to ignore the constraint of \p len and print \p nlines instructions in rz_core_print_disasm
RzAnalysisFunction *function; ///< Disassemble a function
RzPVector /*<RzAnalysisDisasmText *>*/ *vec; ///< Not print, but append as RzPVector<RzAnalysisDisasmText>
} RzCoreDisasmOptions;
#define RZ_CORE_MAX_DISASM (1024 * 1024 * 8)
RZ_API RzBuffer *rz_core_syscall(RzCore *core, const char *name, const char *args);
RZ_API RzBuffer *rz_core_syscallf(RzCore *core, const char *name, const char *fmt, ...) RZ_PRINTF_CHECK(3, 4);
RZ_API RzCoreAsmHit *rz_core_asm_hit_new(void);
RZ_API RzList /*<RzCoreAsmHit *>*/ *rz_core_asm_hit_list_new(void);
RZ_API void rz_core_asm_hit_free(void *_hit);
RZ_API char *rz_core_asm_search(RzCore *core, const char *input);
RZ_API RzCmdStatus rz_core_asm_plugins_print(RZ_NONNULL RZ_BORROW RzCore *core, RZ_OUT RzCmdStateOutput *state, RZ_NULLABLE const char *flags);
RZ_API RzCmdStatus rz_core_asm_cpu_plugin_print(RZ_NONNULL RZ_BORROW RzCore *core, RZ_OUT RzCmdStateOutput *state, RZ_NULLABLE const char *arch_name);
RZ_API RzCmdStatus rz_core_cpu_descs_print(RZ_NONNULL RzCore *core, RZ_NONNULL const char *plugin);
RZ_API RzList /*<RzCoreAsmHit *>*/ *rz_core_asm_strsearch(RzCore *core, const char *input, ut64 from, ut64 to, int maxhits, int regexp, int everyByte, int mode);
RZ_API RzList /*<RzCoreAsmHit *>*/ *rz_core_asm_bwdisassemble(RzCore *core, ut64 addr, int n, int len);
RZ_API RzList /*<RzCoreAsmHit *>*/ *rz_core_asm_back_disassemble_instr(RzCore *core, ut64 addr, int len, ut32 hit_count, ut32 extra_padding);
RZ_API RzList /*<RzCoreAsmHit *>*/ *rz_core_asm_back_disassemble_byte(RzCore *core, ut64 addr, int len, ut32 hit_count, ut32 extra_padding);
RZ_API ut32 rz_core_asm_bwdis_len(RzCore *core, int *len, ut64 *start_addr, ut32 l);
RZ_API int rz_core_print_disasm(RZ_NONNULL RzCore *core, ut64 addr, RZ_NONNULL ut8 *buf, int len, int nlines, RZ_NULLABLE RzCmdStateOutput *state, RZ_NULLABLE RzCoreDisasmOptions *options);
RZ_API int rz_core_print_disasm_json(RzCore *core, ut64 addr, ut8 *buf, int len, int lines, PJ *pj);
RZ_API int rz_core_print_disasm_instructions_with_buf(RzCore *core, ut64 address, ut8 *buf, int nb_bytes, int nb_opcodes);
RZ_API int rz_core_print_disasm_instructions(RzCore *core, int nb_bytes, int nb_opcodes);
RZ_API int rz_core_disasm_pdi_with_buf(RzCore *core, ut64 address, ut8 *buf, ut32 nb_opcodes, ut32 nb_bytes, int fmt);
RZ_API int rz_core_disasm_pdi(RzCore *core, int nb_opcodes, int nb_bytes, int fmt);
RZ_API int rz_core_disasm_pde(RzCore *core, int nb_opcodes, RzCmdStateOutput *state);
RZ_API RZ_OWN char *rz_core_disasm_instruction(RzCore *core, ut64 addr, ut64 reladdr, RZ_NULLABLE RzAnalysisFunction *fcn, bool color);
RZ_API bool rz_core_print_function_disasm_json(RzCore *core, RzAnalysisFunction *fcn, PJ *pj);
RZ_API int rz_core_flag_in_middle(RzCore *core, ut64 at, int oplen, int *midflags);
RZ_API int rz_core_bb_starts_in_middle(RzCore *core, ut64 at, int oplen);
RZ_API void rz_analysis_disasm_text_free(RzAnalysisDisasmText *t);
RZ_API RZ_OWN char *rz_core_get_xref_comment(RZ_NONNULL RzCore *core, ut64 addr);
/**
* \brief Use RzAsmOp if it is sufficient
*/
typedef struct {
ut64 offset;
ut64 size;
char *hex;
char *assembly;
char *assembly_colored;
} RzCoreDisasmOp;
RZ_API void rz_core_disasm_op_free(RzCoreDisasmOp *x);
RZ_API RZ_OWN RzPVector /*<RzCoreDisasmOp *>*/ *rz_core_disasm_all_possible_opcodes(RZ_NONNULL RzCore *core, RZ_NONNULL ut8 *buffer, ut64 addr, ut64 n_bytes);
/* cbin.c */
RZ_API bool rz_core_bin_raise(RzCore *core, ut32 bfid);
RZ_API bool rz_core_bin_set_cur(RZ_NONNULL RzCore *core, RZ_NULLABLE RzBinFile *binfile);
RZ_API RZ_BORROW const char *rz_core_bin_get_compile_time(RZ_NONNULL RzBinFile *bf);
RZ_API void rz_core_bin_options_init(RzCore *core, RZ_OUT RzBinOptions *opts, int fd, ut64 baseaddr, ut64 loadaddr);
RZ_API bool rz_core_bin_apply_strings(RzCore *r, RzBinFile *binfile);
RZ_API bool rz_core_bin_apply_config(RzCore *r, RzBinFile *binfile);
RZ_API bool rz_core_bin_apply_maps(RzCore *core, RzBinFile *binfile, bool va);
RZ_API bool rz_core_bin_apply_main(RzCore *r, RzBinFile *binfile, bool va);
RZ_API bool rz_core_bin_apply_dwarf(RzCore *core, RzBinFile *binfile);
RZ_API bool rz_core_bin_apply_entry(RzCore *core, RzBinFile *binfile, bool va);
RZ_API bool rz_core_bin_apply_sections(RzCore *core, RzBinFile *binfile, bool va);
RZ_API bool rz_core_bin_apply_relocs(RzCore *core, RzBinFile *binfile, bool va);
RZ_API bool rz_core_bin_apply_imports(RzCore *core, RzBinFile *binfile, bool va);
RZ_API bool rz_core_bin_apply_symbols(RzCore *core, RzBinFile *binfile, bool va);
RZ_API bool rz_core_bin_apply_classes(RzCore *core, RzBinFile *binfile);
RZ_API bool rz_core_bin_apply_resources(RzCore *core, RzBinFile *binfile);
RZ_API bool rz_core_bin_apply_info(RzCore *r, RzBinFile *binfile, ut32 mask);
RZ_API bool rz_core_bin_apply_all_info(RzCore *r, RzBinFile *binfile);
RZ_API int rz_core_bin_set_by_fd(RzCore *core, ut64 bin_fd);
RZ_API int rz_core_bin_set_by_name(RzCore *core, const char *name);
RZ_API bool rz_core_bin_load(RZ_NONNULL RzCore *core, RZ_NULLABLE const char *file_uri, ut64 base_addr);
RZ_API void rz_core_bin_set_export_info(RZ_NONNULL RzCore *core);
RZ_API bool rz_core_binfiles_print(RzCore *core, RzCmdStateOutput *state);
RZ_API bool rz_core_binfiles_delete(RzCore *core, RzBinFile *bf);
RZ_API RZ_OWN HtSS *rz_core_bin_create_digests(RzCore *core, ut64 paddr, ut64 size, RzList /*<char *>*/ *digests);
RZ_API void rz_core_bin_print_source_line_sample(RzCore *core, const RzBinSourceLineSample *s, RzCmdStateOutput *state);
RZ_API void rz_core_bin_print_source_line_info(RzCore *core, const RzBinSourceLineInfo *li, RzCmdStateOutput *state);
RZ_API bool rz_core_sym_is_export(RZ_NONNULL RzBinSymbol *s);
RZ_API void rz_core_sysenv_begin(RzCore *core);
RZ_API void rz_core_sysenv_end(RzCore *core);
RZ_API void rz_core_recover_vars(RzCore *core, RzAnalysisFunction *fcn, bool argonly);
/* cmd_windows_heap.c */
RZ_API RZ_OWN RzList /*<RzWindowsHeapEntry *>*/ *rz_core_heap_windows_blocks_list(RzCore *core);
// XXX dupe from rz_bin.h
/* bin.c */
#define RZ_CORE_BIN_ACC_STRINGS 0x001
#define RZ_CORE_BIN_ACC_INFO 0x002
#define RZ_CORE_BIN_ACC_MAIN 0x004
#define RZ_CORE_BIN_ACC_ENTRIES 0x008
#define RZ_CORE_BIN_ACC_RELOCS 0x010
#define RZ_CORE_BIN_ACC_IMPORTS 0x020
#define RZ_CORE_BIN_ACC_SYMBOLS 0x040
#define RZ_CORE_BIN_ACC_SECTIONS 0x080
#define RZ_CORE_BIN_ACC_FIELDS 0x100
#define RZ_CORE_BIN_ACC_LIBS 0x200
#define RZ_CORE_BIN_ACC_CLASSES 0x400
#define RZ_CORE_BIN_ACC_DWARF 0x800
#define RZ_CORE_BIN_ACC_SIZE 0x1000
#define RZ_CORE_BIN_ACC_PDB 0x2000
#define RZ_CORE_BIN_ACC_MEM 0x4000
#define RZ_CORE_BIN_ACC_EXPORTS 0x8000
#define RZ_CORE_BIN_ACC_VERSIONINFO 0x10000
#define RZ_CORE_BIN_ACC_SIGNATURE 0x20000
#define RZ_CORE_BIN_ACC_RAW_STRINGS 0x40000
#define RZ_CORE_BIN_ACC_HEADER 0x80000
#define RZ_CORE_BIN_ACC_RESOURCES 0x100000
#define RZ_CORE_BIN_ACC_INITFINI 0x200000
#define RZ_CORE_BIN_ACC_SEGMENTS 0x400000
#define RZ_CORE_BIN_ACC_BASEFIND 0x800000
#define RZ_CORE_BIN_ACC_LUAC_DEBUG 0x1000000
#define RZ_CORE_BIN_ACC_TRYCATCH 0x20000000
#define RZ_CORE_BIN_ACC_SECTIONS_MAPPING 0x40000000
#define RZ_CORE_BIN_ACC_MAPS 0x80000000
#define RZ_CORE_BIN_ACC_ALL 0x81504FFF
#define RZ_CORE_PRJ_FLAGS 0x0001
#define RZ_CORE_PRJ_EVAL 0x0002
#define RZ_CORE_PRJ_IO_MAPS 0x0004
#define RZ_CORE_PRJ_SECTIONS 0x0008
#define RZ_CORE_PRJ_META 0x0010
#define RZ_CORE_PRJ_XREFS 0x0020
#define RZ_CORE_PRJ_FCNS 0x0040
#define RZ_CORE_PRJ_ANALYSIS_HINTS 0x0080
#define RZ_CORE_PRJ_ANALYSIS_TYPES 0x0100
#define RZ_CORE_PRJ_ANALYSIS_MACROS 0x0200
#define RZ_CORE_PRJ_ANALYSIS_SEEK 0x0400
#define RZ_CORE_PRJ_DBG_BREAK 0x0800
#define RZ_CORE_PRJ_ALL 0xFFFF
typedef struct rz_core_bin_filter_t {
ut64 offset;
const char *name;
} RzCoreBinFilter;
RZ_API bool rz_core_bin_set_arch_bits(RZ_NONNULL RzCore *r, RZ_NULLABLE const char *filename, RZ_NULLABLE const char *arch, ut16 bits);
RZ_API int rz_core_bin_update_arch_bits(RzCore *r);
RZ_API RZ_OWN char *rz_core_bin_class_build_flag_name(RZ_NONNULL RzBinClass *cls);
RZ_API RZ_OWN char *rz_core_bin_super_build_flag_name(RZ_NONNULL RzBinClass *cls);
RZ_API RZ_OWN char *rz_core_bin_method_build_flag_name(RZ_NONNULL RzBinClass *cls, RZ_NONNULL RzBinSymbol *meth);
RZ_API RZ_OWN char *rz_core_bin_field_build_flag_name(RZ_NONNULL RzBinClass *cls, RZ_NONNULL RzBinClassField *field);
RZ_API char *rz_core_bin_method_flags_str(ut64 flags, RzOutputMode mode);
RZ_API RZ_OWN char *rz_core_bin_pdb_get_filename(RZ_NONNULL RzCore *core);
RZ_API bool rz_core_bin_pdb_load(RZ_NONNULL RzCore *core, RZ_NONNULL const char *filename);
RZ_API RzPdb *rz_core_pdb_load_info(RZ_NONNULL RzCore *core, RZ_NONNULL const char *file);
RZ_API void rz_core_pdb_info_print(RZ_NONNULL RzCore *core, RZ_NONNULL RzTypeDB *db, RZ_NONNULL RzPdb *pdb, RZ_NONNULL RzCmdStateOutput *state);
RZ_API char *rz_core_bin_pdb_gvars_as_string(RZ_NONNULL RzPdb *pdb, const ut64 img_base, RzCmdStateOutput *state);
RZ_API RzCmdStatus rz_core_bin_plugins_print(RzBin *bin, RzCmdStateOutput *state);
RZ_API bool rz_core_bin_archs_print(RZ_NONNULL RzBin *bin, RZ_NONNULL RzCmdStateOutput *state);
RZ_API bool rz_core_bin_entries_print(RZ_NONNULL RzCore *core, RZ_NONNULL RzBinFile *bf, RZ_NONNULL RzCmdStateOutput *state);
RZ_API bool rz_core_bin_initfini_print(RZ_NONNULL RzCore *core, RZ_NONNULL RzBinFile *bf, RZ_NONNULL RzCmdStateOutput *state);
RZ_API bool rz_core_bin_exports_print(RZ_NONNULL RzCore *core, RZ_NONNULL RzBinFile *bf, RZ_NONNULL RzCmdStateOutput *state, RzCoreBinFilter *filter);
RZ_API bool rz_core_bin_cur_export_print(RZ_NONNULL RzCore *core, RZ_NONNULL RzBinFile *bf, RZ_NONNULL RzCmdStateOutput *state);
RZ_API bool rz_core_bin_symbols_print(RZ_NONNULL RzCore *core, RZ_NONNULL RzBinFile *bf, RZ_NONNULL RzCmdStateOutput *state, RzCoreBinFilter *filter);
RZ_API bool rz_core_bin_cur_symbol_print(RZ_NONNULL RzCore *core, RZ_NONNULL RzBinFile *bf, RZ_NONNULL RzCmdStateOutput *state);
RZ_API bool rz_core_bin_imports_print(RZ_NONNULL RzCore *core, RZ_NONNULL RzBinFile *bf, RZ_NONNULL RzCmdStateOutput *state, RzCoreBinFilter *filter);
RZ_API bool rz_core_bin_libs_print(RZ_NONNULL RzCore *core, RZ_NONNULL RzBinFile *bf, RZ_NONNULL RzCmdStateOutput *state);
RZ_API bool rz_core_bin_main_print(RZ_NONNULL RzCore *core, RZ_NONNULL RzBinFile *bf, RZ_NONNULL RzCmdStateOutput *state);
RZ_API bool rz_core_bin_relocs_print(RZ_NONNULL RzCore *core, RZ_NONNULL RzBinFile *bf, RZ_NONNULL RzCmdStateOutput *state);
RZ_API bool rz_core_bin_sections_print(RZ_NONNULL RzCore *core, RZ_NONNULL RzBinFile *bf, RZ_NONNULL RzCmdStateOutput *state, RzCoreBinFilter *filter, RzList /*<char *>*/ *hashes);
RZ_API bool rz_core_bin_cur_section_print(RZ_NONNULL RzCore *core, RZ_NONNULL RzBinFile *bf, RZ_NONNULL RzCmdStateOutput *state, RzList /*<char *>*/ *hashes);
RZ_API bool rz_core_bin_cur_segment_print(RZ_NONNULL RzCore *core, RZ_NONNULL RzBinFile *bf, RZ_NONNULL RzCmdStateOutput *state, RzList /*<char *>*/ *hashes);
RZ_API bool rz_core_bin_segments_print(RZ_NONNULL RzCore *core, RZ_NONNULL RzBinFile *bf, RZ_NONNULL RzCmdStateOutput *state, RzCoreBinFilter *filter, RzList /*<char *>*/ *hashes);
RZ_API bool rz_core_bin_strings_print(RZ_NONNULL RzCore *core, RZ_NONNULL RzBinFile *bf, RZ_NONNULL RzCmdStateOutput *state);
RZ_API RZ_OWN RzPVector /*<RzBinString *>*/ *rz_core_bin_whole_strings(RZ_NONNULL RzCore *core, RZ_NULLABLE RzBinFile *bf);
RZ_API bool rz_core_bin_whole_strings_print(RZ_NONNULL RzCore *core, RZ_NONNULL RzBinFile *bf, RZ_NONNULL RzCmdStateOutput *state);
RZ_API bool rz_core_bin_xrefs_strings_print(RZ_NONNULL RzCore *core, RZ_NONNULL RzBinFile *bf, RZ_NONNULL RzCmdStateOutput *state);
RZ_API bool rz_core_file_info_print(RZ_NONNULL RzCore *core, RZ_NONNULL RzBinFile *bf, RZ_NONNULL RzCmdStateOutput *state);
RZ_API bool rz_core_bin_info_print(RZ_NONNULL RzCore *core, RZ_NONNULL RzBinFile *bf, RZ_NONNULL RzCmdStateOutput *state);
RZ_API bool rz_core_bin_classes_print(RZ_NONNULL RzCore *core, RZ_NONNULL RzBinFile *bf, RZ_NONNULL RzCmdStateOutput *state);
RZ_API bool rz_core_bin_class_as_source_print(RZ_NONNULL RzCore *core, RZ_NONNULL RzBinFile *bf, const char *class_name);
RZ_API bool rz_core_bin_class_fields_print(RZ_NONNULL RzCore *core, RZ_NONNULL RzBinFile *bf, RZ_NONNULL RzCmdStateOutput *state, const char *class_name);
RZ_API bool rz_core_bin_class_methods_print(RZ_NONNULL RzCore *core, RZ_NONNULL RzBinFile *bf, RZ_NONNULL RzCmdStateOutput *state, const char *class_name);
RZ_API RzCmdStatus rz_core_bin_class_apply_print(RZ_NONNULL RzCore *core, RZ_NONNULL const char *classname, ut64 addr);
RZ_API bool rz_core_bin_classes_to_struct(RZ_NONNULL RzCore *core, RZ_NONNULL RzBinFile *bf);
RZ_API bool rz_core_bin_signatures_print(RZ_NONNULL RzCore *core, RZ_NONNULL RzBinFile *bf, RZ_NONNULL RzCmdStateOutput *state);
RZ_API bool rz_core_bin_fields_print(RZ_NONNULL RzCore *core, RZ_NONNULL RzBinFile *bf, RZ_NONNULL RzCmdStateOutput *state);
RZ_API bool rz_core_bin_dwarf_print(RZ_NONNULL RzCore *core, RZ_NONNULL RzBinFile *bf, RZ_NONNULL RzCmdStateOutput *state);
RZ_API bool rz_core_bin_memory_print(RZ_NONNULL RzCore *core, RZ_NONNULL RzBinFile *bf, RZ_NONNULL RzCmdStateOutput *state);
RZ_API bool rz_core_bin_resources_print(RZ_NONNULL RzCore *core, RZ_NONNULL RzBinFile *bf, RZ_NONNULL RzCmdStateOutput *state, RZ_NULLABLE RzList /*<char *>*/ *hashes);
RZ_API bool rz_core_bin_versions_print(RZ_NONNULL RzCore *core, RZ_NONNULL RzBinFile *bf, RZ_NONNULL RzCmdStateOutput *state);
RZ_API bool rz_core_bin_trycatch_print(RZ_NONNULL RzCore *core, RZ_NONNULL RzBinFile *bf, RZ_NONNULL RzCmdStateOutput *state);
RZ_API bool rz_core_bin_size_print(RZ_NONNULL RzCore *core, RZ_NONNULL RzBinFile *bf, RZ_NONNULL RzCmdStateOutput *state);
RZ_API bool rz_core_bin_sections_mapping_print(RZ_NONNULL RzCore *core, RZ_NONNULL RzBinFile *bf, RZ_NONNULL RzCmdStateOutput *state);
RZ_API bool rz_core_bin_print(RzCore *core, RZ_NONNULL RzBinFile *bf, ut32 mask, RzCoreBinFilter *filter, RzCmdStateOutput *state, RzList /*<char *>*/ *hashes);
RZ_API bool rz_core_bin_basefind_print(RzCore *core, ut32 pointer_size, RzCmdStateOutput *state);
// cmeta.c
RZ_API bool rz_core_meta_string_add(RzCore *core, ut64 addr, ut64 size, RzStrEnc encoding, RZ_NULLABLE const char *name);
RZ_API bool rz_core_meta_pascal_string_add(RzCore *core, ut64 addr, RzStrEnc encoding, RZ_NULLABLE const char *name);
// cprint.c
typedef enum {
RZ_CORE_PRINT_FORMAT_TYPE_OCTAL = 0,
RZ_CORE_PRINT_FORMAT_TYPE_INTEGER,
RZ_CORE_PRINT_FORMAT_TYPE_HEXADECIMAL,
RZ_CORE_PRINT_FORMAT_TYPE_INVALID,
} RzCorePrintFormatType;
RZ_API RZ_OWN char *rz_core_print_string_c_cpp(RzCore *core);
RZ_API RZ_OWN char *rz_core_hex_of_assembly(RzCore *core, const char *assembly);
RZ_API RZ_OWN char *rz_core_esil_of_assembly(RzCore *core, const char *assembly);
RZ_API RZ_OWN char *rz_core_assembly_of_hex(RzCore *core, ut8 *hex, int len);
RZ_API RZ_OWN char *rz_core_esil_of_hex(RzCore *core, ut8 *hex, int len);
RZ_API RZ_OWN char *rz_core_print_hexdump_diff_str(RZ_NONNULL RzCore *core, ut64 aa, ut64 ba, ut64 len);
RZ_API RZ_OWN char *rz_core_print_dump_str(RZ_NONNULL RzCore *core, RzOutputMode mode, ut64 addr, ut8 n, int len, RzCorePrintFormatType format);
RZ_API RZ_OWN char *rz_core_print_hexdump_or_hexdiff_str(RZ_NONNULL RzCore *core, RzOutputMode mode, ut64 addr, int len, bool use_comment);
RZ_API RZ_OWN char *rz_core_print_hexdump_byline_str(RZ_NONNULL RzCore *core, bool hex_offset, ut64 addr, int len, ut8 size);
RZ_API RZ_OWN char *rz_core_print_bytes_with_inst(RZ_NONNULL RzCore *core, RZ_NONNULL const ut8 *buf, ut64 addr, int len);
typedef enum {
RZ_CORE_DISASM_STRINGS_MODE_BYTES = 0,
RZ_CORE_DISASM_STRINGS_MODE_INST,
RZ_CORE_DISASM_STRINGS_MODE_BLOCK,
RZ_CORE_DISASM_STRINGS_MODE_FUNCTION,
} RzCorePrintDisasmStringsMode;
RZ_API RZ_OWN char *rz_core_print_disasm_strings(RZ_NONNULL RzCore *core, RzCorePrintDisasmStringsMode mode, ut64 n_bytes, RZ_NULLABLE RzAnalysisFunction *fcn);
/* rtr */
RZ_API bool rz_core_rtr_init(RZ_NONNULL RzCore *core);
RZ_API void rz_core_rtr_cmds(RzCore *core, const char *port);
RZ_API char *rz_core_rtr_cmds_query(RzCore *core, const char *host, const char *port, const char *cmd);
RZ_API void rz_core_rtr_pushout(RzCore *core, const char *input);
RZ_API void rz_core_rtr_list(RzCore *core);
RZ_API void rz_core_rtr_add(RzCore *core, const char *input);
RZ_API void rz_core_rtr_remove(RzCore *core, const char *input);
RZ_API void rz_core_rtr_session(RzCore *core, const char *input);
RZ_API void rz_core_rtr_cmd(RzCore *core, const char *input);
RZ_API bool rz_core_rtr_http(RzCore *core, bool open_browser);
RZ_API bool rz_core_rtr_gdb(RzCore *core, ut32 port, const char *file_path, RZ_NULLABLE const char *gdb_args, bool debug_msg);
/// Legacy search
RZ_API int rz_core_search_preludes(RzCore *core, bool log);
RZ_API int rz_core_search_prelude(RzCore *core, ut64 from, ut64 to, const ut8 *buf, int blen, const ut8 *mask, int mlen);
#define RZ_CORE_BOUNDARIES_PERMS_ANY 0
#define RZ_CORE_BOUNDARIES_MASK_NONE 0
RZ_API RZ_OWN RzList /*<RzIOMap *>*/ *rz_core_get_boundaries_raw(RZ_NONNULL RzCore *core, const RzInterval interval);
RZ_API RZ_OWN RzList /*<RzIOMap *>*/ *rz_core_get_boundaries_block(RZ_NONNULL RzCore *core, const RzInterval interval);
RZ_API RZ_OWN RzList /*<RzIOMap *>*/ *rz_core_get_boundaries_current_function(RZ_NONNULL RzCore *core, const RzInterval interval);
RZ_API RZ_OWN RzList /*<RzIOMap *>*/ *rz_core_get_boundaries_current_function_bb(RZ_NONNULL RzCore *core, const RzInterval interval);
RZ_API RZ_OWN RzList /*<RzIOMap *>*/ *rz_core_get_boundaries_current_io_map(RZ_NONNULL RzCore *core, const RzInterval interval);
RZ_API RZ_OWN RzList /*<RzIOMap *>*/ *rz_core_get_boundaries_current_bin_section(RZ_NONNULL RzCore *core, const RzInterval interval);
RZ_API RZ_OWN RzList /*<RzIOMap *>*/ *rz_core_get_boundaries_current_bin_segment(RZ_NONNULL RzCore *core, const RzInterval interval);
#define rz_core_get_boundaries_range rz_core_get_boundaries_all_io_maps
#define rz_core_get_boundaries_all_io_maps(core, interval) \
rz_core_get_boundaries_io_maps(core, interval, RZ_CORE_BOUNDARIES_PERMS_ANY, RZ_CORE_BOUNDARIES_MASK_NONE)
RZ_API RZ_OWN RzList /*<RzIOMap *>*/ *rz_core_get_boundaries_io_maps(RZ_NONNULL RzCore *core, const RzInterval interval, int perms, int perms_mask);
#define rz_core_get_boundaries_all_io_skyline(core, interval) \
rz_core_get_boundaries_io_skyline(core, interval, RZ_CORE_BOUNDARIES_PERMS_ANY, RZ_CORE_BOUNDARIES_MASK_NONE)
RZ_API RZ_OWN RzList /*<RzIOMap *>*/ *rz_core_get_boundaries_io_skyline(RZ_NONNULL RzCore *core, const RzInterval interval, int perms, int perms_mask);
#define rz_core_get_boundaries_all_bin_segments(core, interval) \
rz_core_get_boundaries_bin_segments(core, interval, RZ_CORE_BOUNDARIES_PERMS_ANY, RZ_CORE_BOUNDARIES_MASK_NONE)
RZ_API RZ_OWN RzList /*<RzIOMap *>*/ *rz_core_get_boundaries_bin_segments(RZ_NONNULL RzCore *core, const RzInterval interval, int perms, int perms_mask);
#define rz_core_get_boundaries_all_bin_sections(core, interval) \
rz_core_get_boundaries_bin_sections(core, interval, RZ_CORE_BOUNDARIES_PERMS_ANY, RZ_CORE_BOUNDARIES_MASK_NONE)
RZ_API RZ_OWN RzList /*<RzIOMap *>*/ *rz_core_get_boundaries_bin_sections(RZ_NONNULL RzCore *core, const RzInterval interval, int perms, int perms_mask);
RZ_API RZ_OWN RzList /*<RzIOMap *>*/ *rz_core_get_boundaries_code_only(RZ_NONNULL RzCore *core, const RzInterval interval);
#define rz_core_get_boundaries_current_debug_map(core, interval) \
rz_core_get_boundaries_debug_maps(core, interval, RZ_CORE_BOUNDARIES_PERMS_ANY, RZ_CORE_BOUNDARIES_MASK_NONE, true)
#define rz_core_get_boundaries_all_debug_maps(core, interval) \
rz_core_get_boundaries_debug_maps(core, interval, RZ_CORE_BOUNDARIES_PERMS_ANY, RZ_CORE_BOUNDARIES_MASK_NONE, false)
RZ_API RZ_OWN RzList /*<RzIOMap *>*/ *rz_core_get_boundaries_debug_maps(RZ_NONNULL RzCore *core, const RzInterval interval, int perms, int perms_mask, bool current);
RZ_API RZ_OWN RzList /*<RzIOMap *>*/ *rz_core_get_boundaries_debug_heap(RZ_NONNULL RzCore *core, const RzInterval interval);
RZ_API RZ_OWN RzList /*<RzIOMap *>*/ *rz_core_get_boundaries_debug_stack(RZ_NONNULL RzCore *core, const RzInterval interval);
RZ_API RZ_OWN RzList /*<RzIOMap *>*/ *rz_core_get_boundaries_debug_program(RZ_NONNULL RzCore *core, const RzInterval interval);
RZ_API RZ_OWN RzList /*<RzIOMap *>*/ *rz_core_get_boundaries_select(RZ_NONNULL RzCore *core, RZ_NONNULL const char *from_key, RZ_NONNULL const char *to_key, RZ_NONNULL const char *in_key);
RZ_API bool rz_core_hack(RzCore *core, const char *op);
RZ_API bool rz_core_dump(RzCore *core, const char *file, ut64 addr, ut64 size, int append);
RZ_API RZ_OWN char *rz_core_clippy(RZ_NONNULL RzCore *core, RZ_NONNULL const char *msg);
// TODO MOVE SOMEWHERE ELSE
typedef char *(*PrintItemCallback)(void *user, void *p, bool selected);
RZ_API char *rz_str_widget_list(void *user, RzList /*<void *>*/ *list, int rows, int cur, PrintItemCallback cb);
/* help */
RZ_API void rz_core_cmd_help(const RzCore *core, const char *help[]);
RZ_DEPRECATE RZ_API const char **rz_core_help_vars_get(RzCore *core);
/* analysis stats */
/**
* Single sub-range of statistics as part of an entire RzCoreAnalysisStats.
*
* The range that this covers is given by rz_core_analysis_stats_get_block_from()/to().
*/
typedef struct {
ut32 youarehere;
ut32 flags;
ut32 comments;
ut32 functions;
ut32 blocks;
ut32 in_functions;
ut32 symbols;
ut32 strings;
ut32 signatures;
ut32 imports;
ut32 perm;
} RzCoreAnalysisStatsItem;
/**
* Statistics for a range of memory, split up into smaller blocks.
*/
typedef struct {
ut64 from;
ut64 to;
ut64 step;
RzVector /*<RzCoreAnalysisStatsItem>*/ blocks;
} RzCoreAnalysisStats;
RZ_API char *rz_core_analysis_hasrefs(RzCore *core, ut64 value, RzOutputMode mode);
RZ_API char *rz_core_analysis_get_comments(RzCore *core, ut64 addr);
RZ_API RZ_OWN RzCoreAnalysisStats *rz_core_analysis_get_stats(RZ_NONNULL RzCore *a, ut64 from, ut64 to, ut64 step);
RZ_API void rz_core_analysis_stats_free(RzCoreAnalysisStats *s);
RZ_API ut64 rz_core_analysis_stats_get_block_from(RZ_NONNULL const RzCoreAnalysisStats *s, size_t i);
RZ_API ut64 rz_core_analysis_stats_get_block_to(RZ_NONNULL const RzCoreAnalysisStats *s, size_t i);
RZ_API RZ_OWN char *rz_core_syscall_as_string(RzCore *core, st64 num, ut64 addr);
/* tasks */
typedef enum {
RZ_CORE_TASK_STATE_BEFORE_START,
RZ_CORE_TASK_STATE_RUNNING,
RZ_CORE_TASK_STATE_SLEEPING,
RZ_CORE_TASK_STATE_DONE
} RzTaskState;
typedef enum {
RZ_CORE_TASK_JOIN_ERR_SUCCESS = 0, ///< Join success!
RZ_CORE_TASK_JOIN_ERR_CURRENT, ///< Join on current task
RZ_CORE_TASK_JOIN_ERR_NO_TASK, ///< No task has given id
RZ_CORE_TASK_JOIN_ERR_ONE_NO_SEM, ///< No join semaphore when joining on one task
RZ_CORE_TASK_JOIN_ERR_ALL_NO_SEM ///< No join semaphore when joining on all tasks
} RzCoreTaskJoinErr;
/**
* Main payload of a task, the function that should be executed asynchronously.
*/
typedef void (*RzCoreTaskRunner)(RzCoreTaskScheduler *sched, void *user);
/**
* Task-specific callback to free/cleanup any runner-specific data.
*/
typedef void (*RzCoreTaskRunnerFree)(void *user);
struct rz_core_task_t {
RzCoreTaskScheduler *sched;
int id;
RzTaskState state;
bool transient; // delete when finished
int refcount;
RzThreadSemaphore *running_sem;
bool dispatched;
RzThreadCond *dispatch_cond;
RzThreadLock *dispatch_lock;
RzThread *thread;
bool breaked;
RzCoreTaskRunner runner; // will be NULL for main task
RzCoreTaskRunnerFree runner_free;
void *runner_user;
};
typedef void (*RzCoreTaskOneShot)(void *);
RZ_API RzTable *rz_core_table(RzCore *core);
RZ_API void rz_core_task_scheduler_init(RzCoreTaskScheduler *sched,
RzCoreTaskContextSwitch ctx_switch, void *ctx_switch_user,
RzCoreTaskBreak break_cb, void *break_cb_user);
RZ_API void rz_core_task_scheduler_fini(RzCoreTaskScheduler *tasks);
RZ_API RzCoreTask *rz_core_task_get_incref(RzCoreTaskScheduler *scheduler, int id);
RZ_API int rz_core_task_running_tasks_count(RzCoreTaskScheduler *scheduler);
RZ_API RzCoreTask *rz_core_task_new(RzCoreTaskScheduler *sched, RzCoreTaskRunner runner, RzCoreTaskRunnerFree runner_free, void *runner_user);
RZ_API void rz_core_task_incref(RzCoreTask *task);
RZ_API void rz_core_task_decref(RzCoreTask *task);
RZ_API void rz_core_task_enqueue(RzCoreTaskScheduler *scheduler, RzCoreTask *task);
RZ_API void rz_core_task_enqueue_oneshot(RzCoreTaskScheduler *scheduler, RzCoreTaskOneShot func, void *user);
RZ_API int rz_core_task_run_sync(RzCoreTaskScheduler *scheduler, RzCoreTask *task);
RZ_API void rz_core_task_sync_begin(RzCoreTaskScheduler *scheduler);
RZ_API void rz_core_task_sync_end(RzCoreTaskScheduler *scheduler);
RZ_API void rz_core_task_yield(RzCoreTaskScheduler *scheduler);
RZ_API void rz_core_task_sleep_begin(RzCoreTask *task);
RZ_API void rz_core_task_sleep_end(RzCoreTask *task);
RZ_API void rz_core_task_break(RzCoreTaskScheduler *scheduler, int id);
RZ_API void rz_core_task_break_all(RzCoreTaskScheduler *scheduler);
RZ_API int rz_core_task_del(RzCoreTaskScheduler *scheduler, int id);
RZ_API RzCoreTask *rz_core_task_self(RzCoreTaskScheduler *scheduler);
RZ_API RzCoreTaskJoinErr rz_core_task_join(RzCoreTaskScheduler *scheduler, RzCoreTask *current, int id);
typedef void (*inRangeCb)(RzCore *core, ut64 from, ut64 to, int vsize, void *cb_user);
RZ_API int rz_core_search_value_in_range(RzCore *core, RzInterval search_itv,
ut64 vmin, ut64 vmax, int vsize, inRangeCb cb, void *cb_user);
// core-specific tasks
typedef void (*RzCoreCmdTaskFinished)(const char *res, void *user);
RZ_API RzCoreTask *rz_core_cmd_task_new(RzCore *core, const char *cmd, RzCoreCmdTaskFinished finished_cb, void *finished_cb_user);
RZ_API const char *rz_core_cmd_task_get_result(RzCoreTask *task);
typedef void *(*RzCoreTaskFunction)(RzCore *core, void *user);
RZ_API RzCoreTask *rz_core_function_task_new(RzCore *core, RzCoreTaskFunction fcn, void *fcn_user);
RZ_API void *rz_core_function_task_get_result(RzCoreTask *task);
RZ_API const char *rz_core_task_status(RzCoreTask *task);
RZ_API bool rz_core_task_is_cmd(RzCore *core, int id);
RZ_API void rz_core_task_del_all_done(RzCore *core);
RZ_API void rz_core_analysis_propagate_noreturn(RzCore *core, ut64 addr);
RZ_API bool rz_core_flirt_dump_file(RZ_NONNULL const char *flirt_file);
RZ_API bool rz_core_flirt_create_file(RZ_NONNULL RzCore *core, RZ_NONNULL const char *output_file, RZ_NULLABLE ut32 *written_nodes);
RZ_API bool rz_core_flirt_convert_file(RZ_NONNULL RzCore *core, RZ_NONNULL const char *input_file, RZ_NONNULL const char *ouput_file);
RZ_API const char *rz_core_flirt_arch_from_id(ut8 arch);
RZ_API ut8 rz_core_flirt_arch_from_name(RZ_NONNULL const char *arch);
RZ_API ut32 rz_core_flirt_file_from_option_list(RZ_NONNULL const char *file_list);
RZ_API ut16 rz_core_flirt_os_from_option_list(RZ_NONNULL const char *os_list);
RZ_API ut16 rz_core_flirt_app_from_option_list(RZ_NONNULL const char *app_list);
/* DECOMPILER PRINTING FUNCTIONS */
/**
* @brief Prints the data contained in the specified RzAnnotatedCode in JSON format.
*
* The function will print the output in console using the function rz_cons_printf();
*
* @param code Pointer to a RzAnnotatedCode.
*/
RZ_API void rz_core_annotated_code_print_json(RzAnnotatedCode *code);
/**
* @brief Prints the decompiled code from the specified RzAnnotatedCode.
*
* This function is used for printing the output of commands pdg and pdgo.
* It can print the decompiled code with or without offsets. If line_offsets is a null pointer,
* the output will be printed without offsets (pdg), otherwise, the output will be
* printed with offsets.
* This function will print the output in console using the function rz_cons_printf();
*
* @param code Pointer to a RzAnnotatedCode.
* @param line_offsets Pointer to a @ref RzVector that contains offsets for the decompiled code.
*/
RZ_API void rz_core_annotated_code_print(RzAnnotatedCode *code, RzVector /*<ut64>*/ *line_offsets);
/**
* @brief Prints the decompiled code as comments
*
* This function is used for the output of command pdg*
* Output will be printed in console using the function rz_cons_printf();
*
* @param code Pointer to a RzAnnotatedCode.
*/
RZ_API void rz_core_annotated_code_print_comment_cmds(RzAnnotatedCode *code);
/* serialize */
/**
* @param prj_file filename of the project that db will be saved to later. This is only used to re-locate the loaded RIO descs, the project file itself is not touched by this function.
*/
RZ_API void rz_serialize_core_save(RZ_NONNULL Sdb *db, RZ_NONNULL RzCore *core, RZ_NULLABLE const char *prj_file);
/**
* @param load_bin_io whether to also load the underlying RIO and RBin state from the project. If false, the current state will be kept and the project loaded on top.
* @param prj_file filename of the project that db comes from. This is only used to re-locate the loaded RIO descs, the project file itself is not touched by this function.
*/
RZ_API bool rz_serialize_core_load(RZ_NONNULL Sdb *db, RZ_NONNULL RzCore *core, bool load_bin_io,
RZ_NULLABLE const char *prj_file, RZ_NULLABLE RzSerializeResultInfo *res);
RZ_API void rz_serialize_core_seek_save(RZ_NONNULL Sdb *db, RZ_NONNULL RzCore *core);
RZ_API bool rz_serialize_core_seek_load(RZ_NONNULL Sdb *db, RZ_NONNULL RzCore *core, RZ_NULLABLE RzSerializeResultInfo *res);
/**
* \brief Load a project and print info and errors
*/
RZ_API bool rz_core_project_load_for_cli(RzCore *core, const char *file, bool load_bin_io);
RZ_API bool rz_platform_index_add_flags_comments(RzCore *core);
/* regs */
/// Callback for synchronizing register state in commands (only relevant for debug, not for analysis)
typedef bool (*RzCmdRegSync)(RzCore *core, RzRegisterType type, bool write);
RZ_API bool rz_core_reg_assign_sync(RZ_NONNULL RzCore *core, RZ_NONNULL RzReg *reg, RzCmdRegSync sync_cb, RZ_NONNULL const char *name, ut64 val);
RZ_API RZ_OWN RzList /*<RzRegItem *>*/ *rz_core_reg_filter_items_sync(RZ_NONNULL RzCore *core, RZ_NONNULL RzReg *reg, RzCmdRegSync sync_cb, RZ_NULLABLE const char *filter);
RZ_API void rz_core_rtr_enable(RZ_NONNULL RzCore *core, const char *cmdremote);
RZ_API RZ_OWN char *rz_core_analysis_var_to_string(RZ_NONNULL RzCore *core, RZ_NONNULL RzAnalysisVar *var);
RZ_API RZ_OWN char *rz_core_analysis_var_display(RZ_NONNULL RzCore *core, RZ_NONNULL RzAnalysisVar *var, bool add_name);
RZ_API ut64 rz_core_analysis_var_addr(RZ_NONNULL RzCore *core, RZ_NONNULL RzAnalysisVar *var);
RZ_API RZ_BORROW const RzBinSourceLineSample *rz_analysis_function_sourceline_information(RZ_NONNULL RzCore *core, RZ_NONNULL RzAnalysisFunction *fcn);
RZ_API RZ_BORROW const RzBinSourceLineSample *rz_analysis_var_global_sourceline_information(RZ_NONNULL RzCore *core, RZ_NONNULL RzAnalysisVarGlobal *glb);
RZ_API void rz_core_sym_name_init(RZ_NONNULL RZ_OUT RzBinSymNames *names, RZ_NONNULL RzBinSymbol *symbol, bool demangle);
RZ_API void rz_core_sym_name_fini(RZ_NULLABLE RzBinSymNames *names);
RZ_API void rz_core_analysis_bytes_il(RZ_NONNULL RzCore *core, ut64 len, ut64 num_ops, bool pretty, bool unicode);
RZ_API bool rz_core_disasm_until_ret(RZ_NONNULL RzCore *core, ut64 addr, int limit, RzOutputMode mode,
bool ret_val, RZ_NULLABLE RZ_OUT RzStrBuf *buf);
RZ_API RZ_OWN RzList /*<RzIOMap *>*/ *rz_core_setup_io_search_parameters(RzCore *core, RZ_NULLABLE RZ_OUT RzSearchOpt *search_opts);
RZ_API RZ_OWN RzSearchFindOpt *rz_core_setup_default_search_find_opts(RzCore *core);
RZ_API RZ_OWN RzList /*<RzSearchHit *>*/ *rz_core_search_bytes(RZ_NONNULL RzCore *core, RZ_BORROW RZ_NULLABLE RzSearchOpt *user_opts, RZ_NONNULL RZ_OWN RzSearchBytesPattern *pattern);
RZ_API RZ_OWN RzList /*<RzSearchHit *>*/ *rz_core_search_values(RZ_NONNULL RzCore *core, RZ_BORROW RZ_NULLABLE RzSearchOpt *user_opts, RZ_NONNULL RZ_OWN RzVector /*<RzSearchValueRange>*/ *vranges);
RZ_API RZ_OWN RzList /*<RzSearchHit *>*/ *rz_core_search_string(RZ_NONNULL RzCore *core, RZ_BORROW RZ_NONNULL RzSearchOpt *user_opts, RZ_NONNULL const char *string, size_t string_len, RzRegexFlags flags, RzStrEnc expected);
RZ_API RZ_OWN RzList /*<RzSearchHit *>*/ *rz_core_search_cryptographic_material(RZ_NONNULL RzCore *core, RZ_BORROW RZ_NULLABLE RzSearchOpt *user_opts, RzSearchCollectionCryptographicType type);
RZ_API RZ_OWN RzList /*<RzSearchHit *>*/ *rz_core_search_hash(RZ_NONNULL RzCore *core, RZ_BORROW RZ_NULLABLE RzSearchOpt *user_opts, RZ_NONNULL const char *algo_name, RZ_NONNULL const char *expected_digits, ut64 block_size);
RZ_API RZ_OWN RzList /*<RzSearchHit *>*/ *rz_core_search_entropy(RZ_NONNULL RzCore *core, RZ_BORROW RZ_NULLABLE RzSearchOpt *user_opts, bool fractional, double min_inclusive_limit, double max_inclusive_limit, ut64 block_size);
RZ_API RZ_OWN RzList /*<RzSearchHit *>*/ *rz_core_search_magic(RZ_NONNULL RzCore *core, RZ_BORROW RZ_NULLABLE RzSearchOpt *user_opts, RZ_NULLABLE const char *magic_dir);
#endif
#ifdef __cplusplus
}
#endif
#endif