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

开源跨平台数据恢复testdisk源码分析相关推荐

  1. DDPush开源推送框架源码分析之APPServer到DDPush

    DDPush 任意门推送 DDPush是什么 DDPush (Dimension Door Push),任意门推送,是一款开源免费的单机千万级实时信息推送服务器,使用Java语言开发,具有简单.稳定. ...

  2. 开源僵尸网络平台LiteHttp源码分析

    一. 简介 如今,黑客越来越多的通过修改开源的病毒源码来实现快速的病毒开发,如Mirai.qbot等公开了源码的病毒,常被黑客用于二次开发,用以攻击.前不久,一起针对巴基斯坦的APT攻击中,发现黑客所 ...

  3. IEC61499开源项目FORTE部分源码分析

    一.IEC 61499简介 IEC 61499 作为工业自动化领域分布式控制系统级建模语言的标准,其第一(体系结构).二(软件工具要求).四(兼容文件的规则)部分的第一版于 2005 年正式发布,并在 ...

  4. NeteaseCloudMusicApi 开源 网易云nodeapi 源码分析

    这篇文章,分享下网易云开源的一个api,通过伪造请求来获取网易云的歌曲,评论和电台等信息. 首先,大致描述项目里用到的一些知识点 涉及到的知识点 apicache 缓存中间件,可以用于redis,项目 ...

  5. 【开源项目】X-TRACK源码分析

    文章目录 X-TRACK阅读笔记 整体架构 PageManager 问题 页面的分析 StatusBar Startup页面 Dilaplate页面 页面的布局 动画的设置 LiveMap页面 Sys ...

  6. 微软开源软件特征源码分析工具 Application Inspector

    微软近日开源了其内部使用的软件特征源码分析工具 Application Inspector. 现代软件开发实践通常需要基于数百个现有组件中构建应用,无论它们是由组织中的另一个团队.外部供应商还是开源社 ...

  7. java web开源项目源码_超赞!推荐一个专注于Java后端源码分析的Github项目!

    大家好,最近有小伙伴们建议我把源码分析文章及源码分析项目(带注释版)放到github上,这样小伙伴们就可以把带中文注释的源码项目下载到自己本地电脑,结合源码分析文章自己本地调试,总之对于学习开源项目源 ...

  8. Go实现的5G核心网开源项目free5gc源码分析系列 | Gopher Daily (2021.01.08) ʕ◔ϖ◔ʔ

    每日一谚:"Abstractions should be discovered, not created." Go技术新闻 Go实现的5G核心网开源项目free5gc源码分析系列 ...

  9. (4.2.40)阿里开源路由框架ARouter的源码分析

    一需求背景 1 Android原生方案的不足 2 自定义路由框架的适用场景 3 对自定义路由框架的设想 二ARouter的概述 三ARouter的引入和使用 四源码分析 1 arouter-annot ...

最新文章

  1. c# 操作文件_小练习(音乐播放器)
  2. 王侠对话农民丰收节交易会 万祥军:解读供销社服务平台
  3. pytorch自定义数据集DataLoder
  4. robocopy 备份_通过Robocopy+DOS 命令+Windows排程实现自动备份(将特定文件/目录备份至自动创建的以年月日命名的目标目录)...
  5. 学习笔记-AngularJs(十)
  6. fopen php 读取_PHP使用fopen与file_get_contents读取文件实例分享
  7. setsockopt函数功能介绍
  8. HTML画笔移出画布停止,html5 canvas画布无法清除
  9. 无外网情况下RPM方式安装MySQL5.6
  10. ssm框架图片上传与显示_SSM在线考试系统
  11. PHP获得文件的md5并检验是否被修改
  12. python换行符号长度_创建带换行符的可调整大小/多行Tkinter/ttk标签
  13. 『中级篇』Docker-Stack部署wordpress(49)
  14. 第31次中国互联网络发展状况统计报告
  15. python贴吧签到-基于Python3+Requests的贴吧签到助手
  16. ALIGN:自动化模拟布局的系统
  17. 11_传智播客iOS视频教程_NS前缀和@符号
  18. Google Code Jam 2010 Qualification Round 资格赛 Problem A. Snapper Chain 问题A.按扣链条
  19. Unity出IOS包报错记 -1
  20. echaarts水滴(水球图)波浪效果

热门文章

  1. 047.利用递归求等差数列的和
  2. 微信应用号(小程序)开发指南与开发工具
  3. 二句话就可治疗颈椎病
  4. Android应用如何支持不同的语言和文化
  5. 让百度地图生成器里的“标注”内容展开--解决方案
  6. OpenShift Container Platform 4.3部署实录
  7. 数据库的概念模型,联系,E-R模型的设计方法
  8. sqlite数据库加锁提交_怎样给sqlite数据库设定密码
  9. 基于java+springboot的黄山旅游景点购票系统-计算机毕业设计
  10. 河南科技学院新科学院计算机,河南科技学院新科学院网络管理系统