use crate::error::Result;
use crate::models::{GuestInfo, Options, Partition, Program};
use std::io::{Read, Seek};
#[derive(Debug, Clone, Default)]
pub struct AnalysisResult {
pub guest_info: GuestInfo,
pub programs: Vec<Program>,
pub warnings: Vec<String>,
}
pub trait VmDriver {
fn virtual_size(&self) -> u64;
fn read_range(&self, offset: u64, buf: &mut [u8]) -> Result<()>;
fn access_mode(&self) -> &str;
fn is_native(&self) -> bool;
fn recommended_chunk_size(&self) -> u64 {
1024 * 1024
}
}
pub trait MemoryMapper: Read + Seek {
fn read_at_offset(&mut self, offset: u64, buf: &mut [u8]) -> Result<usize>;
fn length(&self) -> u64;
}
pub trait OsInspector {
fn analyze(
&self,
driver: &dyn VmDriver,
partitions: &[Partition],
chunk_size: u64,
options: &Options,
) -> Result<AnalysisResult>;
}