手工(代码)分析硬盘分区表
解读硬盘分区表-xiaosilent‘sBlog-BlogJava

解读硬盘分区表-xiaosilent‘sBlog-BlogJava最近接触到一个0 磁道损坏的硬盘,做数据恢复,有机会学习了一下分区表的结构。
在这里简要的做点笔记。
MBR ( Main Boot Record )位于硬盘第一个物理扇区(绝对扇区)柱面 0 ,磁头 0 ,扇区 1 (简化成( 0 , 0 , 1 ))处。
由于DOS 是由柱面 0 ,磁头 1 ,扇区 1 开始,故 MBR 不属于 DOS 扇区,DOS 不能直接访问。
MBR 中包含硬盘的主引导程序和硬盘分区表。
分区表有4 个分区记录区,这也就是我们为什么只能在硬盘里最多拥有4 个主分区的原因了。
记录区就是记录有关分区信息的一张表。
它从主引导记录( MBR )偏移地址 01BEH 处连续存放,每个分区记录区占 16 个字节。
下面用我的硬盘的分区表来详细解释一下分区表各区段的具体含义。
1be ~ 1cd ( 016 字节)第一个分区入口(参数解释见下)1ce ~ 1dd ( 016 字节)第二个分区入口(同第一个分区)1de ~ 1ed ( 016 字节)第三个分区入口(同第一个分区)1ee ~ 1fd ( 016 字节)第四个分区人口(同第一个分区)1fe ~ 1ff ( 002 字节)引导记录标志位(固定值: 55 aa )要说明的是:这里讲的“分区”,确切说是:主分区。
扩展分区也当成主分区,扩展分区内部的分区信息不在 MBR 里面。
要注意的是,在这里出现的数字均是 16 进制数。
下面就分区记录这 16 个字节再详细解释一下,以我的第一个分区为例:80 分区状态( 80H 表示为激活分区, 00H 表示为非激活分区)01 分区的开始磁头01 00 分区的开始柱面和扇区(这个地方有点玄机,等会再详细解释)07 分区的类型( 0c 表示为 FAT32 , 07 为 NTFS , 0f 代表扩展)fe 分区的结束磁头bf fc 分区的结束柱面和扇区(表示同开始磁头,等会详解)3f 00 00 00 从 MBR 到第一个分区扇区的扇区个数(分区前的扇区数)7e 86 bb 00 分区的总扇区数也就是说我的第一个分区是一个从( 0,1,1 )位置开始的可引导的NTFS 格式的分区。
硬盘主引导扇区、分区表和分区引导扇区(MBR、DPT、DBR、BPB)详解(一)

硬盘主引导扇区、分区表和分区引导扇区(MBR、DPT、DBR、BPB)详解!硬盘的主引导扇区,分区表,分区引导扇区(MBR、DPT、DBR、BPB)是电脑BIOS自检完成后,操作系统开始引导系统前整个电脑运作过程中需要检查的重要参数,硬盘的主引导扇区,分区表,分区引导扇区(MBR、DPT、DBR、BPB)参数错误可能导致系统无法启动或存储的数据丢失,这片文章我们介绍一下硬盘的主引导扇区,分区表,分区引导扇区(MBR、DPT、DBR、BPB)的详细信息。
硬盘的0柱面、0磁头、1扇区称为主引导扇区(也叫主引导记录MBR),该记录占用512个字节,它用于硬盘启动时将系统控制权转给用户指定的、在分区表中登记了某个操作系统分区。
MBR的内容是在硬盘分区时由分区软件(如FDISK)写入该扇区的,MBR不属于任何一个操作系统,不随操作系统的不同而不同,即使不同,MBR也不会夹带操作系统的性质,具有公共引导的特性。
但安装某些多重引导功能的软件或LINUX的LILO 时有可能改写它;它先于所有的操作系统被调入内存并发挥作用,然后才将控制权交给活动主分区内的操作系统(下图)。
MBR由三部分构成:1.主引导程序代码,占446字节2.硬盘分区表DPT,占64字节3.主引导扇区结束标志AA55H一、硬盘的主引导程序代码是从偏移0000H开始到偏移01BDH结束的446字节;主引导程序代码包括一小段执行代码。
启动PC 机时,系统首先对硬件设备进行测试,成功后进入自举程序INT 19H;然后读系统磁盘0柱面、0磁头、1扇区的主引导扇区MBR的内容到内存指定单元0:7C00 首地址开始的区域,并执行MBR程序段。
主引导代码实现下列功能:1.扫描分区表查找活动分区;2.寻找活动分区的起始扇区;3.将活动分区的引导扇区读到内存;4.执行引导扇区的运行代码。
如果主引导代码未完成这些功能,系统显示下列错误信息:Invalid partition tableError loading operating systemMissing operating system二、硬盘分区表DPT是从偏移01BEH开始到偏移01FDH结束的64字节(下图);硬盘分区表分为四小部分,每一小部分表示一个分区的信息,占16字节。
Runtime's_DiskExplorer手工填写分区表

