From ff2110ef9541e8d895a393d53fe2e487071bc520 Mon Sep 17 00:00:00 2001 From: Colin Finck Date: Wed, 18 Aug 2021 23:25:42 +0200 Subject: Standardize on "File Record Number" to denote the n-th FILE Record. --- src/error.rs | 4 ++-- src/file.rs | 2 +- src/ntfs.rs | 25 ++++++++++--------------- src/structured_values/file_name.rs | 6 ++++-- src/structured_values/standard_information.rs | 6 ++++-- src/upcase_table.rs | 4 ++-- 6 files changed, 23 insertions(+), 24 deletions(-) diff --git a/src/error.rs b/src/error.rs index 04f93df..2d752bf 100644 --- a/src/error.rs +++ b/src/error.rs @@ -39,14 +39,14 @@ pub enum NtfsError { }, /// The cluster count {cluster_count} is too big InvalidClusterCount { cluster_count: u64 }, - /// The requested NTFS file {n} is invalid - InvalidFile { n: u64 }, /// The NTFS file record at byte position {position:#010x} indicates an allocated size of {expected} bytes, but the record only has a size of {actual} bytes InvalidFileAllocatedSize { position: u64, expected: u32, actual: u32, }, + /// The requested NTFS file record number {file_record_number} is invalid + InvalidFileRecordNumber { file_record_number: u64 }, /// The NTFS file record at byte position {position:#010x} should have signature {expected:?}, but it has signature {actual:?} InvalidFileSignature { position: u64, diff --git a/src/file.rs b/src/file.rs index c5f25a4..9307f87 100644 --- a/src/file.rs +++ b/src/file.rs @@ -16,7 +16,7 @@ use byteorder::{ByteOrder, LittleEndian}; use memoffset::offset_of; #[repr(u64)] -pub enum KnownNtfsFile { +pub enum KnownNtfsFileRecordNumber { MFT = 0, MFTMirr = 1, LogFile = 2, diff --git a/src/ntfs.rs b/src/ntfs.rs index 22b7306..deaa546 100644 --- a/src/ntfs.rs +++ b/src/ntfs.rs @@ -4,7 +4,7 @@ use crate::attribute::NtfsAttributeType; use crate::boot_sector::BootSector; use crate::error::{NtfsError, Result}; -use crate::file::{KnownNtfsFile, NtfsFile}; +use crate::file::{KnownNtfsFileRecordNumber, NtfsFile}; use crate::structured_values::{NtfsVolumeInformation, NtfsVolumeName}; use crate::upcase_table::UpcaseTable; use binread::io::{Read, Seek, SeekFrom}; @@ -66,26 +66,21 @@ impl Ntfs { self.cluster_size } - /// Returns the [`NtfsFile`] for the `n`-th NTFS file record. + /// Returns the [`NtfsFile`] for the given NTFS file record number. /// /// The first few NTFS files have fixed indexes and contain filesystem - /// management information (see the [`KnownNtfsFile`] enum). - /// - /// TODO: - /// - Check if `n` can be u32 instead of u64. - /// - Check if `n` should be in a newtype, with easier conversion from - /// KnownNtfsFile. - pub fn file<'n, T>(&'n self, fs: &mut T, n: u64) -> Result> + /// management information (see the [`KnownNtfsFileRecordNumber`] enum). + pub fn file<'n, T>(&'n self, fs: &mut T, file_record_number: u64) -> Result> where T: Read + Seek, { - let offset = n + let offset = file_record_number .checked_mul(self.file_record_size as u64) - .ok_or(NtfsError::InvalidFile { n })?; + .ok_or(NtfsError::InvalidFileRecordNumber { file_record_number })?; let position = self .mft_position .checked_add(offset) - .ok_or(NtfsError::InvalidFile { n })?; + .ok_or(NtfsError::InvalidFileRecordNumber { file_record_number })?; NtfsFile::new(&self, fs, position) } @@ -111,7 +106,7 @@ impl Ntfs { where T: Read + Seek, { - self.file(fs, KnownNtfsFile::RootDirectory as u64) + self.file(fs, KnownNtfsFileRecordNumber::RootDirectory as u64) } /// Returns the size of a single sector in bytes. @@ -146,7 +141,7 @@ impl Ntfs { where T: Read + Seek, { - let volume_file = self.file(fs, KnownNtfsFile::Volume as u64)?; + let volume_file = self.file(fs, KnownNtfsFileRecordNumber::Volume as u64)?; let attribute = volume_file.attribute_by_ty(NtfsAttributeType::VolumeInformation)?; attribute.resident_structured_value::() } @@ -159,7 +154,7 @@ impl Ntfs { where T: Read + Seek, { - let volume_file = iter_try!(self.file(fs, KnownNtfsFile::Volume as u64)); + let volume_file = iter_try!(self.file(fs, KnownNtfsFileRecordNumber::Volume as u64)); let attribute = volume_file .attribute_by_ty(NtfsAttributeType::VolumeName) .ok()?; diff --git a/src/structured_values/file_name.rs b/src/structured_values/file_name.rs index 72b528a..6ec45b4 100644 --- a/src/structured_values/file_name.rs +++ b/src/structured_values/file_name.rs @@ -182,7 +182,7 @@ impl NtfsIndexEntryKey for NtfsFileName { #[cfg(test)] mod tests { use super::*; - use crate::file::KnownNtfsFile; + use crate::file::KnownNtfsFileRecordNumber; use crate::ntfs::Ntfs; use crate::time::tests::NT_TIMESTAMP_2021_01_01; @@ -190,7 +190,9 @@ mod tests { fn test_file_name() { let mut testfs1 = crate::helpers::tests::testfs1(); let ntfs = Ntfs::new(&mut testfs1).unwrap(); - let mft = ntfs.file(&mut testfs1, KnownNtfsFile::MFT as u64).unwrap(); + let mft = ntfs + .file(&mut testfs1, KnownNtfsFileRecordNumber::MFT as u64) + .unwrap(); let mut mft_attributes = mft.attributes(); // Check the FileName attribute of the MFT. diff --git a/src/structured_values/standard_information.rs b/src/structured_values/standard_information.rs index 3cb9876..9cf55fd 100644 --- a/src/structured_values/standard_information.rs +++ b/src/structured_values/standard_information.rs @@ -125,14 +125,16 @@ impl<'s> NtfsStructuredValueFromSlice<'s> for NtfsStandardInformation { #[cfg(test)] mod tests { use super::*; - use crate::file::KnownNtfsFile; + use crate::file::KnownNtfsFileRecordNumber; use crate::ntfs::Ntfs; #[test] fn test_standard_information() { let mut testfs1 = crate::helpers::tests::testfs1(); let ntfs = Ntfs::new(&mut testfs1).unwrap(); - let mft = ntfs.file(&mut testfs1, KnownNtfsFile::MFT as u64).unwrap(); + let mft = ntfs + .file(&mut testfs1, KnownNtfsFileRecordNumber::MFT as u64) + .unwrap(); let mut mft_attributes = mft.attributes(); // Check the StandardInformation attribute of the MFT. diff --git a/src/upcase_table.rs b/src/upcase_table.rs index 9ee5883..29796c7 100644 --- a/src/upcase_table.rs +++ b/src/upcase_table.rs @@ -3,7 +3,7 @@ use crate::attribute::NtfsAttributeType; use crate::error::{NtfsError, Result}; -use crate::file::KnownNtfsFile; +use crate::file::KnownNtfsFileRecordNumber; use crate::ntfs::Ntfs; use crate::traits::NtfsReadSeek; use binread::io::{Read, Seek}; @@ -35,7 +35,7 @@ impl UpcaseTable { T: Read + Seek, { // Lookup the $UpCase file and its $DATA attribute. - let upcase_file = ntfs.file(fs, KnownNtfsFile::UpCase as u64)?; + let upcase_file = ntfs.file(fs, KnownNtfsFileRecordNumber::UpCase as u64)?; let data_attribute = upcase_file.attribute_by_ty(NtfsAttributeType::Data)?; if data_attribute.value_length() != UPCASE_TABLE_SIZE { return Err(NtfsError::InvalidUpcaseTableSize { -- cgit v1.2.3