use crate::boot_code::BootCodeId;
use crate::ebr::EbrChain;
use crate::gap::Gap;
use crate::mbr::MbrSector;
use crate::partition::TypeCode;
use crate::signature::DetectedFs;
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
pub enum Severity {
Info,
Low,
Medium,
High,
Critical,
}
#[derive(Debug, Clone)]
pub struct Anomaly {
pub severity: Severity,
pub kind: AnomalyKind,
pub offset: u64,
pub note: String,
}
#[derive(Debug, Clone, PartialEq)]
pub enum AnomalyKind {
NonZeroReserved,
MultipleBootable,
NoBootablePartition,
ResidualEntry { index: usize },
OverlappingPartitions { a: usize, b: usize },
OutOfBounds { index: usize },
ChsLbaInconsistency { index: usize },
EbrCycle,
EbrExcessiveDepth { depth: usize },
EbrSlackData { ebr_lba: u64 },
PrePartitionSpace { sector_count: u64 },
InterPartitionGap { lba_start: u64, lba_end: u64 },
PostPartitionSpace { lba_start: u64, sector_count: u64 },
SignatureMismatch {
index: usize,
declared: TypeCode,
detected: DetectedFs,
},
WipedBootCode,
ErasedBootCode,
UnknownBootCode,
HighEntropySlack { offset: u64, entropy: f64 },
}
#[derive(Debug, Clone)]
pub struct PartitionSummary {
pub index: usize,
pub lba_start: u64,
pub lba_end: u64,
pub byte_offset: u64,
pub byte_size: u64,
pub declared_type: TypeCode,
pub detected_fs: Option<DetectedFs>,
}
#[derive(Debug)]
pub struct MbrAnalysis {
pub mbr: MbrSector,
pub partitions: Vec<PartitionSummary>,
pub ebr_chain: EbrChain,
pub gaps: Vec<Gap>,
pub boot_code_id: BootCodeId,
pub disk_serial: u32,
pub anomalies: Vec<Anomaly>,
}