diff --git a/crates/vestal/src/execute.rs b/crates/vestal/src/execute.rs index e418ac8..b70dae8 100644 --- a/crates/vestal/src/execute.rs +++ b/crates/vestal/src/execute.rs @@ -2,16 +2,8 @@ use crate::*; impl Vestal { pub fn execute (&self, path: impl AsRef) -> Usually<()> { - Self::with_pe(&path, |pe|{ - println!("PE: {}", path.as_ref().display()); - let mut main = None; - for export in pe.exports.iter() { - if let Some("VSTPluginMain") = export.name { - println!("VSTPluginMain: {:?} + {:?}", &export.rva, &export.offset); - main = Some(export); - break - } - } + Self::with_pe(&path, |pe, main, deps|{ + }) } } diff --git a/crates/vestal/src/inspect.rs b/crates/vestal/src/inspect.rs index 36b3890..39fee96 100644 --- a/crates/vestal/src/inspect.rs +++ b/crates/vestal/src/inspect.rs @@ -2,26 +2,15 @@ use crate::*; impl Vestal { pub fn inspect (&self, path: impl AsRef) -> Usually<()> { - Self::with_pe(&path, |pe|{ - println!("PE: {}", path.as_ref().display()); - for export in pe.exports.iter() { - if let Some("VSTPluginMain") = export.name { - println!("VSTPluginMain: {:?} + {:?}", &export.rva, &export.offset); - break - } + Self::with_pe(&path, |pe, main, deps|{ + if let Some(main) = main { + println!("VSTPluginMain: {:?} + {:?}", &main.rva, &main.offset); + } else { + panic!("VSTPluginMain not found. This is not a valid VST plugin."); } - use std::collections::HashMap; - let mut imports: HashMap> = Default::default(); println!("Imports: {:#?}", &pe.imports.len()); - for import in pe.imports.iter() { - let dll = import.dll.clone(); - if !imports.contains_key(dll) { - imports.insert(dll.to_string(), vec![]); - } - imports.get_mut(dll).unwrap().push(import); - } - println!("Dependencies: {:#?}", &imports.len()); - for (dll, imports) in imports.iter() { + println!("Dependencies: {:#?}", &deps.len()); + for (dll, imports) in deps.iter() { println!("- {dll}"); for import in imports.iter() { println!(" {:8} + {:8} {:32}", import.rva, import.offset, import.name); diff --git a/crates/vestal/src/main.rs b/crates/vestal/src/main.rs index 7bea55e..df0162b 100644 --- a/crates/vestal/src/main.rs +++ b/crates/vestal/src/main.rs @@ -1,11 +1,9 @@ -pub(crate) use std::path::Path; -pub(crate) use goblin::{error, Object, pe::PE, pe::import::Import}; -//pub(crate) use exe::pe::{PE, VecPE}; -//pub(crate) use exe::types::{ImportDirectory, ImportData, CCharString}; -use clap::Parser; - mod execute; mod inspect; +pub(crate) use std::path::Path; +pub(crate) use goblin::{error, Object, pe::{PE, import::Import, export::Export}}; +use std::collections::HashMap; +use clap::Parser; type Usually = Result>; @@ -29,10 +27,30 @@ impl Vestal { Self::Execute { path } => self.execute(path.as_str()), } } - pub fn with_pe (path: &impl AsRef, cb: impl Fn(&PE<'_>)) -> Usually<()> { + pub fn with_pe ( + path: &impl AsRef, + cb: impl Fn(&PE, Option<&Export>, HashMap>) + ) -> Usually<()> { + println!("PE: {}", path.as_ref().display()); let buffer = std::fs::read(path.as_ref())?; if let Object::PE(ref pe) = Object::parse(&buffer)? { - cb(pe); + let mut main = None; + let mut imports: HashMap<_, _> = Default::default(); + for import in pe.imports.iter() { + let dll = import.dll.clone(); + if !imports.contains_key(dll) { + imports.insert(dll.to_string(), vec![]); + } + imports.get_mut(dll).unwrap().push(import); + } + for export in pe.exports.iter() { + if let Some("VSTPluginMain") = export.name { + println!("VSTPluginMain: {:?} + {:?}", &export.rva, &export.offset); + main = Some(export); + break + } + } + cb(pe, main, imports); Ok(()) } else { Err("not a PE".into())