use pelite;
use pelite::pe32::{Rva, Va, Ptr, Pe, PeFile};
use pelite::{util::CStr, Pod};
use pelite::pattern as pat;
pub fn print(file: PeFile) {
for reg in &interfaces(file).unwrap() {
println!("{}!{:08X} {}", reg.dll_name, reg.offset, reg.name);
}
}
#[allow(unused)]
#[derive(Pod, Debug)]
#[repr(C)]
pub struct InterfaceReg {
create_fn: Va,
name: Ptr<CStr>,
next: Ptr<InterfaceReg>,
}
#[derive(Copy, Clone, Debug)]
pub struct Interface<'a> {
pub dll_name: &'a str,
pub name: &'a str,
pub offset: Rva,
}
pub fn interfaces<'a>(file: PeFile<'a>) -> pelite::Result<Vec<Interface<'a>>> {
let mut save = [0; 4];
let exports = file.exports()?.by()?;
let dll_name = exports.dll_name()?.to_str().unwrap();
let mut list = Vec::new();
let pat = pat!("68*{'} 68*{B8*'} B9???? E8${55 8BEC} C3");
let mut matches = file.scanner().matches_code(pat);
while matches.next(&mut save) {
let name = file.derva_c_str(save[1]).unwrap().to_str().unwrap();
let offset = save[2];
list.push(Interface { dll_name, name, offset });
}
Ok(list)
}