mbr.rs 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. #![allow(dead_code)]
  2. use core::default::Default;
  3. /// @brief MBR硬盘分区表项的结构
  4. #[repr(packed)]
  5. #[derive(Debug, Clone, Copy)]
  6. pub struct MbrDiskPartitionTableEntry {
  7. pub flags: u8, // 引导标志符,标记此分区为活动分区
  8. pub starting_head: u8, // 起始磁头号
  9. pub starting_sector_cylinder: u16, // sector : 低6, cylinder : 高10; 起始扇区号 + 起始柱面号
  10. pub part_type: u8, // 分区类型ID
  11. pub ending_head: u8, // 结束磁头号
  12. pub ending_sector_cylingder: u16, // ending_sector : 低6, ending_cylinder : 高10; 结束扇区号 + 结束柱面号
  13. pub starting_lba: u32, // 起始逻辑扇区
  14. pub total_sectors: u32, // 分区占用的磁盘扇区数
  15. }
  16. impl MbrDiskPartitionTableEntry {
  17. pub fn starting_sector(&self) -> u16 {
  18. return self.starting_sector_cylinder & ((1 << 6) - 1) as u16;
  19. }
  20. pub fn starting_cylinder(&self) -> u16 {
  21. return (self.starting_sector_cylinder >> 6) & ((1 << 10) - 1) as u16;
  22. }
  23. pub fn ending_sector(&self) -> u16 {
  24. return self.ending_sector_cylingder & ((1 << 6) - 1) as u16;
  25. }
  26. pub fn ending_cylinder(&self) -> u16 {
  27. return (self.ending_sector_cylingder >> 6) & ((1 << 10) - 1) as u16;
  28. }
  29. }
  30. /// @brief MBR磁盘分区表结构体
  31. #[repr(packed)]
  32. #[derive(Debug, Clone, Copy)]
  33. pub struct MbrDiskPartionTable {
  34. pub reserved: [u8; 446],
  35. pub dpte: [MbrDiskPartitionTableEntry; 4], // 磁盘分区表项
  36. pub bs_trailsig: u16,
  37. }
  38. impl Default for MbrDiskPartitionTableEntry {
  39. fn default() -> Self {
  40. MbrDiskPartitionTableEntry {
  41. flags: 0,
  42. starting_head: 0,
  43. starting_sector_cylinder: 0,
  44. part_type: 0,
  45. ending_head: 0,
  46. ending_sector_cylingder: 0,
  47. starting_lba: 0,
  48. total_sectors: 0,
  49. }
  50. }
  51. }
  52. impl Default for MbrDiskPartionTable {
  53. fn default() -> Self {
  54. MbrDiskPartionTable {
  55. reserved: [0; 446],
  56. dpte: [Default::default(); 4],
  57. bs_trailsig: Default::default(),
  58. }
  59. }
  60. }