static int check_pagemap(void) { int ret, fd; u64 pfn = 0; fd = __open_proc(PROC_SELF, EPERM, O_RDONLY, "pagemap"); if (fd < 0) { if (errno == EPERM) { pr_info("Pagemap disabled"); kdat.pmap = PM_DISABLED; return 0; } return -1; } /* Get the PFN of some present page. Stack is here, so try it :) */ ret = pread(fd, &pfn, sizeof(pfn), (((unsigned long)&ret) / page_size()) * sizeof(pfn)); if (ret != sizeof(pfn)) { pr_perror("Can't read pagemap"); return -1; } close(fd); if ((pfn & PME_PFRAME_MASK) == 0) { pr_info("Pagemap provides flags only\n"); kdat.pmap = PM_FLAGS_ONLY; } else { pr_info("Pagemap is fully functional\n"); kdat.pmap = PM_FULL; } return 0; }
static RIODesc *__open(RIO *io, const char *file, int rw, int mode) { if (__plugin_open (io, file, 0)) { char *pidpath; RIODesc *ret; RIOW32Dbg *dbg = R_NEW0 (RIOW32Dbg); if (!dbg) { return NULL; } dbg->pid = atoi (file + 9); if (__open_proc (dbg, !strncmp (file, "attach://", 9)) == -1) { free (dbg); return NULL; } pidpath = r_sys_pid_to_path (dbg->pid); ret = r_io_desc_new (io, &r_io_plugin_w32dbg, file, rw | R_PERM_X, mode, dbg); ret->name = pidpath; return ret; } return NULL; }