1use alloc::vec::Vec;
9
10use super::Mbr;
11use crate::{Device, Error, PartitionDevice, PartitionEntry, Result};
12
13pub fn create_partition_device(
50 base_device: Device,
51 partition: &PartitionEntry,
52) -> Result<PartitionDevice> {
53 if !partition.is_valid() {
54 return Err(Error::InvalidParameter);
55 }
56
57 Ok(PartitionDevice::new_from_lba(
58 base_device,
59 partition.get_start_lba(),
60 partition.get_size_sectors(),
61 ))
62}
63
64pub fn scan_mbr_partitions(device: &Device) -> Result<Vec<(usize, PartitionEntry)>> {
98 let mbr = Mbr::read_from_device(device)?;
99
100 let mut partitions = Vec::new();
101 for (i, partition) in mbr.partitions.iter().enumerate() {
102 if partition.is_valid() {
103 partitions.push((i, *partition));
104 }
105 }
106
107 Ok(partitions)
108}
109
110pub fn validate_mbr(mbr: &crate::Mbr) -> Result<()> {
147 mbr.validate()
148}
149
150pub fn create_all_partition_devices(
189 base_device: Device,
190 mbr: &super::Mbr,
191) -> Result<Vec<PartitionDevice>> {
192 mbr.create_all_partition_devices(base_device)
193}
194
195pub fn find_partitions_by_type(
230 mbr: &super::Mbr,
231 partition_type: crate::PartitionKind,
232) -> Vec<(usize, &PartitionEntry)> {
233 mbr.find_partitions_by_type(partition_type)
234}
235
236pub fn has_valid_mbr(device: &Device) -> bool {
265 match Mbr::read_from_device(device) {
266 Ok(mbr) => mbr.is_valid(),
267 Err(_) => false,
268 }
269}
270
271pub fn is_gpt_disk(device: &Device) -> bool {
301 match Mbr::read_from_device(device) {
302 Ok(mbr) => mbr.has_gpt_protective_partition(),
303 Err(_) => false,
304 }
305}
306
307pub fn create_basic_mbr(
338 disk_signature: u32,
339 partition_type: crate::PartitionKind,
340 total_sectors: u32,
341) -> Result<super::Mbr> {
342 Mbr::create_basic(disk_signature, partition_type, total_sectors)
343}
344
345pub fn clone_mbr(source_device: &Device, target_device: &Device) -> Result<()> {
382 let mbr = Mbr::read_from_device(source_device)?;
383 mbr.validate()?;
384 mbr.write_to_device(target_device)?;
385 Ok(())
386}
387
388pub fn backup_mbr(device: &Device) -> Result<[u8; 512]> {
423 let mbr = Mbr::read_from_device(device)?;
424 Ok(mbr.to_bytes())
425}
426
427pub fn restore_mbr(device: &Device, backup: &[u8; 512]) -> Result<()> {
464 let mbr = Mbr::from_bytes(backup)?;
465 mbr.validate()?;
466 mbr.write_to_device(device)?;
467 Ok(())
468}
469
470pub fn format_disk_and_get_first_partition(
484 device: &Device,
485 partition_type: crate::PartitionKind,
486 disk_signature: Option<u32>,
487) -> Result<PartitionDevice> {
488 let mbr = if has_valid_mbr(device) {
490 Mbr::read_from_device(device)?
492 } else {
493 let device_size = device.get_size()?;
495 let block_size = device.get_block_size()?;
496 let total_sectors = (device_size.as_u64() / block_size as u64) as u32;
497
498 if total_sectors < 2048 {
499 return Err(Error::InvalidParameter);
500 }
501
502 let signature = disk_signature.unwrap_or({
504 0x12345678
507 });
508
509 let new_mbr = Mbr::create_basic(signature, partition_type, total_sectors)?;
510
511 new_mbr.write_to_device(device)?;
513
514 new_mbr
515 };
516
517 let valid_partitions = mbr.get_valid_partitions();
519 if valid_partitions.is_empty() {
520 return Err(Error::NotFound);
521 }
522
523 create_partition_device(device.clone(), valid_partitions[0])
525}
526
527#[cfg(test)]
528mod tests {
529 use super::*;
530 use crate::{Device, DeviceTrait, Error, MemoryDevice, PartitionKind, PartitionStatistics};
531 use alloc::vec;
532
533 fn create_test_device_with_mbr() -> Device {
535 let mut data = vec![0u8; 4096 * 1024]; let mbr = create_test_mbr();
539 let mbr_bytes = mbr.to_bytes();
540 data[0..512].copy_from_slice(&mbr_bytes);
541
542 let memory_device = MemoryDevice::<512>::from_vec(data);
543 crate::create_device!(memory_device)
544 }
545
546 fn create_test_device_no_mbr() -> Device {
548 let memory_device = MemoryDevice::<512>::new(4096 * 1024); crate::create_device!(memory_device)
550 }
551
552 fn create_test_mbr() -> Mbr {
554 let mut mbr = Mbr::new_with_signature(0x12345678);
555
556 let _ = mbr.add_partition(PartitionKind::Fat32Lba, 2048, 1024, true);
558 let _ = mbr.add_partition(PartitionKind::Linux, 4096, 2048, false);
559 let _ = mbr.add_partition(PartitionKind::HiddenFat16, 8192, 512, false);
560
561 mbr
562 }
563
564 #[test]
565 fn test_create_partition_device() {
566 let base_device = create_test_device_with_mbr();
567 let mbr = Mbr::read_from_device(&base_device).unwrap();
568 let partition = &mbr.partitions[0];
569
570 let device_result = create_partition_device(base_device, partition);
571 assert!(device_result.is_ok());
572
573 let device = device_result.unwrap();
574 assert_eq!(device.get_start_lba(), partition.get_start_lba());
575 assert_eq!(device.get_sector_count(), partition.get_size_sectors());
576 assert!(device.is_valid());
577 }
578
579 #[test]
580 fn test_create_partition_device_invalid() {
581 let base_device = create_test_device_with_mbr();
582 let invalid_partition = PartitionEntry::new();
583
584 let device_result = create_partition_device(base_device, &invalid_partition);
585 assert!(device_result.is_err());
586 assert_eq!(device_result.unwrap_err(), Error::InvalidParameter);
587 }
588
589 #[test]
590 fn test_scan_mbr_partitions() {
591 let device = create_test_device_with_mbr();
592
593 let scan_result = scan_mbr_partitions(&device);
594 assert!(scan_result.is_ok());
595
596 let partitions = scan_result.unwrap();
597 assert_eq!(partitions.len(), 3); assert_eq!(partitions[0].0, 0);
601 assert_eq!(partitions[1].0, 1);
602 assert_eq!(partitions[2].0, 2);
603
604 assert_eq!(
606 partitions[0].1.get_partition_type(),
607 PartitionKind::Fat32Lba
608 );
609 assert_eq!(partitions[1].1.get_partition_type(), PartitionKind::Linux);
610 assert_eq!(
611 partitions[2].1.get_partition_type(),
612 PartitionKind::HiddenFat16
613 );
614 }
615
616 #[test]
617 fn test_scan_mbr_partitions_no_mbr() {
618 let device = create_test_device_no_mbr();
619
620 let scan_result = scan_mbr_partitions(&device);
621 assert!(scan_result.is_err());
622 }
623
624 #[test]
625 fn test_validate_mbr_valid() {
626 let mbr = create_test_mbr();
627 let validation_result = validate_mbr(&mbr);
628 assert!(validation_result.is_ok());
629 }
630
631 #[test]
632 fn test_validate_mbr_invalid_signature() {
633 let mut mbr = super::Mbr::new();
634 mbr.boot_signature = [0x00, 0x00];
636
637 let validation_result = validate_mbr(&mbr);
638 assert!(validation_result.is_err());
639 assert_eq!(validation_result.unwrap_err(), Error::Corrupted);
640 }
641
642 #[test]
643 fn test_validate_mbr_multiple_bootable() {
644 let mut mbr = Mbr::new_with_signature(0x12345678);
645
646 mbr.partitions[0] =
648 PartitionEntry::new_with_params(true, PartitionKind::Fat32Lba, 2048, 1024);
649 mbr.partitions[1] = PartitionEntry::new_with_params(true, PartitionKind::Linux, 4096, 2048);
650
651 let validation_result = validate_mbr(&mbr);
652 assert!(validation_result.is_err());
653 assert_eq!(validation_result.unwrap_err(), Error::Corrupted);
654 }
655
656 #[test]
657 fn test_validate_mbr_overlapping_partitions() {
658 let mut mbr = Mbr::new_with_signature(0x12345678);
659
660 mbr.partitions[0] =
662 PartitionEntry::new_with_params(false, PartitionKind::Fat32Lba, 2048, 2048);
663 mbr.partitions[1] =
664 PartitionEntry::new_with_params(false, PartitionKind::Linux, 3000, 2048);
665
666 let validation_result = validate_mbr(&mbr);
667 assert!(validation_result.is_err());
668 assert_eq!(validation_result.unwrap_err(), Error::Corrupted);
669 }
670
671 #[test]
672 fn test_create_all_partition_devices() {
673 let base_device = create_test_device_with_mbr();
674 let mbr = create_test_mbr();
675
676 let devices_result = create_all_partition_devices(base_device, &mbr);
677 assert!(devices_result.is_ok());
678
679 let devices = devices_result.unwrap();
680 assert_eq!(devices.len(), 3); for device in &devices {
684 assert!(device.is_valid());
685 }
686
687 assert_eq!(devices[0].get_start_lba(), 2048);
689 assert_eq!(devices[0].get_sector_count(), 1024);
690 }
691
692 #[test]
693 fn test_find_partitions_by_type() {
694 let mbr = create_test_mbr();
695
696 let fat_partitions = find_partitions_by_type(&mbr, PartitionKind::Fat32Lba);
698 assert_eq!(fat_partitions.len(), 1);
699 assert_eq!(fat_partitions[0].0, 0); let linux_partitions = find_partitions_by_type(&mbr, PartitionKind::Linux);
703 assert_eq!(linux_partitions.len(), 1);
704 assert_eq!(linux_partitions[0].0, 1); let ntfs_partitions = find_partitions_by_type(&mbr, PartitionKind::NtfsExfat);
708 assert_eq!(ntfs_partitions.len(), 0);
709 }
710
711 #[test]
712 fn test_partition_statistics() {
713 let mbr = create_test_mbr();
714 let stats = PartitionStatistics::from_mbr(&mbr);
715
716 assert_eq!(stats.total_partitions, 3);
717 assert_eq!(stats.bootable_partitions, 1);
718 assert_eq!(stats.fat_partitions, 2); assert_eq!(stats.linux_partitions, 1);
720 assert_eq!(stats.hidden_partitions, 1); assert_eq!(stats.extended_partitions, 0);
722 assert_eq!(stats.unknown_partitions, 0);
723 assert_eq!(stats.total_used_sectors, 1024 + 2048 + 512); assert_eq!(stats.largest_partition_sectors, 2048);
725 assert_eq!(stats.smallest_partition_sectors, 512);
726 }
727
728 #[test]
729 fn test_partition_statistics_empty_mbr() {
730 let mbr = Mbr::new_with_signature(0x12345678);
731 let stats = PartitionStatistics::from_mbr(&mbr);
732
733 assert_eq!(stats.total_partitions, 0);
734 assert_eq!(stats.bootable_partitions, 0);
735 assert_eq!(stats.fat_partitions, 0);
736 assert_eq!(stats.linux_partitions, 0);
737 assert_eq!(stats.hidden_partitions, 0);
738 assert_eq!(stats.extended_partitions, 0);
739 assert_eq!(stats.unknown_partitions, 0);
740 assert_eq!(stats.total_used_sectors, 0);
741 assert_eq!(stats.largest_partition_sectors, 0);
742 assert_eq!(stats.smallest_partition_sectors, 0);
743 }
744
745 #[test]
746 fn test_has_valid_mbr() {
747 let valid_device = create_test_device_with_mbr();
748 assert!(has_valid_mbr(&valid_device));
749
750 let invalid_device = create_test_device_no_mbr();
751 assert!(!has_valid_mbr(&invalid_device));
752 }
753
754 #[test]
755 fn test_is_gpt_disk() {
756 let mut mbr = Mbr::new_with_signature(0x12345678);
758 let _ = mbr.add_partition(PartitionKind::GptProtective, 1, 0xFFFFFFFF, false);
759
760 let mut data = vec![0u8; 4096 * 1024];
761 let mbr_bytes = mbr.to_bytes();
762 data[0..512].copy_from_slice(&mbr_bytes);
763 let memory_device = MemoryDevice::<512>::from_vec(data);
764 let gpt_device = crate::create_device!(memory_device);
765
766 assert!(is_gpt_disk(&gpt_device));
767
768 let regular_device = create_test_device_with_mbr();
770 assert!(!is_gpt_disk(®ular_device));
771 }
772
773 #[test]
774 fn test_create_basic_mbr() {
775 let mbr_result = create_basic_mbr(0xABCDEF00, PartitionKind::Fat32Lba, 100000);
776 assert!(mbr_result.is_ok());
777
778 let mbr = mbr_result.unwrap();
779 assert!(mbr.is_valid());
780 assert_eq!(mbr.get_disk_signature(), 0xABCDEF00);
781
782 let valid_partitions = mbr.get_valid_partitions();
783 assert_eq!(valid_partitions.len(), 1);
784
785 let partition = &valid_partitions[0];
786 assert_eq!(partition.get_partition_type(), PartitionKind::Fat32Lba);
787 assert_eq!(partition.get_start_lba(), 2048);
788 assert_eq!(partition.get_size_sectors(), 100000 - 2048);
789 assert!(partition.is_bootable());
790 }
791
792 #[test]
793 fn test_create_basic_mbr_too_small() {
794 let mbr_result = create_basic_mbr(0x12345678, PartitionKind::Fat32Lba, 1000);
795 assert!(mbr_result.is_err());
796 assert_eq!(mbr_result.unwrap_err(), Error::InvalidParameter);
797 }
798
799 #[test]
800 fn test_clone_mbr() {
801 let source_device = create_test_device_with_mbr();
802 let target_data = vec![0u8; 4096 * 1024];
803 let memory_device = MemoryDevice::<512>::from_vec(target_data);
804 let target_device = crate::create_device!(memory_device);
805
806 let clone_result = clone_mbr(&source_device, &target_device);
807 assert!(clone_result.is_ok());
808
809 let source_mbr = Mbr::read_from_device(&source_device).unwrap();
811 let target_mbr = Mbr::read_from_device(&target_device).unwrap();
812
813 assert_eq!(source_mbr.to_bytes(), target_mbr.to_bytes());
814 }
815
816 #[test]
817 fn test_backup_and_restore_mbr() {
818 let device = create_test_device_with_mbr();
819
820 let backup_result = backup_mbr(&device);
822 assert!(backup_result.is_ok());
823 let backup = backup_result.unwrap();
824
825 let target_data = vec![0u8; 4096 * 1024];
827 let memory_device = MemoryDevice::<512>::from_vec(target_data);
828 let target_device = crate::create_device!(memory_device);
829
830 let restore_result = restore_mbr(&target_device, &backup);
832 assert!(restore_result.is_ok());
833
834 let original_mbr = Mbr::read_from_device(&device).unwrap();
836 let restored_mbr = Mbr::read_from_device(&target_device).unwrap();
837
838 assert_eq!(original_mbr.to_bytes(), restored_mbr.to_bytes());
839 }
840
841 #[test]
842 fn test_backup_mbr_invalid_device() {
843 let invalid_device = create_test_device_no_mbr();
844
845 let backup_result = backup_mbr(&invalid_device);
846 assert!(backup_result.is_err());
847 }
848
849 #[test]
850 fn test_restore_mbr_invalid_backup() {
851 let device = create_test_device_no_mbr();
852 let invalid_backup = [0u8; 512]; let restore_result = restore_mbr(&device, &invalid_backup);
855 assert!(restore_result.is_err());
856 }
857
858 #[test]
859 fn test_utilities_with_complex_mbr() {
860 let mut mbr = Mbr::new_with_signature(0xDEADBEEF);
862
863 let _ = mbr.add_partition(PartitionKind::Fat16, 63, 1000, true);
864 let _ = mbr.add_partition(PartitionKind::ExtendedLba, 2048, 10000, false);
865 let _ = mbr.add_partition(PartitionKind::LinuxSwap, 15000, 2000, false);
866 let _ = mbr.add_partition(PartitionKind::Unknown(0x42), 20000, 5000, false);
867
868 let stats = PartitionStatistics::from_mbr(&mbr);
870 assert_eq!(stats.total_partitions, 4);
871 assert_eq!(stats.bootable_partitions, 1);
872 assert_eq!(stats.fat_partitions, 1);
873 assert_eq!(stats.linux_partitions, 1); assert_eq!(stats.extended_partitions, 1);
875 assert_eq!(stats.unknown_partitions, 1);
876
877 let extended = find_partitions_by_type(&mbr, PartitionKind::ExtendedLba);
879 assert_eq!(extended.len(), 1);
880 assert_eq!(extended[0].0, 1);
881
882 let unknown = find_partitions_by_type(&mbr, PartitionKind::Unknown(0x42));
883 assert_eq!(unknown.len(), 1);
884 assert_eq!(unknown[0].0, 3);
885 }
886
887 #[test]
888 fn test_edge_cases() {
889 let empty_mbr = Mbr::new_with_signature(0x12345678);
891
892 let stats = PartitionStatistics::from_mbr(&empty_mbr);
893 assert_eq!(stats.total_partitions, 0);
894
895 let partitions = find_partitions_by_type(&empty_mbr, PartitionKind::Fat32);
896 assert_eq!(partitions.len(), 0);
897
898 let mut empty_data = vec![0u8; 4096 * 1024];
900 let empty_mbr_bytes = empty_mbr.to_bytes();
901 empty_data[0..512].copy_from_slice(&empty_mbr_bytes);
902 let memory_device = MemoryDevice::<512>::from_vec(empty_data);
903 let empty_device = crate::create_device!(memory_device);
904
905 let scan_result = scan_mbr_partitions(&empty_device);
906 assert!(scan_result.is_ok());
907 assert_eq!(scan_result.unwrap().len(), 0);
908 }
909
910 #[test]
913 fn test_format_disk_and_get_first_partition_existing_mbr() {
914 let device = create_test_device_with_mbr();
915
916 let partition_device_result =
917 format_disk_and_get_first_partition(&device, PartitionKind::Fat32Lba, Some(0xABCDEF00));
918 assert!(partition_device_result.is_ok());
919
920 let partition_device = partition_device_result.unwrap();
921 assert!(partition_device.is_valid());
922 assert_eq!(partition_device.get_start_lba(), 2048); assert_eq!(partition_device.get_sector_count(), 1024); }
925
926 #[test]
927 fn test_format_disk_and_get_first_partition_no_mbr() {
928 let device = create_test_device_no_mbr();
929
930 let partition_device_result =
931 format_disk_and_get_first_partition(&device, PartitionKind::Fat32Lba, Some(0x12345678));
932 assert!(partition_device_result.is_ok());
933
934 let partition_device = partition_device_result.unwrap();
935 assert!(partition_device.is_valid());
936 assert_eq!(partition_device.get_start_lba(), 2048); assert!(has_valid_mbr(&device));
940
941 let mbr = Mbr::read_from_device(&device).unwrap();
943 let valid_partitions = mbr.get_valid_partitions();
944 assert_eq!(valid_partitions.len(), 1);
945 assert_eq!(
946 valid_partitions[0].get_partition_type(),
947 PartitionKind::Fat32Lba
948 );
949 assert!(valid_partitions[0].is_bootable());
950 }
951
952 #[test]
953 fn test_format_disk_and_get_first_partition_default_signature() {
954 let device = create_test_device_no_mbr();
955
956 let partition_device_result = format_disk_and_get_first_partition(
957 &device,
958 PartitionKind::Linux,
959 None, );
961 assert!(partition_device_result.is_ok());
962
963 let partition_device = partition_device_result.unwrap();
964 assert!(partition_device.is_valid());
965
966 let mbr = Mbr::read_from_device(&device).unwrap();
968 assert_eq!(mbr.get_disk_signature(), 0x12345678); }
970
971 #[test]
972 fn test_format_disk_and_get_first_partition_device_too_small() {
973 let small_data = vec![0u8; 1024]; let memory_device = MemoryDevice::<512>::from_vec(small_data);
976 let small_device = crate::create_device!(memory_device);
977
978 let partition_device_result = format_disk_and_get_first_partition(
979 &small_device,
980 PartitionKind::Fat32Lba,
981 Some(0x12345678),
982 );
983 assert!(partition_device_result.is_err());
984 assert_eq!(
985 partition_device_result.unwrap_err(),
986 Error::InvalidParameter
987 );
988 }
989
990 #[test]
991 fn test_format_disk_and_get_first_partition_empty_mbr() {
992 let mut data = vec![0u8; 4096 * 1024];
994 let empty_mbr = Mbr::new_with_signature(0xDEADBEEF);
995 let mbr_bytes = empty_mbr.to_bytes();
996 data[0..512].copy_from_slice(&mbr_bytes);
997
998 let memory_device = MemoryDevice::<512>::from_vec(data);
999 let device = crate::create_device!(memory_device);
1000
1001 let partition_device_result =
1002 format_disk_and_get_first_partition(&device, PartitionKind::Fat32Lba, Some(0x12345678));
1003 assert!(partition_device_result.is_err());
1004 assert_eq!(partition_device_result.unwrap_err(), Error::NotFound);
1005 }
1006
1007 #[test]
1008 fn test_format_disk_and_get_first_partition_different_types() {
1009 let partition_types = [
1011 PartitionKind::Fat32Lba,
1012 PartitionKind::Linux,
1013 PartitionKind::NtfsExfat,
1014 PartitionKind::ExtendedLba,
1015 ];
1016
1017 for partition_type in &partition_types {
1018 let device = create_test_device_no_mbr();
1019
1020 let partition_device_result =
1021 format_disk_and_get_first_partition(&device, *partition_type, Some(0xABCDEF00));
1022 assert!(partition_device_result.is_ok());
1023
1024 let partition_device = partition_device_result.unwrap();
1025 assert!(partition_device.is_valid());
1026
1027 let mbr = Mbr::read_from_device(&device).unwrap();
1029 let valid_partitions = mbr.get_valid_partitions();
1030 assert_eq!(valid_partitions.len(), 1);
1031 assert_eq!(valid_partitions[0].get_partition_type(), *partition_type);
1032 }
1033 }
1034
1035 #[test]
1036 fn test_format_disk_and_write_read_data() {
1037 let device = create_test_device_no_mbr();
1038
1039 let partition_device_result =
1041 format_disk_and_get_first_partition(&device, PartitionKind::Fat32Lba, Some(0x12345678));
1042 assert!(partition_device_result.is_ok());
1043 let partition_device = partition_device_result.unwrap();
1044
1045 let test_data = b"Hello, Partition World! This is a test of writing and reading data from a partition device.";
1047 let mut write_buffer = vec![0u8; 512]; write_buffer[0..test_data.len()].copy_from_slice(test_data);
1049
1050 let write_result = partition_device.write(&write_buffer);
1052 assert!(write_result.is_ok());
1053 let bytes_written = write_result.unwrap();
1054 assert_eq!(bytes_written.as_u64(), 512);
1055
1056 let set_position_result = partition_device.set_position(&crate::Position::Start(0));
1058 assert!(set_position_result.is_ok());
1059
1060 let mut read_buffer = vec![0u8; 512];
1062 let read_result = partition_device.read(&mut read_buffer);
1063 assert!(read_result.is_ok());
1064 let bytes_read = read_result.unwrap();
1065 assert_eq!(bytes_read.as_u64(), 512);
1066
1067 assert_eq!(&read_buffer[0..test_data.len()], test_data);
1069
1070 let second_test_data = b"Second write test at offset";
1072 let second_position = 1024; let set_position_result =
1076 partition_device.set_position(&crate::Position::Start(second_position));
1077 assert!(set_position_result.is_ok());
1078
1079 let mut second_write_buffer = vec![0u8; 512];
1081 second_write_buffer[0..second_test_data.len()].copy_from_slice(second_test_data);
1082 let write_result = partition_device.write(&second_write_buffer);
1083 assert!(write_result.is_ok());
1084
1085 let set_position_result =
1087 partition_device.set_position(&crate::Position::Start(second_position));
1088 assert!(set_position_result.is_ok());
1089 let mut second_read_buffer = vec![0u8; 512];
1090 let read_result = partition_device.read(&mut second_read_buffer);
1091 assert!(read_result.is_ok());
1092
1093 assert_eq!(
1095 &second_read_buffer[0..second_test_data.len()],
1096 second_test_data
1097 );
1098
1099 let set_position_result = partition_device.set_position(&crate::Position::Start(0));
1101 assert!(set_position_result.is_ok());
1102 let mut first_read_buffer = vec![0u8; 512];
1103 let read_result = partition_device.read(&mut first_read_buffer);
1104 assert!(read_result.is_ok());
1105 assert_eq!(&first_read_buffer[0..test_data.len()], test_data);
1106 }
1107
1108 #[test]
1109 fn test_partition_data_isolation() {
1110 let device = create_test_device_no_mbr();
1112
1113 let device_size = device.get_size().unwrap();
1115 let block_size = device.get_block_size().unwrap();
1116 let _ = (device_size.as_u64() / block_size as u64) as u32;
1117
1118 let mut mbr = Mbr::new_with_signature(0x12345678);
1119
1120 let first_partition_size = 2048; let second_partition_start = 2048 + first_partition_size;
1123 let second_partition_size = 2048;
1124
1125 let _ = mbr.add_partition(PartitionKind::Fat32Lba, 2048, first_partition_size, true);
1126 let _ = mbr.add_partition(
1127 PartitionKind::Linux,
1128 second_partition_start,
1129 second_partition_size,
1130 false,
1131 );
1132
1133 let write_result = mbr.write_to_device(&device);
1135 assert!(write_result.is_ok());
1136
1137 let valid_partitions = mbr.get_valid_partitions();
1139 assert_eq!(valid_partitions.len(), 2);
1140
1141 let first_partition_device =
1142 create_partition_device(device.clone(), valid_partitions[0]).unwrap();
1143 let second_partition_device =
1144 create_partition_device(device.clone(), valid_partitions[1]).unwrap();
1145
1146 let first_data = b"Data for first partition - FAT32";
1148 let second_data = b"Data for second partition - Linux";
1149
1150 let mut first_buffer = vec![0u8; 512];
1151 first_buffer[0..first_data.len()].copy_from_slice(first_data);
1152 let write_result = first_partition_device.write(&first_buffer);
1153 assert!(write_result.is_ok());
1154
1155 let mut second_buffer = vec![0u8; 512];
1156 second_buffer[0..second_data.len()].copy_from_slice(second_data);
1157 let write_result = second_partition_device.write(&second_buffer);
1158 assert!(write_result.is_ok());
1159
1160 let _ = first_partition_device.set_position(&crate::Position::Start(0));
1162 let _ = second_partition_device.set_position(&crate::Position::Start(0));
1163
1164 let mut first_read_buffer = vec![0u8; 512];
1165 let mut second_read_buffer = vec![0u8; 512];
1166
1167 let read_result = first_partition_device.read(&mut first_read_buffer);
1168 assert!(read_result.is_ok());
1169 let read_result = second_partition_device.read(&mut second_read_buffer);
1170 assert!(read_result.is_ok());
1171
1172 assert_eq!(&first_read_buffer[0..first_data.len()], first_data);
1174 assert_eq!(&second_read_buffer[0..second_data.len()], second_data);
1175
1176 assert_ne!(&first_read_buffer[0..32], &second_read_buffer[0..32]);
1178 }
1179
1180 #[test]
1181 fn test_partition_bounds_checking() {
1182 let device = create_test_device_no_mbr();
1183
1184 let partition_device_result =
1185 format_disk_and_get_first_partition(&device, PartitionKind::Fat32Lba, Some(0x12345678));
1186 assert!(partition_device_result.is_ok());
1187 let partition_device = partition_device_result.unwrap();
1188
1189 let partition_size_bytes = partition_device.get_sector_count() as u64 * 512;
1191 let beyond_bounds_position = partition_size_bytes;
1192
1193 let _ = partition_device
1194 .set_position(&crate::Position::Start(beyond_bounds_position))
1195 .unwrap();
1196 let end_position = partition_size_bytes - 512;
1201 let set_position_result =
1202 partition_device.set_position(&crate::Position::Start(end_position));
1203 assert!(set_position_result.is_ok());
1204
1205 let test_data = b"End of partition data";
1206 let mut write_buffer = vec![0u8; 512];
1207 write_buffer[0..test_data.len()].copy_from_slice(test_data);
1208
1209 let write_result = partition_device.write(&write_buffer);
1210 assert!(write_result.is_ok());
1211
1212 let set_position_result =
1214 partition_device.set_position(&crate::Position::Start(end_position));
1215 assert!(set_position_result.is_ok());
1216 let mut read_buffer = vec![0u8; 512];
1217 let read_result = partition_device.read(&mut read_buffer);
1218 assert!(read_result.is_ok());
1219 assert_eq!(&read_buffer[0..test_data.len()], test_data);
1220 }
1221}