数据恢复之testDisk源码学习(2)

书接上文,咱们这次说的7.2版本testDisk源码, github地址:(GitHub - cgsecurity/testdisk: TestDisk & PhotoRec

其中有三个主应用程序,现在我们从qphotorec开始,并且只关注windows下的代码(项目兼容性强,支持各种平台下的功能),这是基于c++的qt窗口程序,主要功能就是实现扫描并恢复数据,功能相对单一,易于入手。

  1. 项目目录结构总览

项目结构总览

2. 直接定位到src下的qphotorec.cpp这个文件,这是窗口程序基类,是程序启动后执行的第一步:进行各类数据的初始化和读取分析磁盘。

窗口类构造函数-初始化数据

3.解析磁盘函数:hd_parse(我们暂时只关注核心代码,过滤掉窗口相关和次要代码)

129行    list_disk=hd_parse(NULL, verbose, testdisk_mode);
参数分析:第一个参数应该是list_disk_t类型的参数
          第二个参数是verbose:主要用于控制输出的详细程度。这是一个可选的调试参数,通常是一个布尔类型的标志,用来决定函数
                              在运行时是否要输出额外的调试信息或详细日志。
                              verbo = 0: 表示静默模式,此时函数不会输出任何多余的调试信息,适用于生产环境或用户不需要了解
                                       具体的恢复过程时。
                              verbo = 1: 表示详细模式,函数会输出更多的信息,方便开发者或技术人员跟踪硬盘解析和数据恢复的
                                        流程。这在调试或诊断复杂问题时非常有用。
          第三个参数是testdisk_mode: 如上代码中96行,赋值testdist_mode = TESTDISK_O_RDONLY| TESTDISK_O_READAHEAD_32K;
                                      TESTDISK_O_RDONLY表示只读模式很好理解,TESTDISK_O_READAHEAD_32K是指启用了 32KB 的预读功能。
                                      Read-ahead(预读) 是一种文件系统或存储优化技术。它指的是在程序请求某一段数据时,
                                      操作系统或硬件不仅仅只读取当前请求的数据块,还会提前将后续的一些数据块也读入缓存。
                                      这样可以减少后续的 I/O 操作次数,提高性能,尤其是在顺序读取大量数据的情况下。
                                      32K (32KB) 表示每次的预读数据块大小。在启用该宏时,TestDisk 每次从磁盘读取数据时,
                                      系统可能会提前读取接下来的 32KB 数据并缓存,以便后续访问时减少磁盘 I/O 操作,
                                      提升恢复操作的速度。

进入hd_parse函数的内部( hdaccess.c文件):

    char device_hd[]="\\\\.\\PhysicalDrive00";
    char device_cdrom[]="\\\\.\\C:";
    /* Disk 磁盘(我们主要说这快) */ 
    for(i=0;i<64;i++)
    {
      disk_t *disk_car;
      sprintf(device_hd,"\\\\.\\PhysicalDrive%u", i);  //从0号开始遍历所有磁盘
      disk_car=file_test_availability_win32(device_hd, verbose, testdisk_mode);
      list_disk=insert_new_disk(list_disk,disk_car);
    }
    /* cdrom and digital camera CD光盘和数码相机---暂时跳过这部分*/
    for(i='C';i<='Z';i++)
    {
      disk_t *disk_car;
      device_cdrom[strlen(device_cdrom)-2]=i;
      disk_car=file_test_availability_win32(device_cdrom, verbose, testdisk_mode);
      if((testdisk_mode&TESTDISK_O_ALL)==TESTDISK_O_ALL)
	list_disk=insert_new_disk(list_disk,disk_car);
      else
	list_disk=insert_new_disk_nodup(list_disk,disk_car,device_cdrom, verbose);
    }
  }

再跳入file_test_availability_win32(device_hd, verbose, testdisk_mode)函数(Win32.c)

      三个参数当下的值:
      device_hd='\\\\.\\PhysicalDrive00'  
      verbose=1
      testdisk_mode=TESTDISK_O_RDONLY| TESTDISK_O_READAHEAD_32K

disk_t *file_test_availability_win32(const char *device, const int verbose, int testdisk_mode)
{
  disk_t *disk_car=NULL;
  HANDLE handle=INVALID_HANDLE_VALUE;
  int mode=0;
  int try_readonly=1;
  if((testdisk_mode&TESTDISK_O_RDWR)==TESTDISK_O_RDWR) //testdisk_mode传参是只读,所以不会进来
  {
    mode = FILE_READ_DATA | FILE_WRITE_DATA;
    handle = CreateFile(device,mode, (FILE_SHARE_WRITE | FILE_SHARE_READ),
	NULL, OPEN_EXISTING, 0, NULL);
    if (handle == INVALID_HANDLE_VALUE)
    {
     try_readonly=0;
     }
   }
   if(handle==INVALID_HANDLE_VALUE && try_readonly>0) //直接跳入这儿
   {
    testdisk_mode&=~TESTDISK_O_RDWR;
    mode = FILE_READ_DATA;  //只读模式
    handle = CreateFile(device,mode, (FILE_SHARE_WRITE | FILE_SHARE_READ),
	NULL, OPEN_EXISTING, 0, NULL);
    }
}

CreateFile:打开文件或 I/O 设备,参数比较简单,着重说几个。

OPEN_EXISTING:仅当文件或设备存在时才打开该文件或设备。

FILE_SHARE_WRITE | FILE_SHARE_READ:Windows 文件共享模式标志,都置为看可读可写,表示不锁 定设备,在本进程打开设备的时候,其他设备还能正常的进行读写操作。

函数执行成功返回设备的打开句柄,否则返回INVALID_HANDLE_VALUE

函数详情参见:CreateFileA 函数 (fileapi.h) - Win32 apps

下次和大家一起看看代码中的那些自定义结构体的作用!

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值