软件开发领域都关心。
分类:
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" <
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的结构,由上一节的声明来定义。