总有人间一两风,填我十万八千梦

MBR格式磁盘分区表分析<二>扩展分区、逻辑分区(含源代码)

Windows C/C++ Zero、J 7104℃ 0评论

接上一篇文章《MBR格式磁盘分区表分析<一>》,我们来继续探讨分区表扩展分区的部分,扩展分区该怎么说呢,你可以把扩展分区整体上也看做是一个“主分区”,在主分区表中也有一个表项描述了这个扩展分区的信息,就像上文中描述主分区的表项类似,这个扩展分区表项描述了扩展分区的起始扇区位置和整个扩展分区的大小,在这个扩展分区内部,我们可以创建多个逻辑分区,你可以把整个扩展分区当作是一个新的“硬盘”,在扩展分区内部的逻辑分区是由与之相对应的逻辑分区表项进行维护的。

上文中,我们说到如果我们的硬盘全部都是主分区的话,那么分区管理的图可以按照下面的方式进行描述:

demoallmainpt

从上图中可以看到,四个表项全部对应的是主分区,这四个分区全部都是由主分区表这个结点进行维护管理,也就是说一个结点对应多个主分区。如果我们的主分区表中的表项2对应的分区是一个扩展分区,扩展分区内部有多个逻辑分区的话,那么我们的主管理结点就没办法对逻辑分区进行描述了,这个时候就需要逻辑管理结点来对逻辑分区进行描述了。

在扩展分区中,每一个逻辑分区都有一个与之对应的逻辑管理结点,逻辑管理结点与硬盘的主管理结点结构是一样的,不同的是逻辑管理结点中的四个表项只有前两个表项是有用的,逻辑结点中,第一个表项描述了当前结点对应的逻辑分区信息,第二个表项描述的下一个逻辑管理结点的位置;这样看来这是一个二叉树的结构,我们可以用下图描述扩展分区内的逻辑分区的关系:

logicdemo_

 

逻辑分区表项的意义和主分区表项的意义是一致的,但是需要注意的是表项中给出的起始扇区地址,这些地址是相对的地址,来举个例子,这里把U盘格式化出一个主分区,一个扩展分区,扩展分区内部有3个逻辑分区,我们来分析一下,如图所示:

usbextdemo

我们来看一下主分区表的结构:usbextdemodpt
80 20 21 00 07 0E 70 DE 00 08 00 00 00 28 75 00
00 0E 71 DE 0F FE FF FF 00 30 75 00 00 70 5F 01
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

可以看到,主分区表中只有2项,第一项 (80) (20 21 00) (07) (0E 70 DE) (00 08 00 00) (00 28 75 00),80表示激活,07表示NTFS,分区起始地址0x00000800,大小为0x00752800,既然第一个主分区从0x00000800开始的,分区的上面是结点,你说第一个主管理结点大小是多少?肯定是0x800;好我们接着看第二项,(00) (0E 71 DE) (0F) (FE FF FF) (00 30 75 00) (00 70 5F 01),00表示没激活,0F表示扩展分区,扩展分区的起始地址是0x00753000 ,大小为0x015F7000,这个时候要注意了,我前面说扩展分区可以当作一个新的“硬盘”,那么这个硬盘得有一个起始的地址吧,我们记作L0,那么L0这里就是0x00753000。

好了,我们已经知道L0=0x00753000了,我们也知道扩展分区内的节点是一个二叉树的结构了,那么我们现在开始进入扩展分区吧,进入到0x00753000这个扇区,这就是第一个逻辑管理节点所在的扇区了,这个逻辑结点里面有两项:LOGICNODE1

 

第一项 (00) (2F 52 DE) (07) (1D E1 BC) (00 08 00 00) (00 28 75 00) 描述的是当前逻辑节点管理的逻辑分区信息,这一项说当前的逻辑分区开始于相对于当前结点0X00000800的位置也就是当前结点的起始位置0x00753000+0X00000800=0x753800,大小为0x00752800,这样第一个逻辑分区就完成了

第二项 (00) (0E 71 DE) (0F) (FE FF FF) (00 30 75 00) (00 70 5F 01)描述的是下一个逻辑管理结点的位置,注意这里它描述的下一个结点的相对位置为0x00753000,相对的是L0,也就是扩展分区的起始地址,所以我们计算出下一个管理结点的位置为L0+0x00753000=0x00EA6000 (注意我这里刚好巧合L0也是0x753000了= =)

我们从前面的分析知道了第二个逻辑结点为0x00EA6000,我们进入这个扇区看看,这个逻辑节点也有2项:

logicnode2

 

00 3E C3 BC 07 FE FF FF 00 08 00 00 00 28 75 00
00 FE FF FF 05 FE FF FF 00 60 EA 00 00 10 75 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

第一项 (00) (3E C3 BC) (07) (FE FF FF) (00 08 00 00) (00 28 75 00)计算得出 当前的逻辑分区起始扇区:当前逻辑节点的起始+0x000000800 = 0x00EA6000+0x000000800=0x00EA6800,大小为0x00752800

第二项 (00) (FE FF FF) (05) (FE FF FF) (00 60 EA 00) (00 10 75 00),描述的是下一个结点的位置,可以得出下一个结点的起始扇区为:L0+0x00EA6000 = 0x00753000+0x00EA6000=0x015F9000

后面的我们就不分析了,通过上面的例子我想现在你应该已经能准确计算出你的MBR硬盘的分区信息了,总结一下两篇文章的主要方法:

  1. 找到硬盘0号逻辑扇区,读取0x40个字节的主分区表信息
  2. 第一个分区前面的部分就是主管理节点的大小(主管理节点从0x00000000开始的)
  3. 如果是扩展分区,就将扩展分区作为一个新的“硬盘”,记录下这个新的“硬盘”起始地址L0,开始进入逻辑分区管理结点,逻辑管理结点第一项描述当前分区的信息,其起始位置相对于当前管理结点的开始,第二项描述下一个管理结点的位置,其位置相对于L0进行计算

另外值得说的是硬盘的分区间隙问题,间隙产生的原因是分区之间不连续照成的,比如上一个结点描述的上一个分区结束位置不是当前结点的开始位置,这样就会产生一个间隙,结点与其管理的分区之间是不存在间隙的,间隙只会产生在分区与分区之间或者上一个分区与下一个结点之间.

总结这两篇文章,我画了一张图来描述MBR的管理:

dptall

 

附上我用C++实现的一个MBR分区分析的示例代码,你可以对代码进行任意修改,如果你觉得我写的不错,只需要点击以下网站上面的广_告,打赏我1分钱就好了

百度网盘地址,由于种种原因,这里不在公开源码地址,如需要源码,请私信我或者发送邮件给我

文中使用的分析工具是我之前写的一个工具,百度网盘地址: http://pan.baidu.com/s/1o6r9UKq 密码: bxbp

执行预览:demo

转载请注明:悠然品鉴 » MBR格式磁盘分区表分析<二>扩展分区、逻辑分区(含源代码)

喜欢 (18)or分享 (0)
发表我的评论
取消评论

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
(1)个小伙伴在吐槽
  1. 请查收
    浅灬笑2018-02-09 10:48 回复