diff options
author | Omer Ben-Amram <omerbenamram@gmail.com> | 2019-05-18 14:15:27 +0300 |
---|---|---|
committer | Omer Ben-Amram <omerbenamram@gmail.com> | 2019-05-18 14:15:27 +0300 |
commit | c7642a52e77ac7420e2a20f92be538a1ae891e71 (patch) | |
tree | d18ad3a6aff64b4a778c22471de669359f70b7e0 /src/attribute | |
parent | 30c6d49a0ec4518d565c818dd69cff4f7b69d29d (diff) |
more progress
Diffstat (limited to 'src/attribute')
-rw-r--r-- | src/attribute/mod.rs | 20 | ||||
-rw-r--r-- | src/attribute/x10.rs | 21 | ||||
-rw-r--r-- | src/attribute/x30.rs | 38 |
3 files changed, 39 insertions, 40 deletions
diff --git a/src/attribute/mod.rs b/src/attribute/mod.rs index 2b890a6..eca250e 100644 --- a/src/attribute/mod.rs +++ b/src/attribute/mod.rs @@ -63,6 +63,26 @@ pub enum MftAttributeType { } bitflags! { + pub struct FileAttributeFlags: u32 { + const FILE_ATTRIBUTE_READONLY = 0x0000_0001; + const FILE_ATTRIBUTE_HIDDEN = 0x0000_0002; + const FILE_ATTRIBUTE_SYSTEM = 0x0000_0004; + const FILE_ATTRIBUTE_ARCHIVE = 0x0000_0020; + const FILE_ATTRIBUTE_DEVICE = 0x0000_0040; + const FILE_ATTRIBUTE_NORMAL = 0x0000_0080; + const FILE_ATTRIBUTE_TEMPORARY = 0x0000_0100; + const FILE_ATTRIBUTE_SPARSE_FILE = 0x0000_0200; + const FILE_ATTRIBUTE_REPARSE_POINT = 0x0000_0400; + const FILE_ATTRIBUTE_COMPRESSED = 0x0000_0800; + const FILE_ATTRIBUTE_OFFLINE = 0x0000_1000; + const FILE_ATTRIBUTE_NOT_CONTENT_INDEXED = 0x0000_2000; + const FILE_ATTRIBUTE_ENCRYPTED = 0x0000_4000; + } +} + +impl_serialize_for_bitflags! {FileAttributeFlags} + +bitflags! { #[derive(Default)] pub struct AttributeDataFlags: u16 { const IS_COMPRESSED = 0x0001; diff --git a/src/attribute/x10.rs b/src/attribute/x10.rs index 7e08ec0..ce7a610 100644 --- a/src/attribute/x10.rs +++ b/src/attribute/x10.rs @@ -1,6 +1,7 @@ +use crate::attribute::FileAttributeFlags; use crate::err::{self, Result}; - use crate::ReadSeek; + use byteorder::{LittleEndian, ReadBytesExt}; use chrono::{DateTime, Utc}; use log::trace; @@ -14,7 +15,8 @@ pub struct StandardInfoAttr { pub modified: DateTime<Utc>, pub mft_modified: DateTime<Utc>, pub accessed: DateTime<Utc>, - pub file_flags: u32, + /// DOS File Permissions + pub file_flags: FileAttributeFlags, pub max_version: u32, pub version: u32, pub class_id: u32, @@ -33,8 +35,8 @@ impl StandardInfoAttr { /// /// ``` /// use mft::attribute::x10::StandardInfoAttr; + /// use mft::attribute::FileAttributeFlags; /// # use std::io::Cursor; - /// # fn test_standard_information() { /// let attribute_buffer: &[u8] = &[ /// 0x2F,0x6D,0xB6,0x6F,0x0C,0x97,0xCE,0x01,0x56,0xCD,0x1A,0x75,0x73,0xB5,0xCE,0x01, /// 0x56,0xCD,0x1A,0x75,0x73,0xB5,0xCE,0x01,0x56,0xCD,0x1A,0x75,0x73,0xB5,0xCE,0x01, @@ -45,18 +47,17 @@ impl StandardInfoAttr { /// /// let attribute = StandardInfoAttr::from_reader(&mut Cursor::new(attribute_buffer)).unwrap(); /// - /// assert_eq!(attribute.created.timestamp(), 130207518909951279); - /// assert_eq!(attribute.modified.timestamp(), 130240946730880342); - /// assert_eq!(attribute.mft_modified.timestamp(), 130240946730880342); - /// assert_eq!(attribute.accessed.timestamp(), 130240946730880342); - /// assert_eq!(attribute.file_flags, 32); + /// assert_eq!(attribute.created.timestamp(), 1376278290); + /// assert_eq!(attribute.modified.timestamp(), 1379621073); + /// assert_eq!(attribute.mft_modified.timestamp(), 1379621073); + /// assert_eq!(attribute.accessed.timestamp(), 1379621073); + /// assert_eq!(attribute.file_flags.bits(), 32); /// assert_eq!(attribute.max_version, 0); /// assert_eq!(attribute.version, 0); /// assert_eq!(attribute.class_id, 0); /// assert_eq!(attribute.security_id, 1456); /// assert_eq!(attribute.quota, 0); /// assert_eq!(attribute.usn, 8768215144); - /// # } /// ``` pub fn from_reader<S: ReadSeek>(reader: &mut S) -> Result<StandardInfoAttr> { trace!("Offset {}: StandardInfoAttr", reader.tell()?); @@ -78,7 +79,7 @@ impl StandardInfoAttr { modified, mft_modified, accessed, - file_flags: reader.read_u32::<LittleEndian>()?, + file_flags: FileAttributeFlags::from_bits_truncate(reader.read_u32::<LittleEndian>()?), max_version: reader.read_u32::<LittleEndian>()?, version: reader.read_u32::<LittleEndian>()?, class_id: reader.read_u32::<LittleEndian>()?, diff --git a/src/attribute/x30.rs b/src/attribute/x30.rs index 9fa4453..f073b9e 100644 --- a/src/attribute/x30.rs +++ b/src/attribute/x30.rs @@ -1,8 +1,8 @@ +use crate::attribute::FileAttributeFlags; use crate::err::{self, Result}; -use crate::{impl_serialize_for_bitflags, ReadSeek}; +use crate::ReadSeek; use log::trace; -use bitflags::bitflags; use byteorder::{LittleEndian, ReadBytesExt}; use encoding::all::UTF_16LE; use encoding::{DecoderTrap, Encoding}; @@ -30,26 +30,6 @@ pub struct FileNameAttr { pub name: String, } -bitflags! { - pub struct FileAttributeFlags: u32 { - const FILE_ATTRIBUTE_READONLY = 0x0000_0001; - const FILE_ATTRIBUTE_HIDDEN = 0x0000_0002; - const FILE_ATTRIBUTE_SYSTEM = 0x0000_0004; - const FILE_ATTRIBUTE_ARCHIVE = 0x0000_0020; - const FILE_ATTRIBUTE_DEVICE = 0x0000_0040; - const FILE_ATTRIBUTE_NORMAL = 0x0000_0080; - const FILE_ATTRIBUTE_TEMPORARY = 0x0000_0100; - const FILE_ATTRIBUTE_SPARSE_FILE = 0x0000_0200; - const FILE_ATTRIBUTE_REPARSE_POINT = 0x0000_0400; - const FILE_ATTRIBUTE_COMPRESSED = 0x0000_0800; - const FILE_ATTRIBUTE_OFFLINE = 0x0000_1000; - const FILE_ATTRIBUTE_NOT_CONTENT_INDEXED = 0x0000_2000; - const FILE_ATTRIBUTE_ENCRYPTED = 0x0000_4000; - } -} - -impl_serialize_for_bitflags! {FileAttributeFlags} - impl FileNameAttr { /// Parse a Filename attrbiute buffer. /// @@ -60,7 +40,6 @@ impl FileNameAttr { /// ``` /// use mft::attribute::x30::FileNameAttr; /// # use std::io::Cursor; - /// # fn test_filename_attribute() { /// let attribute_buffer: &[u8] = &[ /// 0x05,0x00,0x00,0x00,0x00,0x00,0x05,0x00,0xD5,0x2D,0x48,0x58,0x43,0x5F,0xCE,0x01, /// 0xD5,0x2D,0x48,0x58,0x43,0x5F,0xCE,0x01,0xD5,0x2D,0x48,0x58,0x43,0x5F,0xCE,0x01, @@ -72,19 +51,18 @@ impl FileNameAttr { /// /// let attribute = FileNameAttr::from_stream(&mut Cursor::new(attribute_buffer)).unwrap(); /// - /// assert_eq!(attribute.parent.entry, 1407374883553285); - /// assert_eq!(attribute.created.timestamp(), 130146182088895957); - /// assert_eq!(attribute.modified.timestamp(), 130146182088895957); - /// assert_eq!(attribute.mft_modified.timestamp(), 130146182088895957); - /// assert_eq!(attribute.accessed.timestamp(), 130146182088895957); + /// assert_eq!(attribute.parent.entry, 5); + /// assert_eq!(attribute.created.timestamp(), 1370144608); + /// assert_eq!(attribute.modified.timestamp(), 1370144608); + /// assert_eq!(attribute.mft_modified.timestamp(), 1370144608); + /// assert_eq!(attribute.accessed.timestamp(), 1370144608); /// assert_eq!(attribute.logical_size, 67108864); /// assert_eq!(attribute.physical_size, 67108864); - /// assert_eq!(attribute.flags, 6); + /// assert_eq!(attribute.flags.bits(), 6); /// assert_eq!(attribute.reparse_value, 0); /// assert_eq!(attribute.name_length, 8); /// assert_eq!(attribute.namespace, 3); /// assert_eq!(attribute.name, "$LogFile"); - /// # } /// ``` pub fn from_stream<S: ReadSeek>(stream: &mut S) -> Result<FileNameAttr> { trace!("Offset {}: FilenameAttr", stream.tell()?); |