Runtime's DiskExplorer手工填写分区表2007-10-7 10:42经过前面对分区表的和boot扇区的介绍,我们这一章来实战手工填写分区表。
如果一个硬盘第0扇区被清0(就是每个字节都填上00),或者被别的数据破坏(如病毒),导致分区表损坏,那么硬盘在磁盘管理器里看到的磁盘状态是“未初始化”或者“未分区”状态。
如下图:“未初始化”状态0扇区不符合MBR格式“未分区”状态0扇区符合MBR格式但分区表项是空的“未初始化”状态0扇区不符合MBR格式Invalid Partition Table“未分区”状态0扇区符合MBR格式但分区表项是空的Valid Partition Table需要注意的是,非windows、dos分区的硬盘(即Unix、MAC、Novell、磁盘阵列上的硬盘等)挂接到windows平台在磁盘管理器中查看该硬盘状态通常是“未初始化”状态,会提示进行磁盘签名初始化,强烈建议不要初始化,一律取消。
在这里介绍一下windows平台下硬盘初始化操作:当用户点击磁盘管理器查看硬盘状态时,系统会检测每个硬盘0扇区是否符合MBR格式(0扇区前面466字节是否是正确的MBR格式以及后面两个字节是否市55 AA结束,这是FAT和NTFS 分区特有的性质,别的分区类型不一定符合这种格式,Linux分区0扇区跟Windows 分区0扇区是一致的,挂接正常Linux分区的硬盘不会提示初始化)。
如果检测到0扇区不符合Windows MBR格式的硬盘,系统就会弹出对话框,提示用户对该硬盘进行初始化。
硬盘初始化的唯一更改就是把0扇区不符合Windows MBR格式改写成正常的MBR格式,其它地方不做任何更改。
在硬盘初始化之前,Runtime's DiskExplorer 查看0扇区用分区表模式浏览显示“Invalid Partition Table”,说明这个不是一个合法的分区表格式。
手工修复硬盘分区表

手工修复硬盘分区表1.准备好工具diskedit和引导盘。
2.检查CMOS配置是否正确。
检查硬盘设置,在CMOS中记下 CYLINDER,SECTOR和 HEAD参数.此处只考虑有多个逻辑硬盘硬盘的分区情况:如果不知道各个逻辑硬盘的具体情况,用DISKEDIT 中的Find菜单寻找字符串00 00 00 55 AA,并判断是否为EXTEND分区的分区信息,如果找到,即可知道Extend分区的起始位置,并可推算DOS主分区的起始和结束位置,并推算相关的参数,由于备逻辑盘是连续的,由 EXTEND分区信息,可找到各逻辑硬盘的分区信息,并推算出EXTEND分区的结束位置及相关参数,将推算出的相关信息写入主分区表中,即可恢复分区表。
注意:EXTEND分区为05,DOS分区为04或06。
对FAT32则为0B和0C.用DISKEDIT中的OBJECT菜单选择PHYSICAL SECTOR,键入0,0,1,即可进入主引导区。
用VIEW菜单中的AS PARTITION TABLE项可看分区结构。
一般情况下主引导区的起始位置SIDE=1 SECTOR=1 ,EXTEND分区的起始位置SIDE=0 SECTOR=1,而ENDING LOCATION处SIDE和 SECTOR必然是最大值。
可直接在该分区表中修改数据。
光标移至任意处回车,可显示该数据处的分区结构,并可通过F2和F6切换。
后一个分区的STARTING LOCATION必然是前一个分区ENDING LOCATION的下一个扇区。
NUMBER OF SECTORS可通过分区的ENDING LOCATION和STARTING LOCATION计算出,例如,STARTING LOCATION的SIDE=1,CYLINDER=0,SECTOR=1,ENDING LOCATION 的SIDE=7,CYLINDER=262,SECTOR=39则通过以下式子计算:主引导区的RELATIVE SECTORS 是SECTOR的最大值。
磁盘分区表讲解

磁盘分区表是用于描述磁盘分区信息的表。
它通常位于硬盘的特定位置,例如0磁头1扇区,用于标识磁盘的各个分区以及分区类型。
磁盘分区表由一系列分区表项组成,每个表项描述了一个分区的起始磁头号、扇区号、柱面号以及分区文件系统标志等信息。
这些信息帮助操作系统识别和管理磁盘上的各个分区。
在Windows操作系统中,磁盘分区表通常采用MBR(Master Boot Record)格式。
MBR分区表只支持最多四个主分区,或者三个主分区和一个扩展分区。
扩展分区可以包含多个逻辑分区。
逻辑区都位于扩展分区里面,并且逻辑分区的个数没有限制。
磁盘分区表的查找和读取涉及到操作系统和磁盘驱动程序。
在读取磁盘时,磁盘驱动程序会先读取分区表信息,然后根据分区表中的信息来读取和访问各个分区的数据。
总之,磁盘分区表是用于描述和管理磁盘分区的重要工具,它使得操作系统能够有效地管理和访问磁盘上的数据。
通过Debug清除硬盘分区表信息

