use std::fmt::Debug;
use vmi_core::{Va, VmiError, VmiOs, os::ProcessObject};
use super::ProfileRef;
pub trait ReactorModule<Os>: Debug + Copy + 'static
where
Os: VmiOs + 'static,
{
const METADATA: &'static [ModuleMetadata<Self, Os>];
const KERNEL_SLOT: usize;
fn slot(self) -> usize;
}
pub enum ModuleMode<Os>
where
Os: VmiOs + 'static,
{
Kernel,
User {
process: Option<ModuleProcessFilter<Os>>,
},
}
pub enum ModuleProcessFilter<Os>
where
Os: VmiOs + 'static,
{
Name(&'static str),
Predicate(&'static dyn for<'a, 'b> Fn(&'a Os::Process<'b>) -> Result<bool, VmiError>),
}
pub struct ModuleMetadata<Module, Os>
where
Module: ReactorModule<Os>,
Os: VmiOs + 'static,
{
pub name: &'static str,
pub module: Option<Module>,
pub mode: ModuleMode<Os>,
pub optional: bool,
}
pub struct ResolvedModule<'a> {
pub process: Option<ProcessObject>,
pub base_address: Va,
pub profile: ProfileRef<'a>,
}