NTFS系统解析
概述
ntfs系统解析是基于Windows下GPT分区的ntfs系统完成的。类似于everyThing快速搜索的程序。相比较everyThing此程序有非常的不足。在算法和内存上还有很大的空间优化。这里所有文件信息获取实现是直接解析ntfs下的结构信息获取得到的。并没有用到Windows的API。在实现上需要了解ntfs系统的结构组成,对感兴趣的信息需要完全熟悉。利用winHex软件对硬盘下信息对比解析,主要实现对数据的获取。主要实现几个功能:
1,快速搜索;
2,数据恢复;
3,系统所有文件的变化监控;
因为程序是直接从物理硬盘直接读取的,隐藏盘的所有文件一样全部获取。
下图为基本流程:
以上是软件运行的基本流程。
一,工具
编程语言:c++
界面:Qt5框架
数据库:sqlite
配置文件:ini
主要用到的算法:快排,快查
二,实现思路
后面说到的盘符,驱动器,逻辑盘都是一样的。
1:获取物理硬盘下的GPT分区信息
1.1:在GPT分区下获取Basic data Partition(基本数据分区),利用Qt中QStorageInfo类获取所有信息(其实也可以获取Windows下的注册表中盘符数据解析对比)对比GPT下数据信息 ;双方都有的盘符,把QStorageInfo类中的盘符保存到基本信息中,QStorageInfo类中没有的信息,说明GPT下的某个盘符是个隐藏盘,用*表示。
实现链接
2:遍历所有盘符,为每个盘符开启一个线程,并发采集数据。中间的信息交互采用Qt中的信号和槽实现。
3:数据获取 - 多线程
3.1:获取mft数据表
3.2:获取盘符名
3.3:获取usnjournal日志信息
3.4:遍历mft数据表,循环读取每一个mft记录感兴趣的信息(感兴趣:个人需要的信息)保存到自定义struct中,把每一个struct保存到QHash中,QHash的key用mft号(mft号在一个盘中永远都是 唯一的,可能存在多个文件使用一个mft号,那么他们共享同一份数据,如果一个文件的数据修改,将会影响其他文件数据) 用于管理。遍历完成后,把信息发送到数据处理中心,方便管理。
3.5:把获取usnjournal日志信息用于开启usnjournal日志的处理,在while循环中监控usnjournal日志信息(盘内的所有数据发生改变都会监控),只获取感兴趣的Reason,发送到数据处理中心,更新数据。
实现链接
4:usnjournal日志保存 - 多线程
4.1:每个盘符下usnjournal采集所有的信息全部发送到usnjournal日志保存,用来记录系统文件的变化。
5:数据库保存 - 多线程
数据库采用Qt下的QSqlite,当软件关闭后采用事务把数据保存到数据库,方便下次启用软件时增加速度。
6:ini配置
保存软件上的配置,usnjournal读取的偏移位置,下次启动软件时信息
三,遇到的问题
1:QFile读取扇区的时候,需要偏移到扇区的首字节才能读取成功,用read读取数据,不要用peek(peek有时会读取不到数据)
等等。。。后续更新