Chinaunix首页 | 论坛 | 博客
  • 博客访问: 309048
  • 博文数量: 48
  • 博客积分: 2635
  • 博客等级: 少校
  • 技术积分: 495
  • 用 户 组: 普通用户
  • 注册时间: 2005-02-16 18:07
个人简介

软件开发领域都关心。

文章分类

全部博文(48)

文章存档

2013年(1)

2012年(1)

2011年(4)

2010年(3)

2009年(4)

2008年(7)

2007年(13)

2006年(3)

2005年(12)

分类:

2005-12-18 18:50:54

发表了解析文章一以后看到阅读的人还挺多。可是时间有限,所以更新比较慢。

以前的数据结构有些参考freebsd的ntfs驱动,有些过时了,更改了一点。

前面只是写了用到的数据结构,本节加入了从MBR到NTFS的代码程序。

MBR是x86结构机器中磁盘的第一个sector。从offset 0x1BE开始是分区的信息。分区如果是扩展分区,则指向了扩展分区所在的sector。扩展分区是单链表的形式。

下面的代码是从MBR到解析出所有partitions的片断,采用了递归。自己写的,不一定是最佳方法,仅供参考。

//parse the extend partitions

int DiskWinNt::ParseEverySectorParts(uint64_t start_sectors, uint64_t main_preRelSect)
{
 uint8_t cur_sector[512];
 uint64_t preRelSect = 0;
 Read(start_sectors * 512, 512, cur_sector);
 for(int i=0; i < 4; i++)
 {
  cout << "try to parse a sector for parts" <  struct partition_dos* p_part_extend = pt_offset(cur_sector, i);
  if(p_part_extend->sys_ind == P_EXTENDED || p_part_extend->sys_ind == P_EXTENDX)
  {
   preRelSect = p_part_extend->dwRelativeSector;
   if(ParseEverySectorParts(preRelSect+main_preRelSect, main_preRelSect) > 0)
   {
   
   }
   else
   {
   }
  }
  else if(p_part_extend->sys_ind == P_NO_OS)
  {
   break;
  }
  else
  {
   Parti386* part = new Parti386(p_part_extend, this);
   if(part -> fs_type.part_type != P_NO_OS)
   {
    part->start_sectors = p_part_extend->dwRelativeSector+start_sectors;
    part->LoadFileSystem();
    this->parts.push_back(part);
   }
  }
 }
 if(i == 4)
 {
  return -1;
 }
 else
 {
  return 0;
 }
}

main_preRelSect 是基本的偏移量,是第一个扩展分区的偏移量。第一次读取,和这个类似读到。

 uint64_t mainRelSect = 0;
 for(int i=0; i<4; i++)
 {
  struct partition_dos* p_part_extend = pt_offset(MBR_sector, i);   
  if(p_part_extend->sys_ind == P_EXTENDED || p_part_extend->sys_ind == P_EXTENDX)
  {
   mainRelSect = p_part_extend ->dwRelativeSector;
   ParseEverySectorParts(mainRelSect, mainRelSect);
  }
  else if(p_part_extend->sys_ind == P_NO_OS)
  {
   break;
  }
  else
  {
   Parti386* part = new Parti386(p_part_extend, this);
   if(part -> fs_type.part_type != P_NO_OS)
   {
    part->start_sectors = mainRelSect + p_part_extend ->dwRelativeSector;
    part->LoadFileSystem();
    this->parts.push_back(part);
   }
  }
 }

 //ParseEverySectorParts(0);
 return parts.size();

对于每一个partition都有一个类来描述。文件系统的类型可以从分区的第一个sector来读取。

对于ntfs的分区,第一个sector的结构,由上一节的声明来定义。

阅读(2317) | 评论(0) | 转发(0) |
0

上一篇:NTFS解析代码

下一篇:3G,VoIP与WiMax

给主人留下些什么吧!~~