13AD:0100 mov ax,301 //03->写入
13AD:0103
-g=100 //再次执行代码
-q //退出debug
13AD:0103 mov bx,1000 //读到内存13AD:1000的位置
13AD:0106 mov cx,1 //从第一个扇区开始读取
13AD:0109 mov dx,80 //从硬盘读取
13AD:010C int 13 //执行命令
13AD:010E int 3 //终止命令
xxxx:010EINT 20
xxxx:0110
-G
Hale Waihona Puke 3.程序执行成功后,系统将提示“Program terminated normally”或出现“-”,表明此时硬盘数据已经完全清除。
用debug清除硬盘引导
A:\>debug
-a
13AD:0100 mov ax,201 //02->读取 01->1个扇区
13AD:010E
-g=100 //执行100开始的命令,遇到int 3会自动终止
-d 1000 //查看扇区内容(1000~11FF),一共512字节
-e 11fe 00 00 //从11FE位置开始改变数值(原值:55 AA)
-A CS:100
xxxx:0100MOV AX,301
注:xxxx:0100 为系统提示,不需要输入
xxxx:0103MOV BX,200
xxxx:0106MOV CX,1
xxxx:0109MOV DX,80
注:如需要清除机器内第二硬盘的数据,只需将80改为81即可
硬盘教程之分区表知识详解

硬盘分区表知识——详解硬盘MBR--------------------------------------------------------------------------- 硬盘是现在计算机上最常用的存储器之一。
我们都知道,计算机之所以神奇,是因为它具有高速分析处理数据的能力。
而这些数据都以文件的形式存储在硬盘里。
不过,计算机可不像人那么聪明。
在读取相应的文件时,你必须要给出相应的规则。
这就是分区概念。
分区从实质上说就是对硬盘的一种格式化。
当我们创建分区时,就已经设置好了硬盘的各项物理参数,指定了硬盘主引导记录(即Master Boot Record,一般简称为MBR)和引导记录备份的存放位置。
而对于文件系统以及其他操作系统管理硬盘所需要的信息则是通过以后的高级格式化,即Format命令来实现。
面、磁道和扇区硬盘分区后,将会被划分为面(Side)、磁道(Track)和扇区(Sector)。
需要注意的是,这些只是个虚拟的概念,并不是真正在硬盘上划轨道。
先从面说起,硬盘一般是由一片或几片圆形薄膜叠加而成。
我们所说,每个圆形薄膜都有两个“面”,这两个面都是用来存储数据的。
按照面的多少,依次称为0面、1面、2面……由于每个面都专有一个读写磁头,也常用0头(head)、1头……称之。
按照硬盘容量和规格的不同,硬盘面数(或头数)也不一定相同,少的只有2面,多的可达数十面。
各面上磁道号相同的磁道合起来,称为一个柱面(Cylinder)。
上面我们提到了磁道的概念。
那么究竟何为磁道呢?由于磁盘是旋转的,则连续写入的数据是排列在一个圆周上的。
我们称这样的圆周为一个磁道。
如果读写磁头沿着圆形薄膜的半径方向移动一段距离,以后写入的数据又排列在另外一个磁道上。
根据硬盘规格的不同,磁道数可以从几百到数千不等;一个磁道上可以容纳数KB的数据,而主机读写时往往并不需要一次读写那么多,于是,磁道又被划分成若干段,每段称为一个扇区。
手工分析分区表

所以12011620既表示大小,也表示下一虚拟MBR位置
到10216620扇区,找到对应的虚拟MBR
=800)window.open('../images/58_4_671292e44aa1e22.jpg');"onload="if(this.width>'800')this.width='800';if(this.height>'800')this.height='800';">
吻合模板
分区表项二:
=800)window.open('../images/58_4_c1225980184613c.jpg');"onload="if(this.width>'800')this.width='800';if(this.height>'800')this.height='800';">
11111110/111111/1011101011
254/63/747
结束柱面:747
结束磁头:254
结束扇区:63
分区前隐含扇区:
0000003F
63
0磁道到1磁道的63个扇区,为了保护分区表,减少磨损,零磁道只用了0扇区,1到62共62个扇区不用。
分区大小:
00B75BAD
12016557
12016557*512/(1024*1024*1024)=5.73G小于8.4G
=800)window.open('../images/58_4_5290c1492c5c8e5.jpg');"onload="if(this.width>'800')this.width='800';if(this.height>'800')this.height='800';">
手工恢复硬盘分区表记述

