vmi_os_windows/comps/
session.rs1use vmi_core::{Architecture, Va, VmiDriver, VmiError, VmiState, VmiVa, os::ProcessObject};
2
3use super::{WindowsObject, WindowsProcess, macros::impl_offsets};
4use crate::{ArchAdapter, ListEntryIterator, WindowsOs};
5
6pub struct WindowsSession<'a, Driver>
18where
19 Driver: VmiDriver,
20 Driver::Architecture: Architecture + ArchAdapter<Driver>,
21{
22 vmi: VmiState<'a, Driver, WindowsOs<Driver>>,
24
25 va: Va,
27}
28
29impl<'a, Driver> From<WindowsSession<'a, Driver>> for WindowsObject<'a, Driver>
30where
31 Driver: VmiDriver,
32 Driver::Architecture: Architecture + ArchAdapter<Driver>,
33{
34 fn from(value: WindowsSession<'a, Driver>) -> Self {
35 Self::new(value.vmi, value.va)
36 }
37}
38
39impl<Driver> VmiVa for WindowsSession<'_, Driver>
40where
41 Driver: VmiDriver,
42 Driver::Architecture: Architecture + ArchAdapter<Driver>,
43{
44 fn va(&self) -> Va {
45 self.va
46 }
47}
48
49impl<'a, Driver> WindowsSession<'a, Driver>
50where
51 Driver: VmiDriver,
52 Driver::Architecture: Architecture + ArchAdapter<Driver>,
53{
54 impl_offsets!();
55
56 pub fn new(vmi: VmiState<'a, Driver, WindowsOs<Driver>>, va: Va) -> Self {
58 Self { vmi, va }
59 }
60
61 pub fn id(&self) -> Result<u32, VmiError> {
67 let offsets = self.offsets();
68 let MM_SESSION_SPACE = &offsets._MM_SESSION_SPACE;
69
70 self.vmi
71 .read_u32(self.va + MM_SESSION_SPACE.SessionId.offset())
72 }
73
74 pub fn processes(
80 &'a self,
81 ) -> Result<impl Iterator<Item = Result<WindowsProcess<'a, Driver>, VmiError>>, VmiError> {
82 let offsets = self.offsets();
83 let MM_SESSION_SPACE = &offsets._MM_SESSION_SPACE;
84 let EPROCESS = &offsets._EPROCESS;
85
86 Ok(ListEntryIterator::new(
87 self.vmi,
88 self.va + MM_SESSION_SPACE.ProcessList.offset(),
89 EPROCESS.SessionProcessLinks.offset(),
90 )
91 .map(move |result| result.map(|entry| WindowsProcess::new(self.vmi, ProcessObject(entry)))))
92 }
93}