vmread 0.1.5

High-level Rust bindings to vmread
Documentation
extern crate vmread;
extern crate rand;

use std::time::{Duration, Instant};
use rand::SeedableRng;
use rand::Rng;
use rand::prng::XorShiftRng as CurRNG;
use std::io::Write;

fn rwtest(ctx: &vmread::sys::WinCtx, proc: &vmread::WinProcess, start_range: u64, end_range: u64, chunk_sizes: &[usize], chunk_counts: &[usize], read_size: usize) {
    let mut rng = CurRNG::seed_from_u64(0);

    for i in chunk_sizes {
        print!("0x{:x}", *i);
        for o in chunk_counts {
            let mut done_size = 0 as usize;
            let mut total_dur = Duration::new(0, 0);
            let mut calls = 0;
            let mut buf = vec![vec![0 as u8; *i]; *o];

            while done_size < read_size {
                let now = Instant::now();
                {
                    let mut rws = proc.rwlist(ctx);
                    let base_addr = rng.gen_range(start_range, end_range - (*i as u64 + 0x2000));
                
                    for u in buf.iter_mut() {
                        rws.read_arr(base_addr + rng.gen_range(0, 0x2000), &mut u[..*i]);
                    }
                }
                total_dur += now.elapsed();
                done_size += *i * *o;
                calls += 1;
            }

            let total_time = total_dur.as_micros() as f64;

            print!(", {:.2}, {:.2}", (done_size / 0x100000) as f64 / (total_time / 10e5) as f64, calls as f64 / (total_time / 10e5) as f64);
            std::io::stdout().flush().expect("");
        }
        println!("");
    }
}

fn main() {
    let ctx_ret = vmread::create_context(0);

    if ctx_ret.is_ok() {
        let (mut ctx, c_ctx) = ctx_ret.unwrap();
        println!("VMRead initialized!");

        let mut rng = CurRNG::seed_from_u64(0);

        loop {
            ctx.refresh_processes();
            let plen = ctx.process_list.len();
            let proc = ctx.process_list[rng.gen_range(0, plen)].refresh_modules(c_ctx);

            let avail_mods = proc.module_list.iter().filter(|&x| x.info.sizeOfModule > 0x400000).collect::<Vec<&vmread::WinDll>>();

            if avail_mods.len() > 0 {
                let tmod = avail_mods[rng.gen_range(0, avail_mods.len())].clone();
                println!("Found test module {} ({:x}) in {}", tmod.name, tmod.info.sizeOfModule, proc.name);
                rwtest(&c_ctx, proc, tmod.info.baseAddress, tmod.info.baseAddress + tmod.info.sizeOfModule,
                    &[
                        0x10000 as usize,
                        0x1000,
                        0x100,
                        0x10,
                        0x8
                    ],
                    &[
                        32 as usize,
                        8,
                        1
                    ], 0x100000 * 256);
                break;
            }
        }
    } else {
        let (eval, estr) = ctx_ret.err().unwrap();
        println!("Initialization error {}: {}", eval, estr);
    }
}