vmi_core/ctx/
context.rs

1use super::{VmiOsState, state::VmiState};
2use crate::{VmiCore, VmiDriver, VmiEvent, os::VmiOs};
3
4/// A VMI context.
5///
6/// The context combines access to a [`VmiState`] with [`VmiEvent`] to
7/// provide unified access to VMI operations in the context of a specific
8/// event.
9///
10/// This structure is created inside the [`VmiSession::handle`] method and
11/// passed to the [`VmiHandler::handle_event`] method to handle VMI events.
12///
13/// [`VmiHandler::handle_event`]: crate::VmiHandler::handle_event
14pub struct VmiContext<'a, Driver, Os>
15where
16    Driver: VmiDriver,
17    Os: VmiOs<Driver>,
18{
19    /// The VMI session.
20    state: &'a VmiState<'a, Driver, Os>,
21
22    /// The VMI event.
23    event: &'a VmiEvent<Driver::Architecture>,
24}
25
26impl<Driver, Os> Clone for VmiContext<'_, Driver, Os>
27where
28    Driver: VmiDriver,
29    Os: VmiOs<Driver>,
30{
31    fn clone(&self) -> Self {
32        *self
33    }
34}
35
36impl<Driver, Os> Copy for VmiContext<'_, Driver, Os>
37where
38    Driver: VmiDriver,
39    Os: VmiOs<Driver>,
40{
41}
42
43impl<'a, Driver, Os> std::ops::Deref for VmiContext<'a, Driver, Os>
44where
45    Driver: VmiDriver,
46    Os: VmiOs<Driver>,
47{
48    type Target = VmiState<'a, Driver, Os>;
49
50    fn deref(&self) -> &Self::Target {
51        self.state
52    }
53}
54
55impl<'a, Driver, Os> VmiContext<'a, Driver, Os>
56where
57    Driver: VmiDriver,
58    Os: VmiOs<Driver>,
59{
60    /// Creates a new VMI context.
61    pub fn new(
62        state: &'a VmiState<'a, Driver, Os>,
63        event: &'a VmiEvent<Driver::Architecture>,
64    ) -> Self {
65        debug_assert_eq!(state.registers() as *const _, event.registers() as *const _);
66
67        Self { state, event }
68    }
69
70    // Note that `core()` and `underlying_os()` and other methods are delegated
71    // to the `VmiState`.
72
73    /// Returns the VMI session.
74    pub fn state(&self) -> VmiState<'a, Driver, Os> {
75        *self.state
76    }
77
78    /// Returns the current VMI event.
79    pub fn event(&self) -> &VmiEvent<Driver::Architecture> {
80        self.event
81    }
82
83    /// Returns a wrapper providing access to OS-specific operations.
84    pub fn os(&self) -> VmiOsContext<'_, Driver, Os> {
85        VmiOsContext {
86            state: self.state.os(),
87            event: self.event,
88        }
89    }
90}
91
92/// Wrapper providing access to OS-specific operations.
93pub struct VmiOsContext<'a, Driver, Os>
94where
95    Driver: VmiDriver,
96    Os: VmiOs<Driver>,
97{
98    /// The VMI OS state.
99    state: VmiOsState<'a, Driver, Os>,
100
101    /// The VMI event.
102    event: &'a VmiEvent<Driver::Architecture>,
103}
104
105impl<'a, Driver, Os> std::ops::Deref for VmiOsContext<'a, Driver, Os>
106where
107    Driver: VmiDriver,
108    Os: VmiOs<Driver>,
109{
110    type Target = VmiOsState<'a, Driver, Os>;
111
112    fn deref(&self) -> &Self::Target {
113        &self.state
114    }
115}
116
117impl<Driver, Os> VmiOsContext<'_, Driver, Os>
118where
119    Driver: VmiDriver,
120    Os: VmiOs<Driver>,
121{
122    /// Returns the VMI context.
123    pub fn core(&self) -> &VmiCore<Driver> {
124        self.state.core()
125    }
126
127    /// Returns the underlying OS-specific implementation.
128    pub fn underlying_os(&self) -> &Os {
129        self.state.underlying_os()
130    }
131
132    /// Returns the current VMI event.
133    pub fn event(&self) -> &VmiEvent<Driver::Architecture> {
134        self.event
135    }
136}