From 855e3c832cb83c68c8e97eb7f73adf92b645efbe Mon Sep 17 00:00:00 2001 From: the lemons Date: Mon, 6 Feb 2023 13:59:02 -0600 Subject: jump to mappings --- core.c | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 52 insertions(+), 2 deletions(-) diff --git a/core.c b/core.c index 96ba866..97e0288 100644 --- a/core.c +++ b/core.c @@ -22,6 +22,7 @@ static int mouse_y = 0; SDL_Window *window = NULL; SDL_Renderer *renderer = NULL; +pid_t pid; int mem_fd; struct viewer *viewer; @@ -35,6 +36,12 @@ static void add_scale(double amount) { pos_y -= mouse_y / scale; } +static uintptr_t current_addr() { + return to_addr( + pos_x + screen_width / 2 * scale, + pos_y + screen_width / 2 * scale); +} + static void goto_addr(uintptr_t addr) { int x, y; to_pos(addr, &x, &y); @@ -43,6 +50,40 @@ static void goto_addr(uintptr_t addr) { pos_y -= (double) screen_height / 2 * scale; } +static size_t closest_map(struct procfs_map *maps, size_t n, uintptr_t addr) { + uintptr_t min = -1; + size_t closest; + for (size_t i = 0; i < n; i++) { + uintptr_t base = maps[i].base; + uintptr_t diff = base > addr ? base - addr : addr - base; + if (diff < min) { + min = diff; closest = i; + } + } + return closest; +} + +static void next_map() { + struct procfs_map *maps; + int n = procfs_maps(pid, &maps); + if (n < 1) return; + size_t m = closest_map(maps, n, current_addr()); + goto_addr(maps[(m + 1) % n].base); + free(maps); +} + +static void prev_map() { + struct procfs_map *maps; + int n = procfs_maps(pid, &maps); + if (n < 1) return; + size_t m = closest_map(maps, n, current_addr()); + if (m != 0) + goto_addr(maps[m - 1].base); + else + goto_addr(maps[n - 1].base); + free(maps); +} + static void report_error() { fprintf(stderr, "SDL Error: %s\n", SDL_GetError()); exit(-1); @@ -101,6 +142,15 @@ static void handle_events() { add_scale((double) e.wheel.y / 2); refresh = true; break; + case SDL_KEYDOWN: + switch (e.key.keysym.sym) { + case SDLK_RIGHT: + next_map(); + break; + case SDLK_LEFT: + prev_map(); + break; + } default: break; } @@ -120,7 +170,7 @@ int main(int argc, char *argv[]) { fprintf(stderr, "todo: show usage\n"); return -1; } - int pid = atoi(argv[1]); + pid = atoi(argv[1]); if (pid == 0) { fprintf(stderr, "todo: show usage\n"); return -1; @@ -135,7 +185,7 @@ int main(int argc, char *argv[]) { if (!viewer) abort(); atexit(cleanup); - goto_addr(0x7fea87727000); + next_map(); int last_time = 0; int current_time = 0; -- cgit v1.2.3