wdext 0.1.0

A DbgEng wrapper framework
// SPDX-FileCopyrightText: 2026 takubokudori
// SPDX-License-Identifier: MIT OR Apache-2.0
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}");
}