fast_ntfs 1.0.2

Forked a low-level NTFS filesystem library
Documentation
mod common;

use fast_ntfs::{Ntfs, NtfsError};

fn root_directory_record_position() -> usize {
    let mut fs = common::testfs1();
    let ntfs = Ntfs::new(&mut fs).unwrap();
    ntfs.root_directory(&mut fs)
        .unwrap()
        .position()
        .value()
        .unwrap()
        .get() as usize
}

#[test]
fn rejects_update_sequence_count_that_does_not_cover_the_record() {
    let record_position = root_directory_record_position();
    let mut fs = common::testfs1();
    fs.get_mut()[record_position + 6..record_position + 8].copy_from_slice(&1u16.to_le_bytes());

    let ntfs = Ntfs::new(&mut fs).unwrap();
    let error = ntfs.root_directory(&mut fs).unwrap_err();

    assert!(matches!(
        error,
        NtfsError::InvalidUpdateSequenceCount {
            update_sequence_count: 1,
            ..
        }
    ));
}

#[test]
fn rejects_unaligned_update_sequence_array_offset() {
    let record_position = root_directory_record_position();
    let mut fs = common::testfs1();
    fs.get_mut()[record_position + 4..record_position + 6].copy_from_slice(&49u16.to_le_bytes());

    let ntfs = Ntfs::new(&mut fs).unwrap();
    let error = ntfs.root_directory(&mut fs).unwrap_err();

    assert!(matches!(
        error,
        NtfsError::InvalidUpdateSequenceArrayOffset { offset: 49, .. }
    ));
}

#[test]
fn rejects_mismatched_update_sequence_number() {
    let record_position = root_directory_record_position();
    let mut fs = common::testfs1();
    let trailer_position = record_position + 512 - 2;
    fs.get_mut()[trailer_position..trailer_position + 2].copy_from_slice(&[0, 0]);

    let ntfs = Ntfs::new(&mut fs).unwrap();
    let error = ntfs.root_directory(&mut fs).unwrap_err();

    assert!(matches!(
        error,
        NtfsError::UpdateSequenceNumberMismatch { .. }
    ));
}