1004e86ffSlogin #![allow(dead_code)] 2004e86ffSlogin use core::default::Default; 3004e86ffSlogin 4004e86ffSlogin /// @brief MBR硬盘分区表项的结构 5004e86ffSlogin #[repr(packed)] 6*b5b571e0SLoGin #[derive(Debug, Clone, Copy, Default)] 7004e86ffSlogin pub struct MbrDiskPartitionTableEntry { 8004e86ffSlogin pub flags: u8, // 引导标志符,标记此分区为活动分区 9004e86ffSlogin pub starting_head: u8, // 起始磁头号 10004e86ffSlogin pub starting_sector_cylinder: u16, // sector : 低6, cylinder : 高10; 起始扇区号 + 起始柱面号 11004e86ffSlogin pub part_type: u8, // 分区类型ID 12004e86ffSlogin pub ending_head: u8, // 结束磁头号 13004e86ffSlogin pub ending_sector_cylingder: u16, // ending_sector : 低6, ending_cylinder : 高10; 结束扇区号 + 结束柱面号 14004e86ffSlogin pub starting_lba: u32, // 起始逻辑扇区 15004e86ffSlogin pub total_sectors: u32, // 分区占用的磁盘扇区数 16004e86ffSlogin } 17004e86ffSlogin 18004e86ffSlogin impl MbrDiskPartitionTableEntry { 19004e86ffSlogin pub fn starting_sector(&self) -> u16 { 20004e86ffSlogin return self.starting_sector_cylinder & ((1 << 6) - 1) as u16; 21004e86ffSlogin } 22004e86ffSlogin pub fn starting_cylinder(&self) -> u16 { 23004e86ffSlogin return (self.starting_sector_cylinder >> 6) & ((1 << 10) - 1) as u16; 24004e86ffSlogin } 25004e86ffSlogin pub fn ending_sector(&self) -> u16 { 26004e86ffSlogin return self.ending_sector_cylingder & ((1 << 6) - 1) as u16; 27004e86ffSlogin } 28004e86ffSlogin pub fn ending_cylinder(&self) -> u16 { 29004e86ffSlogin return (self.ending_sector_cylingder >> 6) & ((1 << 10) - 1) as u16; 30004e86ffSlogin } 31004e86ffSlogin } 32004e86ffSlogin 33004e86ffSlogin /// @brief MBR磁盘分区表结构体 34004e86ffSlogin #[repr(packed)] 35004e86ffSlogin #[derive(Debug, Clone, Copy)] 36004e86ffSlogin pub struct MbrDiskPartionTable { 37004e86ffSlogin pub reserved: [u8; 446], 38004e86ffSlogin pub dpte: [MbrDiskPartitionTableEntry; 4], // 磁盘分区表项 39004e86ffSlogin pub bs_trailsig: u16, 40004e86ffSlogin } 41004e86ffSlogin 42004e86ffSlogin impl Default for MbrDiskPartionTable { 43004e86ffSlogin fn default() -> Self { 44004e86ffSlogin MbrDiskPartionTable { 45004e86ffSlogin reserved: [0; 446], 46004e86ffSlogin dpte: [Default::default(); 4], 47004e86ffSlogin bs_trailsig: Default::default(), 48004e86ffSlogin } 49004e86ffSlogin } 50004e86ffSlogin } 51