diff --git a/filesys.c b/filesys.c index cc78f7d..21ddb12 100755 --- a/filesys.c +++ b/filesys.c @@ -168,6 +168,7 @@ memory_source_init(void) return; if (!STREQ(pc->live_memsrc, "/dev/mem") && + !STRNEQ(pc->live_memsrc, "/dev/sd") && STREQ(pc->live_memsrc, pc->memory_device)) { if (memory_driver_init()) return; @@ -188,6 +189,11 @@ memory_source_init(void) strerror(errno)); } else pc->flags |= MFD_RDWR; + } else if (STRNEQ(pc->live_memsrc, "/dev/sd")) { + if ((pc->mfd = open(pc->live_memsrc, O_RDONLY)) < 0) + error(FATAL, "%s: %s\n", + pc->live_memsrc, + strerror(errno)); } else if (STREQ(pc->live_memsrc, "/proc/kcore")) { if ((pc->mfd = open("/proc/kcore", O_RDONLY)) < 0) error(FATAL, "/proc/kcore: %s\n", diff --git a/main.c b/main.c index 7650b8c..20266a8 100755 --- a/main.c +++ b/main.c @@ -449,6 +449,19 @@ main(int argc, char **argv) pc->writemem = write_dev_mem; pc->live_memsrc = argv[optind]; + } else if (STRNEQ(argv[optind], "/dev/sd")) { + if (pc->flags & MEMORY_SOURCES) { + error(INFO, + "too many dumpfile arguments\n"); + program_usage(SHORT_FORM); + } + pc->flags |= DEVMEM; + pc->dumpfile = NULL; + pc->readmem = read_dev_mem; + pc->writemem = write_dev_mem; + pc->live_memsrc = argv[optind]; + pc->program_pid = 1; + } else if (is_proc_kcore(argv[optind], KCORE_LOCAL)) { if (pc->flags & MEMORY_SOURCES) { error(INFO,