手工恢复硬盘分区表记述(zt)想必大家都有过数据丢失的糟糕经历,费尽心力收集的数据,由于病毒破坏、误删除、误格式化、分区软件误操作、存储设备损坏等原因而毁之一旦,真是令人痛心。
其实我们只要静下心来学习一点数据恢复方面的浅近知识,遇上这样的倒霉事,只要不是严重的硬件损坏,就能挽回一部分数据,运气不错的话,找回全部数据也是可能的。
讨论数据恢复,我们先来看看最简单的情况:单纯的硬盘分区表损毁(非硬件损坏),现象——分区丢失。
要重建硬盘分区表,就得搞清楚硬盘分区是如何组织的,下面先介绍相关的背景知识。
一、磁盘寻址方式:CHS和LBA1.CHS寻址方式CHS是Cylinder(柱面)/Head(磁头)/Sector(扇区)的缩写。
为什么会有这些参数,这要从早期的磁盘结构说起。
很久以前,硬盘的容量还非常小的时候,为了扩大磁盘容量,人们把几个盘片叠加在一起,每个盘面由一个磁头访问,盘面又划分为许多同心圆环,这就是磁道,每条磁道又划分为许多区段,每个区段就称为一个扇区。
由此产生了所谓的3D参数(Disk Geometry),即磁头数(Heads)、柱面数(Cylinders,所谓柱面是由半径相同分属不同盘面的若干磁道组成)、扇区数(Sectors),以及相应的寻址方式。
见附图:图片附件: 1.jpg (2006-12-13 20:16, 54.09 K)其中:磁头数(Heads) 表示硬盘总共有几个磁头,也就是有几面盘片,最大为255 (用8 个二进制位存储);柱面数(Cylinders) 表示硬盘每一面盘片上有几条磁道,最大为1024(用10 个二进制位存储);扇区数(Sectors) 表示每一条磁道上有几个扇区,最大为63 (用6个二进制位存储)。
每个扇区一般是512个字节,理论上讲这不是必须的,但好象没有取别的值的。
所以磁盘最大容量为:255 * 1024 * 63 * 512 / 1024 / 1024 = 8032.5 MB。
用WinHex手工恢复硬盘分区表

用WinHex手工恢复硬盘分区表最近,PC机不能正常引导,将硬盘挂载到其它PC机上,显示硬盘未分区,结果如下图所示:原硬盘分为4个分区,但现在显示未分区,推测是硬盘的分区表丢失,计划用WinHex工具手工恢复硬盘分区表,通过用WinHex查看分区表,果真丢失了分区表,于是利用该工具进行了恢复,成功修复硬盘。
恢复期间,参考了网上的众多资料,这些资料虽然提供了很多帮助,但感觉理论性太强,没有充分利用工具本身的优势,因此作一总结,以为新手提供帮助。
为了更好的理解恢复方案,在文中增加了小知识点,如果对理论不感兴趣,可略过这些小知识点,直接参考恢复步骤即可。
在此也一并感谢在网上分享资料的各位大侠。
一、查看MBR(Master Boot Record)利用WINHEX打开硬盘的MBR,如下图所示:从图中可见,1、第1扇区的55AA前的64个字节全为0,表明分区表信息丢失。
2、在最上边的栏中的可以看到分区信息,包括分区名称、类型、大小、该分区的首扇区等信息,这些将帮助我们迅速地恢复硬盘分区。
小知识1:MBR(Master Boot Recorder)、DPT(Disk Partition Table)MBR位于磁盘的第一个扇区,CHS地址是0柱面,0磁头,1扇区,共占用63DPT中定义的分区包括主分区和扩展分区,主分区+扩展分区总共不能超过4个。
所谓主分区是指DPT中包含能够被系统的磁盘分区,一个硬盘主分区至少有1个,最多4个,它是可以设置为活动的,即可以引导操作系统。
一个硬盘只能有一个活动分区。
扩展分区并不能被系统直接使用,它的作用是突破DPT中只能定义四个分区限制的,可以没有,最多1个。
对于windows系统,一般分为一个主分区,一个扩展分区。
(本文介绍的方法也是针对这种情况,对硬盘分区表进行恢复)。
其做法:定义完主分区之后,将多余的容量定义为扩展分区,指定该分区的起始位置,根据起始位置指向硬盘的某一扇区,称作扩展MBR(EBR),在其中定义下一个分区表。
实验2 手工恢复硬盘分区表

