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
use crate::err::Result;
use byteorder::{ByteOrder, LittleEndian, ReadBytesExt};
use serde::Serialize;
#[derive(Serialize, Debug, Hash, Eq, PartialEq, Copy, Clone)]
pub struct MftReference {
pub entry: u64,
pub sequence: u16,
}
use std::io::Read;
impl MftReference {
pub fn new(entry: u64, sequence: u16) -> Self {
MftReference { entry, sequence }
}
pub fn from_reader<R: Read>(reader: &mut R) -> Result<Self> {
Ok(Self::from(reader.read_u64::<LittleEndian>()?))
}
}
impl From<u64> for MftReference {
fn from(mft_entry: u64) -> Self {
let mut as_bytes: [u8; 8] = mft_entry.to_le_bytes();
let sequence = LittleEndian::read_u16(&as_bytes[6..8]);
as_bytes[6] = 0;
as_bytes[7] = 0;
let entry = LittleEndian::read_u64(&as_bytes);
MftReference { entry, sequence }
}
}
#[cfg(test)]
mod tests {
use super::MftReference;
use std::io::Cursor;
#[test]
fn test_mft_reference() {
let raw_reference = vec![0x73, 0x00, 0x00, 0x00, 0x00, 0x00, 0x68, 0x91];
let mft_reference = MftReference::from_reader(&mut Cursor::new(raw_reference)).unwrap();
assert_eq!(mft_reference.entry, 115);
assert_eq!(mft_reference.sequence, 37224);
}
}