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

attr_x10.rs « src - github.com/windirstat/RustyMft.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: c3982bc88e827476380425b5dac495fbc443b65f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
use errors::{MftError};
use rwinstructs::timestamp::{WinTimestamp};
use rwinstructs::serialize::{serialize_u64};
use byteorder::{ReadBytesExt, LittleEndian};
use std::io::Read;
use std::mem;

#[derive(Serialize, Clone, Debug)]
pub struct StandardInfoAttr {
    pub created: WinTimestamp,
    pub modified: WinTimestamp,
    pub mft_modified: WinTimestamp,
    pub accessed: WinTimestamp,
    pub file_flags: u32,
    pub max_version: u32,
    pub version: u32,
    pub class_id: u32,
    pub owner_id: u32,
    pub security_id: u32,
    #[serde(serialize_with = "serialize_u64")]
    pub quota: u64,
    #[serde(serialize_with = "serialize_u64")]
    pub usn: u64
}
impl StandardInfoAttr {
    pub fn new<R: Read>(mut reader: R) -> Result<StandardInfoAttr,MftError> {
        let mut attribute: StandardInfoAttr = unsafe {
            mem::zeroed()
        };

        attribute.created = WinTimestamp(reader.read_u64::<LittleEndian>()?);
        attribute.modified = WinTimestamp(reader.read_u64::<LittleEndian>()?);
        attribute.mft_modified = WinTimestamp(reader.read_u64::<LittleEndian>()?);
        attribute.accessed = WinTimestamp(reader.read_u64::<LittleEndian>()?);
        attribute.file_flags = reader.read_u32::<LittleEndian>()?;
        attribute.max_version = reader.read_u32::<LittleEndian>()?;
        attribute.version = reader.read_u32::<LittleEndian>()?;
        attribute.class_id = reader.read_u32::<LittleEndian>()?;
        attribute.owner_id = reader.read_u32::<LittleEndian>()?;
        attribute.security_id = reader.read_u32::<LittleEndian>()?;
        attribute.quota = reader.read_u64::<LittleEndian>()?;
        attribute.usn = reader.read_u64::<LittleEndian>()?;

        Ok(attribute)
    }
}

#[cfg(test)]
mod tests {
    use super::StandardInfoAttr;

    #[test]
    fn si_attribute_test_01() {
        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,
            0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
            0x00,0x00,0x00,0x00,0xB0,0x05,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
            0x68,0x58,0xA0,0x0A,0x02,0x00,0x00,0x00
        ];

        let attribute = match StandardInfoAttr::new(attribute_buffer) {
            Ok(attribute) => attribute,
            Err(error) => panic!(error)
        };

        assert_eq!(attribute.created.0, 130207518909951279);
        assert_eq!(attribute.modified.0, 130240946730880342);
        assert_eq!(attribute.mft_modified.0, 130240946730880342);
        assert_eq!(attribute.accessed.0, 130240946730880342);
        assert_eq!(attribute.file_flags, 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);
    }
}