手工恢复硬盘分区表实验步骤:1、模仿分区表被病毒破坏的情况,将MBR全部填零。
首先将MBR所在的扇区选中。
鼠标指向第一个字节,单击右键,选择“选块开始” ,然后鼠标指向MBR的最后一个字节,单击右键,选择“选块结尾”;在选区内部单击鼠标右键,选择“编辑”,这样就有出来一个菜单,选“填充选块”,这样就出来一个填充选块对话框,在“用十六进制填充”的输入框中输入“00”,再点“确定”,这样MBR所在扇区全部被我们填充为“00”。
如果想取消选区,那就用鼠标拖动随便选中一块区域,那么原来的选区就会取消。
注意,如果扇区数据被修改了而没有存盘就会变为别的颜色。
2、修改了扇区,这时候还没有存盘生效,如果你想存盘生效的话,就选择“文件”菜单“保存扇区”命令。
存盘后,扇区被修改的数据又变为黑色。
3、这样分区表给删除了,但必须重新启动才能生效,如果打开我的电脑,会发现三个分区(F 、G、H)还在那里,并且里面的数据还能正常使用。
关闭所有程序将电脑重新启动……4、再打开Winhex发现MBR全部为零了,下面我们就着手开始手工恢复分区表。
5、首先恢复引导代码,用Winhex到别的系统盘把引导代码复制过来。
现在的机器上应该挂着两个硬盘。
从系统盘上复制引导代码到实验盘。
单击“磁盘编辑器”按钮,出现“编辑磁盘”对话框,选择“HD0”,点“确定”。
这样我们就把系统盘的分区表给打开了,注意,现在我们是打开了两个窗口,当前的窗口是“硬盘0”,在标题栏上有显示。
另外,打开窗口菜单也能看出来,当前窗口被打上一个勾,如果想切换回原来的窗口,就点击“硬盘1”。
首先选中系统盘的引导代码,然后在选区中单击鼠标右键,选“编辑”。
又出来一个菜单,然后我们选“复制选块”——“正常”,然后切换回硬盘1窗口,在零扇区的第一个字节处单击鼠标右键,选“编辑”,然后选“剪贴板数据”——“写入……”,出现一个窗口提示,点“确定”。
这样,我们就把一个正常系统盘上的引导代码复制过来了。
用WinHex手工恢复硬盘分区表

用WinHex手工恢复硬盘分区表最近,PC机不能正常引导,将硬盘挂载到其它PC机上,显示硬盘未分区,结果如下图所示:原硬盘分为4个分区,但现在显示未分区,推测是硬盘的分区表丢失,计划用WinHex工具手工恢复硬盘分区表,通过用WinHex查看分区表,果真丢失了分区表,于是利用该工具进行了恢复,成功修复硬盘。
恢复期间,参考了网上的众多资料,这些资料虽然提供了很多帮助,但感觉理论性太强,没有充分利用工具本身的优势,因此作一总结,以为新手提供帮助。
为了更好的理解恢复方案,在文中增加了小知识点,如果对理论不感兴趣,可略过这些小知识点,直接参考恢复步骤即可。
在此也一并感谢在网上分享资料的各位大侠。
一、查看MBR(Master Boot Record)利用WINHEX打开硬盘的MBR,如下图所示:从图中可见,1、第1扇区的55AA前的64个字节全为0,表明分区表信息丢失。
2、在最上边的栏中的可以看到分区信息,包括分区名称、类型、大小、该分区的首扇区等信息,这些将帮助我们迅速地恢复硬盘分区。
小知识1:MBR(Master Boot Recorder)、DPT(Disk Partition Table)MBR位于磁盘的第一个扇区,CHS地址是0柱面,0磁头,1扇区,共占用63个扇区,实际上只使用1扇区;其布局如下:DPT中定义的分区包括主分区和扩展分区,主分区+扩展分区总共不能超过4个。
所谓主分区是指DPT中包含能够被系统的磁盘分区,一个硬盘主分区至少有1个,最多4个,它是可以设置为活动的,即可以引导操作系统。
一个硬盘只能有一个活动分区。
扩展分区并不能被系统直接使用,它的作用是突破DPT中只能定义四个分区限制的,可以没有,最多1个。
对于windows系统,一般分为一个主分区,一个扩展分区。
(本文介绍的方法也是针对这种情况,对硬盘分区表进行恢复)。
其做法:定义完主分区之后,将多余的容量定义为扩展分区,指定该分区的起始位置,根据起始位置指向硬盘的某一扇区,称作扩展MBR(EBR),在其中定义下一个分区表。
手工编辑分区表数据恢复方法及应用

