use wdext::{
Memory, TargetContext, WdClient, WdControl,
data::DebugDisasmFlags,
dbgeng::{
client::{
DebugAttachProcessFlags, DebugCreateProcessCreateFlags,
ProcessServer,
},
control::TimeoutQuery,
},
};
fn main() {
let client = WdClient::create().unwrap();
let ctrl = WdControl::from_interface(client.as_interface()).unwrap();
let timeout = TimeoutQuery::from_secs(5);
ctrl.set_initial_break().unwrap();
client
.create_process_and_attach(
ProcessServer::Local,
r"C:\Windows\notepad.exe",
DebugCreateProcessCreateFlags::OnlyThisProcess,
None,
DebugAttachProcessFlags::Default,
)
.unwrap();
ctrl.wait_for_event(timeout).unwrap();
let ctx = TargetContext::new(&client, Memory::Virtual { uncached: false })
.unwrap();
let exec_status = ctrl.get_execution_status().unwrap();
println!("execution status = {exec_status:?}");
ctrl.step_into(timeout, None).unwrap();
let reg = ctx.register_view();
let rax = reg.read_value::<u64>("rbx").unwrap();
println!("rax={rax:#016x}");
let rip = reg.read_value::<u64>("rip").unwrap();
println!("rip={rip:#016x}");
let (disasm, _) = ctx
.control()
.disassemble(rip, DebugDisasmFlags::empty())
.unwrap();
println!("disasm = {disasm}");
}