vmread-sys 0.1.1

Raw FFI bindings to vmread
Documentation
extern crate bindgen;

use std::env;
use std::path::PathBuf;

fn main() {
    if cfg!(debug_assertions) {
        println!("cargo:rustc-link-lib=asan");
    }
    println!("cargo:rerun-if-changed=wrapper.h");

    let src = [
        "vmread/wintools.c",
        "vmread/pmparser.c",
        "vmread/mem.c",
        if cfg!(feature="kmod_rw") || cfg!(feature="internal_rw") {
            "vmread/intmem.c"
        } else {
            "vmread/vmmem.c"
        },
    ];

    for i in &src {
        println!("cargo:rerun-if-changed={}", i);
    }

    let mut builder = cc::Build::new();

    let mut build = builder
        .files(src.iter())
        .define("LMODE",
            if cfg!(feature="internal_rw") {
                "MODE_QEMU_INJECT"
            } else {
                "MODE_EXTERNAL"
            })
        ;

    if cfg!(debug_assertions) {
        build = build.flag("-fsanitize=address")
            .define("MVERBOSE", "4")
            ;
    }

    if cfg!(feature="kmod_rw") {
        build = build.define("KMOD_MEMMAP", None);
    }

    build.compile("vmread");

    let bindings = bindgen::Builder::default()
        .header("wrapper.h")
        .parse_callbacks(Box::new(bindgen::CargoCallbacks))
        .derive_default(true)
        .whitelist_function(".*Mem.*")
        .whitelist_function("VTranslate")
        .whitelist_function(".*Context")
        .whitelist_function("GetNTHeader")
        .whitelist_function(".*Export.*")
        .whitelist_function(".*Proc.*")
        .whitelist_function(".*Module.*")
        .whitelist_function("GetPeb.*")
        .whitelist_var("vmread_dfile")
        .blacklist_type("_IO_.*")
        .blacklist_type("FILE")
        .generate()
        .expect("Unable to generate bindings");

    let out_path = PathBuf::from(env::var("OUT_DIR").unwrap());

    bindings
        .write_to_file(out_path.join("bindings.rs"))
        .expect("Couldn't write bindings!");
}