[−][src]Struct mbrman::MBR
A type representing a MBR partition table including its partition, the sector size of the disk and the alignment of the partitions to the sectors.
Examples:
Read an existing MBR on a reader and list its partitions:
let mut f = std::fs::File::open("tests/fixtures/disk1.img") .expect("could not open disk"); let mbr = mbrman::MBR::read_from(&mut f, 512) .expect("could not find MBR"); println!("Disk signature: {:?}", mbr.header.disk_signature); for (i, p) in mbr.iter() { if p.is_used() { println!("Partition #{}: type = {:?}, size = {} bytes, starting lba = {}", i, p.sys, p.sectors * mbr.sector_size, p.starting_lba); } }
Fields
sector_size: u32
Sector size of the disk.
You should not change this, otherwise the starting locations of your partitions will be different in bytes.
header: MBRHeader
MBR partition header (disk GUID, first/last usable LBA, etc...)
logical_partitions: Vec<LogicalPartition>
A vector with all the logical partitions. You can push new ones (even empty ones)
align: u32
Partitions alignment (in sectors)
This field change the behavior of the methods get_maximum_partition_size()
,
find_free_sectors()
, find_first_place()
, find_last_place()
and find_optimal_place()
so they return only values aligned to the alignment.
Panics
The value must be greater than 0, otherwise you will encounter divisions by zero.
cylinders: u16
Disk geometry: number of cylinders
heads: u8
Disk geometry: number of heads
sectors: u8
Disk geometry: number of sectors
disk_size: u32
Disk size in sectors
Implementations
impl MBR
[src]
pub fn iter(&self) -> impl Iterator<Item = (usize, &MBRPartitionEntry)>
[src]
Get an iterator over the partition entries and their index. The index always starts at 1.
pub fn iter_mut(
&mut self
) -> impl Iterator<Item = (usize, &mut MBRPartitionEntry)>
[src]
&mut self
) -> impl Iterator<Item = (usize, &mut MBRPartitionEntry)>
Get a mutable iterator over the partition entries and their index. The index always starts at 1.
pub fn get(&self, i: usize) -> Option<&MBRPartitionEntry>
[src]
Get Some(&MBRPartitionEntry)
if it exists, None otherwise.
Remarks
- The partitions start at index 1
- The first 4 partitions always exist
pub fn get_mut(&mut self, i: usize) -> Option<&mut MBRPartitionEntry>
[src]
Get Some(&mut MBRPartitionEntry)
if it exists, None otherwise.
Remarks
- The partitions start at index 1
- The first 4 partitions always exist
pub fn len(&self) -> usize
[src]
The total number of partitions on the disk: primary partitions and logical partitions.
Remark
The primary partitions are always counted even if they are empty.
pub fn is_empty(&self) -> bool
[src]
Always false: primary partitions are always counted even if they are empty.
pub fn new_from<S>(
seeker: &mut S,
sector_size: u32,
disk_signature: [u8; 4]
) -> Result<MBR> where
S: Seek,
[src]
seeker: &mut S,
sector_size: u32,
disk_signature: [u8; 4]
) -> Result<MBR> where
S: Seek,
Make a new MBR
Examples
Basic usage:
let mut f = std::fs::File::open("tests/fixtures/disk1.img") .expect("could not open disk"); let mbr = mbrman::MBR::new_from(&mut f, 512, [0x01, 0x02, 0x03, 0x04]) .expect("could not make a partition table");
pub fn read_from<R: ?Sized>(reader: &mut R, sector_size: u32) -> Result<MBR> where
R: Read + Seek,
[src]
R: Read + Seek,
Read the MBR on a reader. This function will try to read the backup header if the primary header could not be read.
Examples
Basic usage:
let mut f = std::fs::File::open("tests/fixtures/disk1.img") .expect("could not open disk"); let mbr = mbrman::MBR::read_from(&mut f, 512) .expect("could not read the partition table");
pub fn check_geometry(&self) -> bool
[src]
Return true
if the MBR has a valid geometry. The geometry can be set by setting
the fiels cylinders
, heads
and sectors
.
Remarks
The cylinders, heads and sectors must have a value greater than zero.
The cylinders cannot exceed 1023.
The sectors cannot exceed 63.
pub fn write_into<W: ?Sized>(&mut self, writer: &mut W) -> Result<()> where
W: Write + Seek,
[src]
W: Write + Seek,
Write the MBR to a writer. This function will seek automatically in the writer.
This function will update the CHS address of the partitions automatically if a valid
geometry has been set. See check_geometry
.
Examples
Basic usage:
let ss = 512; let data = vec![0; 100 * ss as usize]; let mut cur = std::io::Cursor::new(data); let mut mbr = mbrman::MBR::new_from(&mut cur, ss as u32, [0xff; 4]) .expect("could not make a partition table"); // actually write: mbr.write_into(&mut cur) .expect("could not write MBR to disk")
pub fn get_cylinder_size(&self) -> u32
[src]
Get a cylinder size in sectors. This function is useful if you want to align your partitions to the cylinder.
pub fn find_at_sector(&self, sector: u32) -> Option<usize>
[src]
Finds the primary partition (ignoring extended partitions) or logical partition where the given sector resides.
pub fn remove_at_sector(&mut self, sector: u32) -> Result<()>
[src]
Remove a partition entry that resides at a given sector. If the partition is the extended partition, it will delete also all the logical partitions.
Errors
It is an error to provide a sector which does not belong to a partition.
pub fn find_free_sectors(&self) -> Vec<(u32, u32)>
[src]
Find free spots in the partition table.
This function will return a vector of tuple with on the left: the starting LBA of the free
spot; and on the right: the size (in sectors) of the free spot.
This function will automatically align with the alignment defined in the MBR
.
Examples
Basic usage:
let ss = 512; let data = vec![0; 100 * ss as usize]; let mut cur = std::io::Cursor::new(data); let mut mbr = mbrman::MBR::new_from(&mut cur, ss as u32, [0xff; 4]) .expect("could not create partition table"); mbr[1] = mbrman::MBRPartitionEntry { boot: false, first_chs: mbrman::CHS::empty(), sys: 0x83, last_chs: mbrman::CHS::empty(), starting_lba: 6, sectors: mbr.disk_size - 11, }; // NOTE: align to the sectors, so we can use every last one of them // NOTE: this is only for the demonstration purpose, this is not recommended mbr.align = 1; assert_eq!( mbr.find_free_sectors(), vec![(1, 5), (mbr.disk_size - 5, 5)] );
pub fn find_first_place(&self, size: u32) -> Option<u32>
[src]
Find the first place (most on the left) where you could start a new partition of the size
given in parameter.
This function will automatically align with the alignment defined in the MBR
.
Examples:
Basic usage:
let ss = 512; let data = vec![0; 100 * ss as usize]; let mut cur = std::io::Cursor::new(data); let mut mbr = mbrman::MBR::new_from(&mut cur, ss as u32, [0xff; 4]) .expect("could not create partition table"); mbr[1] = mbrman::MBRPartitionEntry { boot: false, first_chs: mbrman::CHS::empty(), sys: 0x83, last_chs: mbrman::CHS::empty(), starting_lba: 6, sectors: mbr.disk_size - 6, }; // NOTE: align to the sectors, so we can use every last one of them // NOTE: this is only for the demonstration purpose, this is not recommended mbr.align = 1; assert_eq!(mbr.find_first_place(5), Some(1));
pub fn find_last_place(&self, size: u32) -> Option<u32>
[src]
Find the last place (most on the right) where you could start a new partition of the size
given in parameter.
This function will automatically align with the alignment defined in the MBR
.
Examples:
Basic usage:
let ss = 512; let data = vec![0; 100 * ss as usize]; let mut cur = std::io::Cursor::new(data); let mut mbr = mbrman::MBR::new_from(&mut cur, ss as u32, [0xff; 4]) .expect("could not create partition table"); mbr[1] = mbrman::MBRPartitionEntry { boot: false, first_chs: mbrman::CHS::empty(), sys: 0x83, last_chs: mbrman::CHS::empty(), starting_lba: 6, sectors: 5, }; // NOTE: align to the sectors, so we can use every last one of them // NOTE: this is only for the demonstration purpose, this is not recommended mbr.align = 1; assert_eq!(mbr.find_last_place(5), Some(mbr.disk_size - 5));
pub fn find_optimal_place(&self, size: u32) -> Option<u32>
[src]
Find the most optimal place (in the smallest free space) where you could start a new
partition of the size given in parameter.
This function will automatically align with the alignment defined in the MBR
.
Examples:
Basic usage:
let ss = 512; let data = vec![0; 100 * ss as usize]; let mut cur = std::io::Cursor::new(data); let mut mbr = mbrman::MBR::new_from(&mut cur, ss as u32, [0xff; 4]) .expect("could not create partition table"); mbr[1] = mbrman::MBRPartitionEntry { boot: false, first_chs: mbrman::CHS::empty(), sys: 0x83, last_chs: mbrman::CHS::empty(), starting_lba: 11, sectors: mbr.disk_size - 11 - 5, }; // NOTE: align to the sectors, so we can use every last one of them // NOTE: this is only for the demonstration purpose, this is not recommended mbr.align = 1; // NOTE: the space as the end is more optimal because it will allow you to still be able to // insert a bigger partition later assert_eq!(mbr.find_optimal_place(5), Some(mbr.disk_size - 5));
pub fn get_maximum_partition_size(&self) -> Result<u32>
[src]
Get the maximum size (in sectors) of a partition you could create in the MBR.
This function will automatically align with the alignment defined in the MBR
.
Examples:
Basic usage:
let ss = 512; let data = vec![0; 100 * ss as usize]; let mut cur = std::io::Cursor::new(data); let mut mbr = mbrman::MBR::new_from(&mut cur, ss as u32, [0xff; 4]) .expect("could not create partition table"); // NOTE: align to the sectors, so we can use every last one of them // NOTE: this is only for the demonstration purpose, this is not recommended mbr.align = 1; assert_eq!( mbr.get_maximum_partition_size().unwrap_or(0), mbr.disk_size - 1 );
pub fn push(
&mut self,
sys: u8,
starting_lba: u32,
sectors: u32
) -> Result<&mut LogicalPartition>
[src]
&mut self,
sys: u8,
starting_lba: u32,
sectors: u32
) -> Result<&mut LogicalPartition>
Push a new logical partition to the end of the extended partition list. This function will
take care of creating the EBR for you. The EBR will be located at starting_lba
(provided
in input) and the logical partition itself will be located a block further to stay
aligned. The size of the logical partition will be one block smaller than the sectors
provided in input.
pub fn remove(&mut self, index: usize) -> LogicalPartition
[src]
Trait Implementations
impl Clone for MBR
[src]
impl Debug for MBR
[src]
impl Index<usize> for MBR
[src]
type Output = MBRPartitionEntry
The returned type after indexing.
fn index(&self, i: usize) -> &Self::Output
[src]
impl IndexMut<usize> for MBR
[src]
impl PartialEq<MBR> for MBR
[src]
impl StructuralPartialEq for MBR
[src]
Auto Trait Implementations
impl RefUnwindSafe for MBR
impl Send for MBR
impl Sync for MBR
impl Unpin for MBR
impl UnwindSafe for MBR
Blanket Implementations
impl<T> Any for T where
T: 'static + ?Sized,
[src]
T: 'static + ?Sized,
impl<T> Borrow<T> for T where
T: ?Sized,
[src]
T: ?Sized,
impl<T> BorrowMut<T> for T where
T: ?Sized,
[src]
T: ?Sized,
pub fn borrow_mut(&mut self) -> &mut T
[src]
impl<T> Conv for T
impl<T> Conv for T
impl<T> FmtForward for T
fn fmt_binary(self) -> FmtBinary<Self> where
Self: Binary,
Self: Binary,
fn fmt_display(self) -> FmtDisplay<Self> where
Self: Display,
Self: Display,
fn fmt_lower_exp(self) -> FmtLowerExp<Self> where
Self: LowerExp,
Self: LowerExp,
fn fmt_lower_hex(self) -> FmtLowerHex<Self> where
Self: LowerHex,
Self: LowerHex,
fn fmt_octal(self) -> FmtOctal<Self> where
Self: Octal,
Self: Octal,
fn fmt_pointer(self) -> FmtPointer<Self> where
Self: Pointer,
Self: Pointer,
fn fmt_upper_exp(self) -> FmtUpperExp<Self> where
Self: UpperExp,
Self: UpperExp,
fn fmt_upper_hex(self) -> FmtUpperHex<Self> where
Self: UpperHex,
Self: UpperHex,
impl<T> From<T> for T
[src]
impl<T, U> Into<U> for T where
U: From<T>,
[src]
U: From<T>,
impl<T> Pipe for T where
T: ?Sized,
T: ?Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R where
R: 'a,
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> R where
R: 'a,
R: 'a,
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R where
B: 'a + ?Sized,
R: 'a,
Self: Borrow<B>,
B: 'a + ?Sized,
R: 'a,
Self: Borrow<B>,
fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R
) -> R where
B: 'a + ?Sized,
R: 'a,
Self: BorrowMut<B>,
&'a mut self,
func: impl FnOnce(&'a mut B) -> R
) -> R where
B: 'a + ?Sized,
R: 'a,
Self: BorrowMut<B>,
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R where
R: 'a,
Self: AsRef<U>,
U: 'a + ?Sized,
R: 'a,
Self: AsRef<U>,
U: 'a + ?Sized,
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R where
R: 'a,
Self: AsMut<U>,
U: 'a + ?Sized,
R: 'a,
Self: AsMut<U>,
U: 'a + ?Sized,
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R where
R: 'a,
Self: Deref<Target = T>,
T: 'a + ?Sized,
R: 'a,
Self: Deref<Target = T>,
T: 'a + ?Sized,
fn pipe_deref_mut<'a, T, R>(
&'a mut self,
func: impl FnOnce(&'a mut T) -> R
) -> R where
R: 'a,
Self: DerefMut<Target = T> + Deref,
T: 'a + ?Sized,
&'a mut self,
func: impl FnOnce(&'a mut T) -> R
) -> R where
R: 'a,
Self: DerefMut<Target = T> + Deref,
T: 'a + ?Sized,
impl<T> Pipe for T
impl<T> PipeAsRef for T
fn pipe_as_ref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R where
R: 'a,
Self: AsRef<T>,
T: 'a,
R: 'a,
Self: AsRef<T>,
T: 'a,
fn pipe_as_mut<'a, T, R>(&'a mut self, func: impl FnOnce(&'a mut T) -> R) -> R where
R: 'a,
Self: AsMut<T>,
T: 'a,
R: 'a,
Self: AsMut<T>,
T: 'a,
impl<T> PipeBorrow for T
fn pipe_borrow<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R where
R: 'a,
Self: Borrow<T>,
T: 'a,
R: 'a,
Self: Borrow<T>,
T: 'a,
fn pipe_borrow_mut<'a, T, R>(
&'a mut self,
func: impl FnOnce(&'a mut T) -> R
) -> R where
R: 'a,
Self: BorrowMut<T>,
T: 'a,
&'a mut self,
func: impl FnOnce(&'a mut T) -> R
) -> R where
R: 'a,
Self: BorrowMut<T>,
T: 'a,
impl<T> PipeDeref for T
fn pipe_deref<'a, R>(&'a self, func: impl FnOnce(&'a Self::Target) -> R) -> R where
R: 'a,
Self: Deref,
R: 'a,
Self: Deref,
fn pipe_deref_mut<'a, R>(
&'a mut self,
func: impl FnOnce(&'a mut Self::Target) -> R
) -> R where
R: 'a,
Self: DerefMut,
&'a mut self,
func: impl FnOnce(&'a mut Self::Target) -> R
) -> R where
R: 'a,
Self: DerefMut,
impl<T> PipeRef for T
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R where
R: 'a,
R: 'a,
fn pipe_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> R where
R: 'a,
R: 'a,
impl<T> Tap for T
fn tap(self, func: impl FnOnce(&Self)) -> Self
fn tap_mut(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self where
B: ?Sized,
Self: Borrow<B>,
B: ?Sized,
Self: Borrow<B>,
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self where
B: ?Sized,
Self: BorrowMut<B>,
B: ?Sized,
Self: BorrowMut<B>,
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self where
R: ?Sized,
Self: AsRef<R>,
R: ?Sized,
Self: AsRef<R>,
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self where
R: ?Sized,
Self: AsMut<R>,
R: ?Sized,
Self: AsMut<R>,
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self where
Self: Deref<Target = T>,
T: ?Sized,
Self: Deref<Target = T>,
T: ?Sized,
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self where
Self: DerefMut<Target = T> + Deref,
T: ?Sized,
Self: DerefMut<Target = T> + Deref,
T: ?Sized,
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self where
B: ?Sized,
Self: Borrow<B>,
B: ?Sized,
Self: Borrow<B>,
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self where
B: ?Sized,
Self: BorrowMut<B>,
B: ?Sized,
Self: BorrowMut<B>,
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self where
R: ?Sized,
Self: AsRef<R>,
R: ?Sized,
Self: AsRef<R>,
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self where
R: ?Sized,
Self: AsMut<R>,
R: ?Sized,
Self: AsMut<R>,
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self where
Self: Deref<Target = T>,
T: ?Sized,
Self: Deref<Target = T>,
T: ?Sized,
fn tap_deref_mut_dbg<T>(self, func: impl FnOnce(&mut T)) -> Self where
Self: DerefMut<Target = T> + Deref,
T: ?Sized,
Self: DerefMut<Target = T> + Deref,
T: ?Sized,
impl<T> Tap for T
fn tap<F, R>(self, func: F) -> Self where
F: FnOnce(&Self) -> R,
F: FnOnce(&Self) -> R,
fn tap_dbg<F, R>(self, func: F) -> Self where
F: FnOnce(&Self) -> R,
F: FnOnce(&Self) -> R,
fn tap_mut<F, R>(self, func: F) -> Self where
F: FnOnce(&mut Self) -> R,
F: FnOnce(&mut Self) -> R,
fn tap_mut_dbg<F, R>(self, func: F) -> Self where
F: FnOnce(&mut Self) -> R,
F: FnOnce(&mut Self) -> R,
impl<T, U> TapAsRef<U> for T where
U: ?Sized,
U: ?Sized,
fn tap_ref<F, R>(self, func: F) -> Self where
F: FnOnce(&T) -> R,
Self: AsRef<T>,
F: FnOnce(&T) -> R,
Self: AsRef<T>,
fn tap_ref_dbg<F, R>(self, func: F) -> Self where
F: FnOnce(&T) -> R,
Self: AsRef<T>,
F: FnOnce(&T) -> R,
Self: AsRef<T>,
fn tap_ref_mut<F, R>(self, func: F) -> Self where
F: FnOnce(&mut T) -> R,
Self: AsMut<T>,
F: FnOnce(&mut T) -> R,
Self: AsMut<T>,
fn tap_ref_mut_dbg<F, R>(self, func: F) -> Self where
F: FnOnce(&mut T) -> R,
Self: AsMut<T>,
F: FnOnce(&mut T) -> R,
Self: AsMut<T>,
impl<T, U> TapBorrow<U> for T where
U: ?Sized,
U: ?Sized,
fn tap_borrow<F, R>(self, func: F) -> Self where
F: FnOnce(&T) -> R,
Self: Borrow<T>,
F: FnOnce(&T) -> R,
Self: Borrow<T>,
fn tap_borrow_dbg<F, R>(self, func: F) -> Self where
F: FnOnce(&T) -> R,
Self: Borrow<T>,
F: FnOnce(&T) -> R,
Self: Borrow<T>,
fn tap_borrow_mut<F, R>(self, func: F) -> Self where
F: FnOnce(&mut T) -> R,
Self: BorrowMut<T>,
F: FnOnce(&mut T) -> R,
Self: BorrowMut<T>,
fn tap_borrow_mut_dbg<F, R>(self, func: F) -> Self where
F: FnOnce(&mut T) -> R,
Self: BorrowMut<T>,
F: FnOnce(&mut T) -> R,
Self: BorrowMut<T>,
impl<T> TapDeref for T
fn tap_deref<F, R>(self, func: F) -> Self where
F: FnOnce(&Self::Target) -> R,
Self: Deref,
F: FnOnce(&Self::Target) -> R,
Self: Deref,
fn tap_deref_dbg<F, R>(self, func: F) -> Self where
F: FnOnce(&Self::Target) -> R,
Self: Deref,
F: FnOnce(&Self::Target) -> R,
Self: Deref,
fn tap_deref_mut<F, R>(self, func: F) -> Self where
F: FnOnce(&mut Self::Target) -> R,
Self: DerefMut,
F: FnOnce(&mut Self::Target) -> R,
Self: DerefMut,
fn tap_deref_mut_dbg<F, R>(self, func: F) -> Self where
F: FnOnce(&mut Self::Target) -> R,
Self: DerefMut,
F: FnOnce(&mut Self::Target) -> R,
Self: DerefMut,
impl<T> ToOwned for T where
T: Clone,
[src]
T: Clone,
type Owned = T
The resulting type after obtaining ownership.
pub fn to_owned(&self) -> T
[src]
pub fn clone_into(&self, target: &mut T)
[src]
impl<T> TryConv for T
impl<T> TryConv for T
impl<T, U> TryFrom<U> for T where
U: Into<T>,
[src]
U: Into<T>,
type Error = Infallible
The type returned in the event of a conversion error.
pub fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>
[src]
impl<T, U> TryInto<U> for T where
U: TryFrom<T>,
[src]
U: TryFrom<T>,