mod common;
use core::ffi::c_void;
use dobby_rs_framework::framework::{ModuleHandle, params};
use std::ffi::CString;
#[inline(never)]
fn local_add(x: i32) -> i32 {
x + 7
}
fn main() -> dobby_rs_framework::Result<()> {
let p = local_add as *const () as *mut c_void;
let f: fn(i32) -> i32 = unsafe { params::cast_fn(p) };
println!("cast_fn(local_add)(1) = {}", f(1));
let mut buf = [0u8; 8];
let buf_ptr = buf.as_mut_ptr() as *mut c_void;
unsafe {
params::write_ptr_value(buf_ptr, 0x11223344u32);
let v: u32 = params::read_ptr_value(buf_ptr as *const c_void);
println!("read_ptr_value = 0x{v:08x}");
}
let m = ModuleHandle::open(common::DEMO_LIB)?;
println!("opened module: {}", m.lib_name());
#[cfg(windows)]
let sym = "GetCurrentThreadId";
#[cfg(unix)]
let sym = "puts";
let addr = m.wrapped_sym(sym);
println!("resolved {sym} = {:?}", addr);
let _typed: *mut u8 = params::cast_ptr(buf_ptr);
let _ = CString::new(sym).ok();
Ok(())
}