地 址
内容 含 义
O0 H一0 B H O0 1D
主引导记录(4 4 6字节 )
辑分区表 的方 法来 进行 数据恢 复 , 这种 方法恢 复效 果 较
好, 且操作简单。本文从 分 区表的结构人 手 , 分析 手工 编
0 B H一 1 D 1E 0C H 0 C H一 1 D 1E 0 D H 0 D H一 1 D 1E 0E H
.
过程做一介绍 : ( 引导程序 的恢 复 : 一) 可使 用 F IK MB D S / R命令重 写
引导 程 序 。
( ) - 分区表( P ) D T 的恢 复 : 首先将故障硬 盘挂在另一 台正 常的计算机上 , 使用工具软件( wn e) 如 ihx 打开故障硬 盘分 区表 。分 区表各项填人 内容如下 ( 各项填人 内容均 为
手 工 编 辑 分 区 表数 据 恢 复方 法 及 应 用
蒋 永辉
( 海南 师范 大学 计 算机科 学 与教育 技术 系 , 南 海 1 5 15 ) 海 ; 7 8 1 1
摘
要: 硬盘分区表容易受 到病毒或误操作等影 响 而导 致数据 丢失 , 章介绍 了分 区表基本 结构 , 文 分析
硬盘主引导分区信 息 , 占用地址为 0 B H到 0 F H。 其 1E 1 D 共 6 4个字节 , P D T分为 四个 分区项 , 每项 1 节, 6字 分别 记录 了每个主分区 的信 息。这也就是 为什么一个 磁盘 的主分
区只 能有 四个 的原 因 。
存储字节位
ห้องสมุดไป่ตู้
内容及含义
第 1 节 引导标志。若值为 8 H表示 活动分区 , 字 0 若 值为 0 H表示非活动分 区。 0
硬盘主引导扇区、分区表和分区引导扇区(MBR、DPT、DBR、BPB)详解(一)

硬盘主引导扇区、分区表和分区引导扇区(MBR、DPT、DBR、BPB)详解!硬盘的主引导扇区,分区表,分区引导扇区(MBR、DPT、DBR、BPB)是电脑BIOS自检完成后,操作系统开始引导系统前整个电脑运作过程中需要检查的重要参数,硬盘的主引导扇区,分区表,分区引导扇区(MBR、DPT、DBR、BPB)参数错误可能导致系统无法启动或存储的数据丢失,这片文章我们介绍一下硬盘的主引导扇区,分区表,分区引导扇区(MBR、DPT、DBR、BPB)的详细信息。
硬盘的0柱面、0磁头、1扇区称为主引导扇区(也叫主引导记录MBR),该记录占用512个字节,它用于硬盘启动时将系统控制权转给用户指定的、在分区表中登记了某个操作系统分区。
MBR的内容是在硬盘分区时由分区软件(如FDISK)写入该扇区的,MBR不属于任何一个操作系统,不随操作系统的不同而不同,即使不同,MBR也不会夹带操作系统的性质,具有公共引导的特性。
但安装某些多重引导功能的软件或LINUX的LILO 时有可能改写它;它先于所有的操作系统被调入内存并发挥作用,然后才将控制权交给活动主分区内的操作系统(下图)。
MBR由三部分构成:1.主引导程序代码,占446字节2.硬盘分区表DPT,占64字节3.主引导扇区结束标志AA55H一、硬盘的主引导程序代码是从偏移0000H开始到偏移01BDH结束的446字节;主引导程序代码包括一小段执行代码。
启动PC 机时,系统首先对硬件设备进行测试,成功后进入自举程序INT 19H;然后读系统磁盘0柱面、0磁头、1扇区的主引导扇区MBR的内容到内存指定单元0:7C00 首地址开始的区域,并执行MBR程序段。
主引导代码实现下列功能:1.扫描分区表查找活动分区;2.寻找活动分区的起始扇区;3.将活动分区的引导扇区读到内存;4.执行引导扇区的运行代码。
如果主引导代码未完成这些功能,系统显示下列错误信息:Invalid partition tableError loading operating systemMissing operating system二、硬盘分区表DPT是从偏移01BEH开始到偏移01FDH结束的64字节(下图);硬盘分区表分为四小部分,每一小部分表示一个分区的信息,占16字节。
硬盘分区表恢复VC代码

//在 MBR 里的后 64 个字节里是磁盘的分区表结构,可定义 4 个分区,每个分区 16 bytes,从 0x1be ~ 0x1fe 共 64 bytes。
//最后两位是结束标志位,55AAint bootindicator=MBR[0x1BE];//分区的启动标志,80H可启动分区,00H 不可启动分区//分区的起始扇区int heads=MBR[0x1BF];//起始 headsint sector=MBR[0x1C0]&0x3F;//低 6 bits 表示起始 sector,这里只用该节字的低 6 bits 来表示sectorint cylinder=MBR[0x1C1]|(MBR[0x1C0]&0xC0)<<2;//1C0 的高 2 btis 加上 1C1 的 8 bits 组成 10 bits 表示起始 cylinderint filesys=MBR[0x1C2];//文件系统, 如:07 表示 ntfs 系统//分区的结束扇区int heads_end=MBR[0x1C3];//起始 headsint sector_end=MBR[0x1C4]&0x3F;//低 6 bits 表示起始 sector,这里只用该节字的低 6 bits 来表示sectorint cylinder_end=(MBR[0x1C4]&0xC0)<<2|MBR[0x1C5];//1C0 的高 2 btis 加上 1C1 的 8 bits 组成 10 bits 表示起始 cylinder//cylinder 最大只能表示 1023 个,超过部分没办法表示,这里就以分区扇数为准intcount_before=MBR[0x1C9]<<24|MBR[0x1C8]<<16|MBR[0x1C7]<<8|MBR[0x1C6]; //这 4 bytes 表示此分区前有多少扇区(实际上等于此分区的起始扇区号),以 little-endian 排列的。
硬盘分区表

硬盘分区表硬盘分区表百科名片人们在使用电脑时,有时由于异常操作,有时由于病毒侵袭,会导致某个分区消失或硬盘无法启动。
究其原因,就是硬盘分区表受损。
硬盘分区表可以说是支持硬盘正常工作的骨架.操作系统正是通过它把硬盘划分为若干个分区,然后再在每个分区里面创建文件系统,写入数据文件.本文主要讲述的是分区表的位置,结构以及各个分区表是如何链接起来的.当掌握了这些知识后,即使分区表受到破坏,一样也可以根据残存的数据手工修复分区表,从而修复分区。
目录一.分区表的位置及识别标志二.分区表的结构分区表项含义三.分区表链的查找二.查找D盘分区表三.查找E盘分区表四.结束语分区表为何会出故障一.分区表的位置及识别标志二.分区表的结构分区表项含义三.分区表链的查找二.查找D盘分区表三.查找E盘分区表四.结束语分区表为何会出故障•分区表故障怎么修复•如何防范分区表故障•其他相关知识展开编辑本段一.分区表的位置及识别标志分区表一般位于硬盘某柱面的0磁头1扇区。
而第1个分区表(也即主分区表)总是位于(0柱面,0磁头,1扇区),剩余的分区表位置可以由主分区表依次推导出来。
分区表有64个字节,占据其所在扇区的[447-510]字节。
要判定是不是分区表,就看其后紧邻的两个字节(也即[511-512])是不是 "55AA",若是,则为分区表。
编辑本段二.分区表的结构分区表由4项组成,每项16个字节.共4×16 = 64个字节。
每项描述一个分区的基本信息。
每个字节的含义如下:编辑本段分区表项含义字节含义0 Activeflag.活动标志.若为0x80H,则表示该分区为活动分区.若为0x00H,则表示该分区为非活动分区.1,2,3 该分区的起始磁头号,扇区号,柱面号磁头号 -- 1字节, 扇区号-- 2字节低6位,柱面号 -- 2字节高2位 + 3字节4 分区文件系统标志:分区未用: 0x00H.扩展分区: 0x05H, 0x0FH.FAT16分区: 0x06H.FAT32分区: 0x0BH, 0x1BH, 0x0CH, 0x1CH.NTFS分区: 0x07H.5,6,7 该分区的结束磁头号,扇区号,柱面号,含义同上.8,9,10,11 逻辑起始扇区号。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
三、关于分区数大于4
很多情况下,我们的分区数目不止于四个,但MBR中最多只能容纳四个,为此MS引入了虚拟MBR的概念,所谓虚拟MBR就是在硬盘分区表的后面还有很多和主引导扇区一样的扇区(具体个数取决于你硬盘分区的数量),此虚拟MBR占位512个字节,只不过它的引导程序没有任何意义,一般为全0填充,它的分区表信息也只有2项(各个字节含义同主引导扇区),第一个部分描述本分区信息,第二个部分描述的是下一个分区的信息。如果下一个分区的信息为全0 则表示分区结束。通常情况下,主引导扇区的4个分区也不是全都使用的,第一个为引导区(通常的C盘),第2个为扩展分区,顺着这个链就可以一直找出所有的分区。
invoke StdOut,offset _10
invoke CreateFile,addr diskname,GENERIC_READ or GENERIC_WRITE ,\
FILE_SHARE_READ or FILE_SHARE_WRITE ,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0
diskname db '\\.\PHYSICALDRIVE0',0
ctitle db '分区号 分区首地址(扇区) 分区容量(MB)',0
cline db '=======================================',0
cspace db ' ',0
invoke StdOut,offset _10
jmp localsector ;转到扫描扩展分区链的处理程序段
.endif
inc ebx
.endw
localsector: ;扩展分区链处理
.repeat
mov esi,offset iobuffer
finit
;的值的指针
invoke ReadFile,hdisk,addr iobuffer,512,addr dwbytesread,0
mov eax,[esi+454]
;这里取VMBR地址链的首地址(虚拟MBR的基地址,这2种叫法都是我自己叫的
;别人不知道正是的中文翻译是什么)
mov vmbrsec,eax ;保存VMBR首地址,因为下面要计算和输出这个地址
xor edx,edx
include masm32.inc
includelib masm32.lib
includelib gdi32.lib
IncludeLib user32.lib
IncludeLib kernel32.lib
includelib fpu.lib
include macro.asm
.data
add eax,63 ;
add eax,vmbrsec ;VMBR表首地址+63后是分区的首地址
invoke wsprintf,addr fqaddr,CTEXT('%8X'),eax
invoke wsprintf,addr fqhbuf,CTEXT('%4d'),fqh
invoke SetFilePointer,hdisk,DWORD ptr vmbr,addr DWORD ptr vmbr+4,FILE_BEGIN ;设置文件指针,因为涉及到64位,请注意
;该函数的第3个参数,一定是64位中高32位
二、硬盘数据存储区域
对于FAT文件系统(NTFS及其他文件系统不在本文讨论的范围内)硬盘上数据大致可以分为MBR DBR FAT DIR DATA五个区域,本文只讨论MBR区。MBR区又称为主引导记录区,位于整个硬盘的0磁道 0柱面 1扇区,一共512个字节,其实MBR一共占用63个扇区,不过通常只使用第一个扇区而已。其中,前446个字节为引导程序,随后的64个字节为硬盘分区表,每个分区表描述信息占位16个字节,一共可以描述4个分区,最后2个字节为55H AAH 是分区有效结束标志。关于引导程序我们PASS略过,主要介绍随后的分区表信息,它们每16个字节的各个字节表述含义都是一样的。
shld edx,eax,9
shl eax,9
;对VMBR地址进行*512的计算,因为结果大于32位,
;所以以下代码段引进了64位的计算
mov DWORD ptr vmbr,eax
mov DWORD ptr vmbr+4,edx
vmbrbuf db 128 dup (?)
hdisk Leabharlann dd ? dwbytesread dd ?
nextp dd ?
vmbrsec dd ?
vmbr dq ?
vmbr2 dq ?
fqh dd ?
.const
_2048 dd 2048
.CODE
START:
mov fqh,1
invoke StdOut,offset ctitle
invoke StdOut,offset _13
invoke StdOut,offset _10
invoke StdOut,offset cline
invoke StdOut,offset _13
invoke wsprintf,addr fqhbuf,CTEXT('%4d'),fqh
invoke StdOut,offset fqhbuf
invoke StdOut,offset fqaddr
invoke StdOut,offset cspace
四、关于硬盘逻辑锁
由于系统启动时,是需要扫描这个分区链的,正常这个分区链是开链,也就是有开始有结束(全0结束)。但是如果认为的将这个分区链变成一个闭合的链,那势必将引导程序陷入一个死循环,引导程序如果不能找到全0的分区结束标志,那么它就会一直再这个链上跑,并不会启动系统,这就是所谓的硬盘逻辑锁的产生原因。(需要注意的是,这个动作和操作系统有关系。比如老的DOS系统中有这个扫描动作,因此可以根据这个原理制作“硬盘锁”。)
mov hdisk,eax
invoke SetFilePointer,hdisk,0,NULL,FILE_BEGIN
invoke ReadFile,hdisk,addr iobuffer,512,addr dwbytesread,0
;读取MBR区(0扇区)
mov esi,offset iobuffer
_13 db 13,0
_10 db 10,0
.data?
iobuffer db 512 dup(?)
strbuffer db 512 dup(?)
fqhbuf db 128 dup (?)
fqaddr db 128 dup (?)
;0扇区所有的数据都在iobuffer里,我们主要操作缓冲区
xor ebx,ebx
.while ebx<4
;MBR区只能有4个主引导区,所以我们循环4次就可以了
.if ebx>0
add esi,16 ;每个主分区信息占16个字节,这里对下面—>
invoke StdOut,offset fqhbuf
invoke StdOut,offset fqaddr
invoke StdOut,offset cspace
invoke StdOut,offset strbuffer
invoke StdOut,offset _13
fild DWORD ptr[esi+458] ;取分区容量,单位扇区
fild _2048
fdiv
invoke FpuFLtoA,0,2,addr strbuffer,SRC1_FPU OR SRC2_DIMM OR STR_REG
mov eax,DWORD ptr [esi+470] ;
finit
fild DWORD ptr[esi+458]
fild _2048
fdiv ;除以2048后,转换为MB单位
invoke FpuFLtoA,0,2,addr strbuffer,SRC1_FPU OR SRC2_DIMM OR STR_REG ;调用浮点函数库转换浮点到字符
;需要引用库includelib fpu.lib include fpu.inc
invoke wsprintf,addr fqaddr,CTEXT('%8X'),DWORD PTR [ESI+454]
;#Mode=CON
.586
.Model Flat, StdCall
Option Casemap :None
Include windows.inc
Include user32.inc
Include kernel32.inc
include fpu.inc
include gdi32.inc
.endif ;|——————————————————>
mov eax,[esi+450] ;—>[ESI+450]能否正确寻址,至关重要
.if al==11 || al==12 || al==07 ;11也就是0BH ,0cH表示FAT32 07表示NTFS分区
好了,讲到这里,我们借助于WINHEX,随便打开一个物理硬盘(参考2),我们顺着这个分区链就可以找出全部的分区了,并能了解该分区的一些基本信息,比如起始扇区,分区类型,分区大小等等,下面我们使用ASM代码来描述一下如何扫描这个链表。为了保持程序的完整性和可读性,不再有讲解性内容,而是以注释的形式进行讲解。