#include #include #include #include #include #include #include #include #include "procfs.h" int procfs_open(pid_t pid) { char path[2048]; sprintf(path, "/proc/%d/mem", pid); return open(path, O_RDWR); } ssize_t procfs_maps(pid_t pid, struct procfs_map **maps) { char path[2048]; sprintf(path, "/proc/%d/maps", pid); FILE *f = fopen(path, "r"); if (!f) return -1; int n = 0; int capacity = 2; *maps = calloc(capacity, sizeof(**maps)); if (!*maps) return -1; while (1) { void *base, *max; int matches = fscanf(f, "%p-%p", &base, &max); if (matches == EOF) goto eof; if (matches < 2) goto err; int c; while ((c = getc(f)) != '\n') if (c == EOF) goto eof; n++; if (n > capacity) { capacity <<= 1; struct procfs_map *r = reallocarray(*maps, capacity, sizeof(*r)); if (!r) goto err; *maps = r; } (*maps)[n - 1].base = (uintptr_t) base; (*maps)[n - 1].max = (uintptr_t) max; } eof: if (ferror(f)) goto err; if (n == 0) free(*maps); return n; err: free(*maps); return -1; } int read_page(int fd, uintptr_t index, uint8_t *data) { if (lseek(fd, index * PAGE_SIZE, SEEK_SET) == -1) return -1; size_t n = 0; while (n < PAGE_SIZE) { ssize_t result = read(fd, data + n, PAGE_SIZE - n); if (result == -1) return -1; n += result; } return 0; }