开源跨平台数据恢复testdisk源码分析

testdisk 是一款开源数据恢复软件

testdisk概述

大部分代码是c语言编写, 很少部分是c++

使用交叉编译器gcc、#ifdefine 、分别编写linux 、windows、mac下的磁盘访问函数, 实现 编译成 linux , windows , mac 下的可执行文件.

c语言没有链表库, 作者用了个巧 实现了通用链表,大致如下

链表串结构体 以 遍历 结构体

链表串结构体 以 遍历 结构体 , 被遍历的结构体是任意的. 可以算是次通用链表.

/**
 *
struct td_list_head list; // 自定义链表节点: 横向串起各种它所在的结构体, 形成链表结构
td_list_entry //该宏作用是 从 自定义链表节点 找到其所在结构体指针
td_list_for_each // 该宏作用是 沿着 自定义链表节点 遍历该链表

链表串结构体 以 遍历 结构体 分析:
 1.整体描述
 假设链表是横向的, 每个链表节点又是一个纵向结构体的成员, 目标是要遍历每个结构体.
 沿着自定义链表节点 遍历链表,  当在任意一个链表节点上 能 纵向的 找到 包含该链表节点 的 结构体 ,  这样就实现了 对这些结构体列表进行遍历.
 
 说明:
 链表节点定义:struct td_list_head list. 命名为 链表节点
 遍历:td_list_for_each. 命名为  遍历宏
 从 横向的链表节点 推导到 纵向的结构体 , 用宏 td_list_entry. 命名为 结构体推导宏.


 //这些动作, 最终的作用是: 在c语言中 实现一套简易的 list, for_each(list)
 2.杂项描述
 list.h中的 :
    宏 TD_INIT_LIST_HEAD : 初始化空链表, 没有任何元素.
    宏或者函数 td_list_add_* : 对链表的各种操作


"链表串结构体 以 遍历 结构体" 改为c++方案:
  用c++ std::list 将这些结构体串起来.
 */
struct td_list_head {
    struct td_list_head *next, *prev;
};

主要结构体

目前搞明白 了 list_disk_t, list_part_t, file_info_t . 全部都是通过 以上 “链表串结构体 以 遍历 结构体” 以实现链表.

所谓跨平台

编写一组 具有相同函数签名的 磁盘写、磁盘读、磁盘同步 函数, 如下:

  • win32.c : file_win32_pwrite, file_win32_pread, file_win32_sync,
  • ewf.c : fewf_pwrite, fewf_pread, fewf_sync
  • hdaccess.c : file_pwrite, file_pread, file_sync

比较完美的是, 在windows下编译win32.c, 在linux下编译linux.c, 在mac下编译mac.c, 但实际是:
在某一个操作系统平台下, 只会编译对应能支持该操作系统的 以上三个.c中的一个

在不同操作系统下编译 通过 函数指针 pread, pwirte, sync 指向 对应组的 那组 函数

testdisk代码优缺点

  • 优点:

数据恢复开源软件 能看的基本只有testdisk

看起来支持绝大部分文件系统,枚举了不少文件类型。

  • 缺点:

对一种文件系统 的支持 写在 该文件系统_*.c中了, 这样基本是能隔离开不同文件系统了. 但是 文件系统中的结构是 硬编码的, 导致很难看。 比如MBR, 比较合理的应该是 有一个描述MBR的描述文件, 然后根据该描述文件 生成 访问MBR结构中各部分的代码。

基本上都是纯c,各种遍历原始链表。 这些是可以用c++的std替代的。

各种malloc、free。 这应该使用c++的智能指针来代替。

接口函数、实现函数 散落分离的太远、太隐藏, 不能显然的看出来 有哪些接口 和 该接口有对应的哪些不同实现。 这应该可以用c++的class、多态 来改进。

日志打印太原始,日志没有及时flush,导致进程结束 才看到日志文件变化。

即使改成c++ std::list链表,如果出现循环中增删链表中的节点 容易写出访问已经释放了的对象、死循环等问题, 应该寻求更优雅、更安全的写法。

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
TestDisk 是一款强大 的免费数据恢复软件。主要用于病毒或人为误操作(如不小心删除分区表)导致的分区丢失,帮助用户恢复丢失分区,或修复不能启动的磁盘。 支持 DOS, Win32, MacOSX 及 Linux 平台。 TestDisk支持以下功能: 修复分区表, 恢复已删除分区 用FAT32备份表恢复启动扇区 重建FAT12/FAT16/FAT32启动扇区 修复FAT表 重建NTFS启动扇区 用备份表恢复NTFS启动扇区 用MFT镜像表(MFT Mirror)修复MFT表 查找ext2/ext3/ext4备份的SuperBlock 从FAT,NTFS及ext2文件系统恢复删除文件 从已删除的FAT,NTFS及ext2/ext3/ext4分区复制文件. TestDisk拥有两种模式:新手模式和专家模式。对于那些对数据恢复技巧了解很少,甚至完全一无所知的人来说,Testdisk可用于收集非启 动分区的详细信息,后续再发送给专业数据恢复人员进一步分析。 对于那些对数据恢复较为熟悉的人员来说, Testdisk是一款现场非常容易操作的数据恢复工具。 TestDisk 可恢复以下文件系统的丢失分区: BeFS ( BeOS ) BSD disklabel ( FreeBSD/OpenBSD/NetBSD ) CramFS, 压缩文件系统 DOS/Windows FAT12, FAT16 和 FAT32 Windows exFAT HFS, HFS+ 和 HFSX (Hierarchical File System) JFS (IBM’s Journaled File System) Linux ext2, ext3 和ext4 Linux LUKS 加密分区 Linux RAID md 0.9/1.0/1.1/1.2 RAID 1: 镜像(Mirror) RAID 4: 带容错的条带阵列 RAID 5: 带分布式冗余信息的条带阵列 RAID 6: 带分布式双冗余信息的条带阵列 Linux Swap (版本1 和 2) LVM 和 LVM2, Linux逻辑卷管理器(Linux Logical Volume Manager) Mac partition map Novel NSS (Novell Storage Services) NTFS ( Windows NT/2000/XP/2003/Vista/2008 ) ReiserFS 3.5, 3.6 和 4 Sun Solaris i386 disklabel Unix文件系统-UFS and UFS2 (Sun/BSD/…) XFS, SGI’s Journaled File System
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ziix

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值