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

mft.rs « src - github.com/windirstat/RustyMft.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 6654f6543a16ce2da3c2f3ad002c113b4452a436 (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
use seek_bufread::BufReader;
use errors::{MftError};
use entry::{MftEntry};
use std::fs::File;
use std::io::Read;
use std::io::Seek;
use std::io::SeekFrom;
use std::mem;

pub struct MftHandler {
    filehandle: BufReader<File>,
    _entry_size: u32,
    _offset: u64,
    _size: u64
}
impl MftHandler{
    pub fn new(filename: &str) -> Result<MftHandler,MftError> {
        let mut mft_handler: MftHandler = unsafe {
            mem::zeroed()
        };

        let mut mft_fh = match File::open(filename) {
            Ok(usn_fh) => usn_fh,
            // Handle error here
            Err(error) => panic!("Error: {}",error)
        };

        // get file size
        mft_handler._size = match mft_fh.seek(SeekFrom::End(0)){
            Err(e) => panic!("Error: {}",e),
            Ok(size) => size
        };

        mft_handler.filehandle = BufReader::with_capacity(
            4096,
            mft_fh
        );

        mft_handler.set_entry_size(1024);

        Ok(mft_handler)
    }

    pub fn set_entry_size(&mut self, entry_size: u32){
        self._entry_size = entry_size
    }

    pub fn get_entry_count(&self)->u64 {
        self._size / self._entry_size as u64
    }

    pub fn entry(&mut self, entry: u64) -> Result<MftEntry,MftError> {
        self.filehandle.seek(
            SeekFrom::Start(entry * self._entry_size as u64)
        ).unwrap();

        let mut entry_buffer = vec![0; self._entry_size as usize];
        self.filehandle.read_exact(&mut entry_buffer)?;

        let mft_entry = self.entry_from_buffer(
            entry_buffer,
            entry
        )?;

        Ok(mft_entry)
    }

    pub fn entry_from_buffer(&mut self, mut buffer: Vec<u8>, entry: u64) -> Result<MftEntry,MftError> {
        let mft_entry = MftEntry::new(
            buffer,
            Some(entry)
        )?;

        Ok(mft_entry)
    }
}