108 #define sig_dbg(...) eprintf(__VA_ARGS__)
111 for (
ut32 i = 0;
i < b_size; ++
i) {
118 #define sig_dbg_buffer(n, b, s)
121 #define rz_buf_append_le_bits(buffer, tmp, value, bits) \
122 rz_write_le##bits(tmp, value); \
123 rz_buf_append_bytes(buffer, tmp, sizeof(ut##bits))
125 #define rz_buf_append_be_bits(buffer, tmp, value, bits) \
126 rz_write_be##bits(tmp, value); \
127 rz_buf_append_bytes(buffer, tmp, sizeof(ut##bits))
130 #define IDASIG_FEATURE_NONE 0x00
131 #define IDASIG_FEATURE_STARTUP 0x01
132 #define IDASIG_FEATURE_CTYPE_CRC 0x02
133 #define IDASIG_FEATURE_2BYTE_CTYPE 0x04
134 #define IDASIG_FEATURE_ALT_CTYPE_CRC 0x08
135 #define IDASIG_FEATURE_COMPRESSED 0x10
138 #define IDASIG_PARSE_MORE_PUBLIC_NAMES 0x01
139 #define IDASIG_PARSE_READ_TAIL_BYTES 0x02
140 #define IDASIG_PARSE_READ_REFERENCED_FUNCTIONS 0x04
141 #define IDASIG_PARSE_MORE_MODULES_WITH_SAME_CRC 0x08
142 #define IDASIG_PARSE_MORE_MODULES 0x10
145 #define IDASIG_FUNCTION_LOCAL 0x02
146 #define IDASIG_FUNCTION_UNRESOLVED_COLLISION 0x08
183 #define is_status_err_or_eof(p) (p->eof || p->error)
214 for (
i = 0;
i < 8;
i++) {
215 if ((crc ^ data) & 1) {
216 crc = (crc >> 1) ^
POLY;
226 crc = (crc << 8) | ((data >> 8) & 0xff);
234 if (
b->eof ||
b->error) {
270 if ((
r & 0x80) != 0x80) {
273 if ((
r & 0xc0) != 0xc0) {
276 if ((
r & 0xe0) != 0xe0) {
303 free(node->pattern_mask);
304 free(node->pattern_bytes);
337 if (b_size < p_size) {
340 for (
ut32 i = 0;
i < p_size;
i++) {
341 if (
mask[
i] == 0xFF && pattern[
i] !=
b[
i]) {
371 rz_list_foreach (
module->tail_bytes, tail_byte_it, tail_byte) {
379 rz_list_foreach (
module->public_functions, flirt_func_it, flirt_func) {
384 if (next_module_function) {
385 ut32 next_module_function_size;
391 while (next_flirt_func_it) {
392 next_flirt_func = next_flirt_func_it->
data;
394 flirt_fcn_size = next_flirt_func->
offset - flirt_func->
offset;
397 next_flirt_func_it = next_flirt_func_it->
n;
401 if (next_module_function_size < flirt_fcn_size) {
405 rz_list_foreach_safe (analysis->
fcns,
iter, iter_tmp, fcn) {
406 if (fcn != next_module_function &&
407 fcn->
addr >= next_module_function->
addr + next_module_function_size &&
408 fcn->
addr < next_module_function->
addr + flirt_fcn_size) {
411 rz_list_foreach (fcn->
bbs, iter_bb, block) {
429 RZ_LOG_ERROR(
"FLIRT: cannot allocate string buffer for name\n");
438 RZ_LOG_ERROR(
"FLIRT: cannot allocate string buffer for name\n");
450 analysis->
flb.
set(analysis->
flb.
f,
name, next_module_function->
addr, next_module_function_size);
465 rz_list_foreach (node->
child_list, node_child_it, child) {
494 RZ_LOG_ERROR(
"FLIRT: There are no analyzed functions. Have you run 'aa'?\n");
501 rz_list_foreach (analysis->
fcns, it_func, func) {
520 rz_list_foreach (root_node->
child_list, node_child_it, child) {
536 ut32 number_of_tail_bytes;
539 RZ_LOG_ERROR(
"FLIRT: failed to allocate tail bytes list.\n");
543 if (
b->version == 8 ||
b->version == 9) {
547 RZ_LOG_ERROR(
"FLIRT: failed to read referenced function count because EOF (version 8 or 9).\n");
550 }
else if (
b->version > 9) {
554 RZ_LOG_ERROR(
"FLIRT: failed to read referenced function count because EOF (version > 9).\n");
558 number_of_tail_bytes = 1;
561 for (
i = 0;
i < number_of_tail_bytes;
i++) {
566 if (
b->version >= 9) {
570 RZ_LOG_ERROR(
"FLIRT: failed to read tail byte offset because EOF (version >= 9).\n");
576 RZ_LOG_ERROR(
"FLIRT: failed to read tail byte offset because EOF.\n");
582 RZ_LOG_ERROR(
"FLIRT: failed to read tail byte value because EOF.\n");
601 ut32 number_of_referenced_functions;
602 ut32 ref_function_name_length;
607 if (
b->version == 8 ||
b->version == 9) {
611 RZ_LOG_ERROR(
"FLIRT: failed to read referenced function count because EOF (version 8 or 9).\n");
614 }
else if (
b->version > 9) {
618 RZ_LOG_ERROR(
"FLIRT: failed to read referenced function count because EOF (version > 9).\n");
622 number_of_referenced_functions = 1;
624 sig_dbg(
"dbg: n refs: %02X\n", number_of_referenced_functions);
626 for (
i = 0;
i < number_of_referenced_functions;
i++) {
629 RZ_LOG_ERROR(
"FLIRT: failed to allocate RzFlirtFunction.\n");
632 if (
b->version >= 9) {
635 RZ_LOG_ERROR(
"FLIRT: failed to read referenced function offset because EOF (version >= 9).\n");
641 RZ_LOG_ERROR(
"FLIRT: failed to read referenced function offset because EOF.\n");
647 RZ_LOG_ERROR(
"FLIRT: failed to read referenced function name length because EOF.\n");
650 if (!ref_function_name_length) {
654 RZ_LOG_ERROR(
"FLIRT: failed to read referenced function name length because EOF (2).\n");
662 sig_dbg(
"dbg: REF length %02X\n", ref_function_name_length);
663 for (j = 0; j < ref_function_name_length; j++) {
666 RZ_LOG_ERROR(
"FLIRT: failed to read referenced function name[%u] because EOF.\n", j);
670 if (!ref_function->
name[ref_function_name_length]) {
674 ref_function->
name[ref_function_name_length] =
'\0';
699 if (
b->version >= 9) {
702 RZ_LOG_ERROR(
"FLIRT: failed to read public function offset because EOF (version >= 9).\n");
708 RZ_LOG_ERROR(
"FLIRT: failed to read public function offset because EOF.\n");
712 function->offset =
offset;
716 RZ_LOG_ERROR(
"FLIRT: failed to read public function flags because EOF.\n");
719 if (current_byte < 0x20) {
721 function->is_local =
true;
725 function->is_collision =
true;
729 RZ_LOG_ERROR(
"FLIRT: failed to read public function current byte because EOF.\n");
735 function->name[
i] = current_byte;
738 RZ_LOG_ERROR(
"FLIRT: failed to read public function name[%u] because EOF.\n",
i);
744 RZ_LOG_WARN(
"FLIRT: public function name is too long\n");
747 function->name[
i] =
'\0';
750 sig_dbg(
"dbg: %04X: %s \n", function->offset, function->name);
751 *
flags = current_byte;
782 sig_dbg(
"dbg: crc_len: %02X crc16: %04X\n", crc_length, crc16);
787 RZ_LOG_ERROR(
"FLIRT: failed to allocate RzFlirtModule.\n");
791 module->crc_length = crc_length;
794 if (
b->version >= 9) {
798 RZ_LOG_ERROR(
"FLIRT: failed to read module length because EOF (version >= 9).\n");
804 RZ_LOG_ERROR(
"FLIRT: failed to read module length because EOF.\n");
849 if (node->
length < 0x10) {
854 }
else if (node->
length <= 0x20) {
859 }
else if (node->
length <= 0x40) {
874 ut64 current_mask_bit = 0;
875 if ((
int)node->
length < 0) {
878 current_mask_bit = 1ULL << (node->
length - 1);
885 for (
i = 0;
i < node->
length;
i++, current_mask_bit >>= 1) {
908 RZ_LOG_ERROR(
"FLIRT: failed to read tree node number because EOF.\n");
911 sig_dbg(
"dbg: tree_nodes %02x\n", tree_nodes);
912 if (tree_nodes == 0) {
917 for (
i = 0;
i < tree_nodes;
i++) {
919 RZ_LOG_ERROR(
"FLIRT: failed to allocate child tree node.\n");
923 RZ_LOG_ERROR(
"FLIRT: failed to read pattern mask length (length %u).\n", node->
length);
989 RZ_LOG_ERROR(
"FLIRT: invalid sig file (EOF in v6/v7 header).\n");
998 RZ_LOG_ERROR(
"FLIRT: invalid sig file (EOF in v8/v9 header).\n");
1007 RZ_LOG_ERROR(
"FLIRT: invalid sig file (EOF in v10 header).\n");
1030 RZ_LOG_ERROR(
"FLIRT: invalid sig file (EOF in v5 header magic).\n");
1034 if (memcmp((
const char *)
header->magic,
"IDASGN", 6)) {
1040 RZ_LOG_ERROR(
"FLIRT: invalid sig file (EOF in v5 header version).\n");
1077 if (memcmp((
const char *)v5.
magic,
"IDASGN", 6)) {
1083 RZ_LOG_ERROR(
"FLIRT: Unsupported flirt signature version\n");
1101 RZ_LOG_ERROR(
"FLIRT: failed to allocate library name\n");
1114 info->u.sig.architecture = v5.
arch;
1142 int size, decompressed_size;
1157 RZ_LOG_ERROR(
"FLIRT: Unsupported flirt signature version\n");
1168 RZ_LOG_ERROR(
"FLIRT: the binary architecture did not match the .sig one.\n");
1201 RZ_LOG_ERROR(
"FLIRT: failed to allocate library name\n");
1215 RZ_LOG_ERROR(
"FLIRT: failed to allocate buffer for signature body\n");
1220 RZ_LOG_ERROR(
"FLIRT: failed to read signature body\n");
1236 RZ_LOG_ERROR(
"FLIRT: Sorry we do not support compressed signatures with version %d.\n", ps.
version);
1241 buf = decompressed_buf;
1242 size = decompressed_size;
1246 RZ_LOG_ERROR(
"FLIRT: failed to allocate new RzBuffer\n");
1252 RZ_LOG_ERROR(
"FLIRT: failed to allocate root RzFlirtNode\n");
1295 RZ_LOG_ERROR(
"FLIRT: unknown architecture %u\n", expected_arch);
1299 const char *extension =
rz_str_lchr(flirt_file,
'.');
1300 if (
RZ_STR_ISEMPTY(extension) || (strcmp(extension,
".sig") != 0 && strcmp(extension,
".pat") != 0)) {
1301 RZ_LOG_ERROR(
"FLIRT: unknown extension '%s'\n", extension);
1310 if (!strcmp(extension,
".pat")) {
1319 RZ_LOG_ERROR(
"FLIRT: Error while scanning the file %s\n", flirt_file);
1324 RZ_LOG_ERROR(
"FLIRT: We encountered an error while parsing the file %s. Sorry.\n", flirt_file);
1339 rz_list_foreach (node->child_list, it, child) {
1352 RZ_LOG_ERROR(
"FLIRT: the variable length value is too big\n");
1354 }
else if (
val > 0x7F) {
1357 tmp[0] = 0x80 | (
val >> 8);
1372 if (
val > 0x1FFFFFFF) {
1375 tmp[1] = (
val >> 24) & 0xFF;
1376 tmp[2] = (
val >> 16) & 0xFF;
1377 tmp[3] = (
val >> 8) & 0xFF;
1379 }
else if (
val > 0x3FFF) {
1381 tmp[0] = 0xC0 | ((
val >> 24) & 0x3F);
1382 tmp[1] = (
val >> 16) & 0xFF;
1383 tmp[2] = (
val >> 8) & 0xFF;
1385 }
else if (
val > 0x7F) {
1387 tmp[0] = 0x80 | ((
val >> 8) & 0x3F);
1416 ut32 base_offset = 0;
1436 rz_list_foreach (
module->public_functions, it, func) {
1442 base_offset = func->
offset;
1468 rz_list_foreach (
module->tail_bytes, it,
byte) {
1469 if (version < 8 && value > 1) {
1486 rz_list_foreach (
module->referenced_functions, it, func) {
1508 if (node->length > 64) {
1525 rz_list_foreach (node->module_list, it,
module) {
1545 rz_list_foreach (node->child_list, it, child) {
1549 if (child->
length < 0x10) {
1551 }
else if (child->
length <= 0x20) {
1553 }
else if (child->
length <= 0x40) {
1556 RZ_LOG_ERROR(
"FLIRT: pattern mask size cannot be > 64 bits\n");
1595 size_t library_name_len = strlen(
options->libname);
1603 RZ_LOG_ERROR(
"FLIRT: cannot deflate body due FLIRT version being < 7\n");
1679 ut64 block_size = 1ull << 20;
RZ_API void rz_analysis_function_add_block(RzAnalysisFunction *fcn, RzAnalysisBlock *bb)
RZ_API RzAnalysisFunction * rz_analysis_get_function_at(RzAnalysis *analysis, ut64 addr)
RZ_API ut64 rz_analysis_function_linear_size(RzAnalysisFunction *fcn)
RZ_API bool rz_analysis_function_rename(RzAnalysisFunction *fcn, const char *name)
RZ_API bool rz_analysis_function_delete(RzAnalysisFunction *fcn)
RzBinInfo * info(RzBinFile *bf)
static static sync static getppid static getegid const char static filename char static len const char char static bufsiz static mask static vfork const void static prot static getpgrp const char static swapflags static arg static fd static protocol static who struct sockaddr static addrlen static backlog struct timeval struct timezone static tz const struct iovec static count static mode const void const struct sockaddr static tolen const char static pathname void count
static static sync static getppid static getegid const char static filename char static len const char char static bufsiz static mask static vfork const void static prot static getpgrp const char static swapflags static arg static fd static protocol static who struct sockaddr static addrlen static backlog struct timeval struct timezone static tz const struct iovec static count static mode const void const struct sockaddr static tolen const char static pathname void static offset struct stat static buf void long static basep static whence static length const void static len static semflg const void static shmflg const struct timespec struct timespec static rem const char static group const void length
RZ_API int rz_analysis_function_resize(RzAnalysisFunction *fcn, int newsize)
RZ_API void rz_analysis_trim_jmprefs(RzAnalysis *analysis, RzAnalysisFunction *fcn)
RZ_API void rz_sign_flirt_node_free(RZ_NULLABLE RzFlirtNode *node)
Frees an RzFlirtNode struct.
static ut8 read_module_public_functions(RzFlirtModule *module, ParseStatus *b, ut8 *flags)
static bool rz_write_vle16(RzBuffer *buffer, ut16 val)
struct idasig_v10_t idasig_v10_t
static bool node_match_functions(RzAnalysis *analysis, const RzFlirtNode *root_node)
Tries to find matching functions between the signature infos in root_node and the analyzed functions ...
RZ_API RZ_OWN bool rz_sign_flirt_parse_header_compressed_pattern_from_buffer(RZ_NONNULL RzBuffer *flirt_buf, RZ_NONNULL RzFlirtInfo *info)
Parses the RzBuffer containing a FLIRT structure and returns an RzFlirtInfo.
static int parse_v10_header(RzBuffer *buf, idasig_v10_t *header)
#define IDASIG_FUNCTION_UNRESOLVED_COLLISION
static bool read_node_variant_mask(RzFlirtNode *node, ParseStatus *b)
static bool read_node_bytes(RzFlirtNode *node, ParseStatus *b)
RZ_API void rz_sign_flirt_info_fini(RZ_NULLABLE RzFlirtInfo *info)
Frees an RzFlirtInfo struct elements without freeing the pointer.
void module_free(RzFlirtModule *module)
static bool rz_write_versioned_vle(RzBuffer *buffer, ut32 value, ut8 version)
struct idasig_v6_v7_t idasig_v6_v7_t
static bool flirt_has_references(RZ_NONNULL const RzFlirtModule *module)
static bool rz_write_vle64(RzBuffer *buffer, ut64 val)
RZ_API ut32 rz_sign_flirt_node_count_nodes(RZ_NONNULL const RzFlirtNode *node)
Counts the number of FLIRT signatures in the node.
struct parse_status_t ParseStatus
#define IDASIG_PARSE_MORE_MODULES
static bool flirt_write_module(RZ_NONNULL const RzFlirtModule *module, RZ_NONNULL RzBuffer *buffer, ut8 flags, ut8 version, bool first)
struct idasig_v8_v9_t idasig_v8_v9_t
static ut8 read_module_tail_bytes(RzFlirtModule *module, ParseStatus *b)
static ut8 read_byte(ParseStatus *b)
RZ_API bool rz_sign_flirt_apply(RZ_NONNULL RzAnalysis *analysis, RZ_NONNULL const char *flirt_file, ut8 expected_arch)
Parses the FLIRT file and applies the signatures.
static bool flirt_write_node(RZ_NONNULL const RzFlirtNode *node, RZ_NONNULL RzBuffer *buffer, ut8 version)
static int node_match_buffer(RzAnalysis *analysis, const RzFlirtNode *node, ut8 *b, ut64 address, ut32 buf_size, ut32 buf_idx)
static ut8 read_module_referenced_functions(RzFlirtModule *module, ParseStatus *b)
static ut16 read_max_2_bytes(ParseStatus *b)
static ut32 read_word(ParseStatus *b)
static ut16 read_short(ParseStatus *b)
#define rz_buf_append_le_bits(buffer, tmp, value, bits)
static int module_match_buffer(RzAnalysis *analysis, const RzFlirtModule *module, ut8 *b, ut64 address, ut32 buf_size)
Checks if the module matches the buffer and renames the matched functions.
RZ_API RZ_OWN RzFlirtNode * rz_sign_flirt_parse_compressed_pattern_from_buffer(RZ_NONNULL RzBuffer *flirt_buf, ut8 expected_arch, RZ_NULLABLE RzFlirtInfo *info)
Parses the RzBuffer containing a FLIRT structure and returns an RzFlirtNode.
static ut8 parse_tree(ParseStatus *b, RzFlirtNode *root_node)
static bool is_pattern_matching(ut32 p_size, const ut8 *pattern, const ut8 *mask, const ut8 *b, ut32 b_size)
Checks if a pattern does match the buffer data.
struct idasig_v5_t idasig_v5_t
static bool read_node_length(RzFlirtNode *node, ParseStatus *b)
static ut32 read_multiple_bytes(ParseStatus *b)
ut16 flirt_crc16(const ut8 *data_p, size_t length)
RZ_API bool rz_sign_flirt_write_compressed_pattern_to_buffer(RZ_NONNULL const RzFlirtNode *node, RZ_NONNULL RzBuffer *buffer, RzFlirtCompressedOptions *options)
Writes in the the RzBuffer the FLIRT signatures in compressed format.
#define rz_buf_append_be_bits(buffer, tmp, value, bits)
#define is_status_err_or_eof(p)
static bool rz_write_vle32(RzBuffer *buffer, ut32 val)
static int parse_v6_v7_header(RzBuffer *buf, idasig_v6_v7_t *header)
#define IDASIG_PARSE_READ_REFERENCED_FUNCTIONS
#define IDASIG_FEATURE_NONE
static ut8 flirt_parse_version(RzBuffer *buffer)
Returns the FLIRT file version read from the RzBuffer This function returns the FLIRT file version,...
static int parse_v8_v9_header(RzBuffer *buf, idasig_v8_v9_t *header)
static bool parse_v5_header(RzBuffer *buf, idasig_v5_t *header)
#define IDASIG_FUNCTION_LOCAL
#define sig_dbg_buffer(n, b, s)
#define IDASIG_FEATURE_COMPRESSED
#define IDASIG_PARSE_MORE_MODULES_WITH_SAME_CRC
#define IDASIG_PARSE_READ_TAIL_BYTES
#define IDASIG_PARSE_MORE_PUBLIC_NAMES
static ut8 parse_leaf(ParseStatus *b, RzFlirtNode *node)
RZ_API void Ht_() free(HtName_(Ht) *ht)
return memset(p, 0, total)
RZ_API RZ_BORROW void * rz_list_iter_get_next_data(RzListIter *list)
returns the value stored in the next RzList iterator
RZ_API RZ_OWN RzList * rz_list_newf(RzListFree f)
Returns a new initialized RzList pointer and sets the free method.
RZ_API RZ_BORROW void * rz_list_last(RZ_NONNULL const RzList *list)
Returns the last element of the list.
RZ_API ut32 rz_list_length(RZ_NONNULL const RzList *list)
Returns the length of the list.
RZ_API RZ_BORROW RzListIter * rz_list_append(RZ_NONNULL RzList *list, void *data)
Appends at the end of the list a new element.
RZ_API void rz_list_free(RZ_NONNULL RzList *list)
Empties the list and frees the list pointer.
void * malloc(size_t size)
static const char struct stat static buf struct stat static buf static vhangup int options
#define header(is_bt, len_min, ret_op)
@ RZ_ANALYSIS_FCN_TYPE_LOC
@ RZ_ANALYSIS_FCN_TYPE_FCN
#define rz_return_val_if_fail(expr, val)
RZ_API ut64 rz_buf_tell(RZ_NONNULL RzBuffer *b)
Return the current cursor position.
RZ_API bool rz_buf_append_bytes(RZ_NONNULL RzBuffer *b, RZ_NONNULL const ut8 *buf, ut64 len)
Append an array of bytes to the buffer.
RZ_API st64 rz_buf_seek(RZ_NONNULL RzBuffer *b, st64 addr, int whence)
Modify the current cursor position in the buffer.
RZ_API RZ_OWN RzBuffer * rz_buf_new_slurp(const char *file)
Creates a new buffer from a file.
RZ_API st64 rz_buf_append_string(RZ_NONNULL RzBuffer *b, RZ_NONNULL const char *str)
Append a string to the buffer.
RZ_API RZ_OWN RzBuffer * rz_buf_new_with_pointers(const ut8 *bytes, ut64 len, bool steal)
Creates a new buffer with a bytes array.
#define rz_buf_read_le16(b, result)
Read a big endian or little endian (ut16, ut32, ut64) at the specified offset in the buffer and shift...
#define rz_buf_read_le32(b, result)
RZ_API void rz_buf_free(RzBuffer *b)
Free all internal data hold by the buffer and the buffer.
RZ_API RZ_OWN RzBuffer * rz_buf_new_empty(ut64 len)
Creates a new empty buffer with a predefined size;.
RZ_API st64 rz_buf_read(RZ_NONNULL RzBuffer *b, RZ_NONNULL RZ_OUT ut8 *buf, ut64 len)
RZ_API ut64 rz_buf_size(RZ_NONNULL RzBuffer *b)
Return the size of the buffer.
RZ_API bool rz_deflatew_buf(RZ_NONNULL RzBuffer *src, RZ_NONNULL RzBuffer *dst, ut64 block_size, ut8 *src_consumed, int wbits)
RZ_API ut8 * rz_inflate_ignore_header(RZ_NONNULL const ut8 *src, int srcLen, int *srcConsumed, int *dstLen)
inflate zlib compressed or gzipped. The input must be a raw stream with no header or trailer.
RZ_API ut8 * rz_inflate(RZ_NONNULL const ut8 *src, int srcLen, int *srcConsumed, int *dstLen)
inflate zlib compressed or gzipped, automatically accepts either the zlib or gzip format,...
RZ_API RZ_OWN RzFlirtNode * rz_sign_flirt_parse_string_pattern_from_buffer(RZ_NONNULL RzBuffer *flirt_buf, ut32 optimization, RZ_NULLABLE RzFlirtInfo *info)
Parses the RzBuffer containing a FLIRT signature in string format and returns an RzFlirtNode.
@ RZ_FLIRT_NODE_OPTIMIZE_MAX
optimize the tree structure and drops the tail bytes
#define RZ_FLIRT_LIBRARY_NAME_MAX
@ RZ_FLIRT_FILE_TYPE_SIG
.sig compressed pattern file
#define RZ_FLIRT_NAME_MAX
void(* RzListFree)(void *ptr)
#define RZ_LOG_WARN(fmtstr,...)
#define RZ_LOG_DEBUG(fmtstr,...)
#define RZ_LOG_ERROR(fmtstr,...)
RZ_API bool rz_name_filter(char *name, int len, bool strict)
#define RZ_STR_ISNOTEMPTY(x)
RZ_API const char * rz_str_lchr(const char *str, char chr)
RZ_API char * rz_str_newf(const char *fmt,...) RZ_PRINTF_CHECK(1
#define RZ_STR_ISEMPTY(x)
static struct sockaddr static addrlen static backlog const void static flags void flags
RzFlagGetAtBySpaces get_at_by_spaces
char name[RZ_FLIRT_NAME_MAX]
struct rz_list_iter_t * n
ut64(WINAPI *w32_GetEnabledXStateFeatures)()