Add r_search_maps to ##search

This commit is contained in:
Dennis Goodlett 2021-12-28 20:14:20 +00:00 committed by pancake
parent efe2a28e94
commit d76bb693f2
3 changed files with 47 additions and 40 deletions

View File

@ -2453,45 +2453,6 @@ static void do_asm_search(RCore *core, struct search_parameters *param, const ch
r_cons_break_pop ();
}
static void do_read_search(RSearch *s, struct search_parameters *param) {
RListIter *iter;
RIOMap *map;
ut64 prevto = UT64_MAX;
ut64 prevfrom = UT64_MAX;
// TODO: update pattern search to work with this
if (s->mode != R_SEARCH_PATTERN) {
r_search_set_read_cb (s, &_cb_hit_sz, param);
}
r_cons_break_push (NULL, NULL);
r_list_foreach_prev (param->boundaries, iter, map) {
if (r_cons_is_breaked ()) {
break;
}
ut64 from = r_io_map_begin (map);
ut64 to = r_io_map_end (map);
if (prevto == from) { // absorb new search area into previous
prevto = to;
continue;
}
if (prevto != UT64_MAX && prevfrom != UT64_MAX) {
// do last search
eprintf ("Searching in [0x%" PFMT64x "-0x%" PFMT64x "]\n", prevfrom, prevto);
r_search_update_read (s, prevfrom, prevto);
}
prevto = to;
prevfrom = from;
}
if (prevto != UT64_MAX && prevfrom != UT64_MAX) {
eprintf ("Searching in [0x%" PFMT64x "-0x%" PFMT64x "]\n", prevfrom, prevto);
r_search_update_read (s, prevfrom, prevto);
}
r_cons_break_pop ();
}
static void do_string_search(RCore *core, RInterval search_itv, struct search_parameters *param) {
ut64 at;
ut8 *buf;
@ -4366,7 +4327,11 @@ again:
if (dosearch) {
do_string_search (core, search_itv, &param);
} else if (dosearch_read) {
do_read_search (search, &param);
// TODO: update pattern search to work with this
if (search->mode != R_SEARCH_PATTERN) {
r_search_set_read_cb (search, &_cb_hit_sz, &param);
}
r_search_maps (search, param.boundaries);
}
beach:
core->num->value = search->nhits;

View File

@ -103,6 +103,7 @@ R_API RList *r_search_find(RSearch *s, ut64 addr, const ut8 *buf, int len);
R_API RList *r_search_find_uds(RSearch *search, ut64 addr, const ut8 *data, size_t size, bool verbose);
R_API int r_search_update(RSearch *s, ut64 from, const ut8 *buf, long len);
R_API int r_search_update_read(RSearch *s, ut64 from, ut64 to);
R_API int r_search_maps(RSearch *s, RList /*<<RIOMap>>*/ *maps);
R_API void r_search_keyword_free(RSearchKeyword *kw);
R_API RSearchKeyword* r_search_keyword_new(const ut8 *kw, int kwlen, const ut8 *bm, int bmlen, const char *data);

View File

@ -529,6 +529,47 @@ R_API int r_search_update_read(RSearch *s, ut64 from, ut64 to) {
}
}
// TODO: show progress
R_API int r_search_maps(RSearch *s, RList *maps) {
r_return_val_if_fail (s && s->consb.is_breaked && maps, -1);
RListIter *iter;
RIOMap *m;
ut64 prevto = UT64_MAX;
ut64 prevfrom = UT64_MAX;
int ret = 0;
r_list_foreach_prev (maps, iter, m) {
if (s->consb.is_breaked ()) {
break;
}
ut64 from = r_io_map_begin (m);
ut64 to = r_io_map_end (m);
if (prevto == from) { // absorb new search area into previous
prevto = to;
continue;
}
if (prevto != UT64_MAX && prevfrom != UT64_MAX) {
// do last search
int tmp = r_search_update_read (s, prevfrom, prevto);
if (tmp < 0) {
return tmp;
}
ret += tmp;
}
prevto = to;
prevfrom = from;
}
if (prevto != UT64_MAX && prevfrom != UT64_MAX) {
int tmp = r_search_update_read (s, prevfrom, prevto);
if (tmp < 0) {
return tmp;
}
ret += tmp;
}
return ret;
}
static int listcb(RSearchKeyword *k, void *user, ut64 addr) {
RSearchHit *hit = R_NEW0 (RSearchHit);
if (!hit) {