100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > 开源跨平台数据恢复testdisk源码分析

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

时间:2021-04-04 03:49:17

相关推荐

开源跨平台数据恢复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_synchdaccess.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链表,如果出现循环中增删链表中的节点 容易写出访问已经释放了的对象、死循环等问题, 应该寻求更优雅、更安全的写法。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。