yaxpeax_core/memory/reader/
mod.rs

1use std::collections::HashMap;
2use std::io::Read;
3
4use memory::repr::FlatMemoryRepr;
5use memory::repr::process::ModuleData;
6
7use std::fs::OpenOptions;
8use std::path::Path;
9
10pub mod hex;
11
12pub enum FileRepr {
13    IntelHEX(HashMap<u8, FlatMemoryRepr>),
14    Executable(ModuleData),
15    Flat(FlatMemoryRepr)
16}
17
18pub fn load_from_path(path: &Path) -> Result<FileRepr, String> {
19    let mut file = OpenOptions::new().read(true).open(path).unwrap();
20
21    let metadata = match file.metadata() {
22        Ok(metadata) => metadata,
23        Err(e) => { return Err(e.to_string()); }
24    };
25    let mut bytes = vec![0; metadata.len() as usize];
26    match file.read(&mut bytes) {
27        Ok(_) => { },
28        Err(e) => { return Err(e.to_string()); }
29    };
30
31    match hex::from_hex(&bytes) {
32        Ok(repr) => Ok(FileRepr::IntelHEX(repr)),
33        Err(e) => {
34            println!("{}", e);
35            match ModuleData::load_from(&bytes, format!("{}", path.display())) {
36                Some(data) => { Ok(FileRepr::Executable(data)) }
37                None => {
38                    Ok(FileRepr::Flat({
39                        let mut repr = FlatMemoryRepr::of(bytes);
40                        if let Some(x) = path.to_str() {
41                            repr.name = x.to_owned();
42                        };
43                        repr
44                    }))
45                }
46            }
47        }
48    }
49}