basic_process_list/
basic-process-list.rs1use isr::cache::{IsrCache, JsonCodec};
2use vmi::{
3 VcpuId, VmiCore, VmiSession,
4 arch::amd64::Amd64,
5 driver::xen::VmiXenDriver,
6 os::{VmiOsProcess as _, windows::WindowsOs},
7};
8use xen::XenStore;
9
10fn main() -> Result<(), Box<dyn std::error::Error>> {
11 let domain_id = 'x: {
12 for name in &["win7", "win10", "win11", "ubuntu22"] {
13 if let Some(domain_id) = XenStore::new()?.domain_id_from_name(name)? {
14 break 'x domain_id;
15 }
16 }
17
18 panic!("Domain not found");
19 };
20
21 let driver = VmiXenDriver::<Amd64>::new(domain_id)?;
23 let core = VmiCore::new(driver)?;
24
25 let kernel_info = {
28 let _pause_guard = core.pause_guard()?;
30
31 let registers = core.registers(VcpuId(0))?;
33
34 WindowsOs::find_kernel(&core, ®isters)?.expect("kernel information")
43 };
44
45 let isr = IsrCache::<JsonCodec>::new("cache")?;
48 let entry = isr.entry_from_codeview(kernel_info.codeview)?;
49 let profile = entry.profile()?;
50
51 tracing::info!("Creating VMI session");
53 let os = WindowsOs::<VmiXenDriver<Amd64>>::new(&profile)?;
54 let session = VmiSession::new(&core, &os);
55
56 let _pause_guard = session.pause_guard()?;
58
59 let registers = session.registers(VcpuId(0))?;
61 let vmi = session.with_registers(®isters);
62
63 for process in vmi.os().processes()? {
65 let process = process?;
66
67 println!(
68 "{} [{}] {} (root @ {})",
69 process.object()?,
70 process.id()?,
71 process.name()?,
72 process.translation_root()?
73 );
74 }
75
76 Ok(())
77}