1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
mod native;
use native::*;
use std::fs::OpenOptions;
use std::path::Path;
use memflow::*;
use memflow_derive::*;
use std::fs::File;
#[cfg(feature = "filemap")]
pub type CoreDump<'a> = ReadMappedFilePhysicalMemory<'a>;
#[cfg(not(feature = "filemap"))]
pub type CoreDump<'a> = FileIOMemory<File>;
pub fn parse_file<P: AsRef<Path>>(path: P) -> Result<(MemoryMap<(Address, usize)>, File)> {
let mut file = OpenOptions::new()
.read(true)
.write(false)
.open(path)
.map_err(|_| Error::Connector("unable to open coredump file"))?;
let mem_map = parse_coredump64(&mut file).or_else(|_| parse_coredump32(&mut file))?;
Ok((mem_map, file))
}
#[connector(name = "coredump")]
pub fn create_connector<'a>(args: &ConnectorArgs) -> Result<CoreDump<'a>> {
let (map, file) = parse_file(
args.get("file")
.or_else(|| args.get_default())
.ok_or_else(|| Error::Connector("no path specified"))?,
)?;
#[cfg(feature = "filemap")]
{
Ok(MMAPInfo::try_with_filemap(file, map)?.into_connector())
}
#[cfg(not(feature = "filemap"))]
{
Ok(CoreDump::try_with_reader(file, map)?.into_connector())
}
}
#[cfg(test)]
mod tests {
use super::*;
use std::path::PathBuf;
#[test]
fn parse_win10_64bit() {
let path = PathBuf::from(env!("CARGO_MANIFEST_DIR"))
.join("resources/test/coredump_win10_64bit_stripped.raw");
parse_file(path).unwrap();
}
#[test]
fn parse_win7_32bit() {
let path = PathBuf::from(env!("CARGO_MANIFEST_DIR"))
.join("resources/test/coredump_win7_32bit_stripped.raw");
parse_file(path).unwrap();
}
}