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
80
81
82
83
84
85
86
87
88
89
use crate::err::{Result};
use log::trace;
use byteorder::{LittleEndian, ReadBytesExt};
use chrono::{DateTime, Utc};
use serde::Serialize;
use std::io::Read;
use winstructs::timestamp::WinTimestamp;
#[derive(Serialize, Debug, Clone)]
pub struct StandardInfoAttr {
pub created: DateTime<Utc>,
pub modified: DateTime<Utc>,
pub mft_modified: DateTime<Utc>,
pub accessed: DateTime<Utc>,
pub file_flags: u32,
pub max_version: u32,
pub version: u32,
pub class_id: u32,
pub owner_id: u32,
pub security_id: u32,
pub quota: u64,
pub usn: u64,
}
impl StandardInfoAttr {
pub fn from_reader<R: Read>(reader: &mut R) -> Result<StandardInfoAttr> {
trace!("StandardInfoAttr");
let created = WinTimestamp::from_reader(reader)?.to_datetime();
let modified = WinTimestamp::from_reader(reader)?.to_datetime();
let mft_modified = WinTimestamp::from_reader(reader)?.to_datetime();
let accessed = WinTimestamp::from_reader(reader)?.to_datetime();
let file_flags = reader.read_u32::<LittleEndian>()?;
let max_version = reader.read_u32::<LittleEndian>()?;
let version = reader.read_u32::<LittleEndian>()?;
let class_id = reader.read_u32::<LittleEndian>()?;
let owner_id = reader.read_u32::<LittleEndian>()?;
let security_id = reader.read_u32::<LittleEndian>()?;
let quota = reader.read_u64::<LittleEndian>()?;
let usn = reader.read_u64::<LittleEndian>()?;
Ok(StandardInfoAttr {
created,
modified,
mft_modified,
accessed,
file_flags,
max_version,
version,
class_id,
owner_id,
security_id,
quota,
usn,
})
}
}