Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/windirstat/mft.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOmer Ben-Amram <omerbenamram@gmail.com>2019-05-18 14:15:27 +0300
committerOmer Ben-Amram <omerbenamram@gmail.com>2019-05-18 14:15:27 +0300
commitc7642a52e77ac7420e2a20f92be538a1ae891e71 (patch)
treed18ad3a6aff64b4a778c22471de669359f70b7e0 /src/attribute
parent30c6d49a0ec4518d565c818dd69cff4f7b69d29d (diff)
more progress
Diffstat (limited to 'src/attribute')
-rw-r--r--src/attribute/mod.rs20
-rw-r--r--src/attribute/x10.rs21
-rw-r--r--src/attribute/x30.rs38
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()?);