admin管理员组

文章数量:1530842


2024年6月11日发(作者:)

硬盘数据恢复教程

前言:

硬盘数据恢复很大程度依靠运气,无必胜把握,并且不与投入时间成正比,不要寄予太

大的希望。

请勿轻易拿自己硬盘做实验。

建议数据恢复前先用硬盘保护卡对拷到其他硬盘上做一个备份,然后修理备份。(用

ghost不行)

●硬盘数据恢复,一概论

初买来一块硬盘,我们是没有办法使用的,你需要将它分区、格式化,然后再安装上操

作系统才可以使用。一个完整硬盘的数据应该包括五部分:MBR,DBR,FAT,DIR区和

DATA区。其中只有主引导扇区是唯一的,其它的随你的分区数的增加而增加。

主引导扇区

主引导扇区位于整个硬盘的0磁道0柱面1扇区,包括硬盘主引导记录MBR(Main Boot

Record)和分区表DPT(Disk Partition Table)。其中主引导记录的作用就是检查分区表是否

正确以及确定哪个分区为引导分区,并在程序结束时把该分区的启动程序(也就是操作系统

引导扇区)调入内存加以执行。至于分区表,很多人都知道,以80H或00H为开始标志,

以55AAH为结束标志,共64字节,位于本扇区的最末端。值得一提的是,MBR是由分区

程序(例如DOS 的)产生的,不同的操作系统可能这个扇区是不尽相同。如果你

有这个意向也可以自己去编写一个,只要它能完成前述的任务即可,这也是为什么能实现多

系统启动的原因(说句题外话:正因为这个主引导记录容易编写,所以才出现了很多的引导

区病毒)。

操作系统引导扇区

OBR(OS Boot Record)即操作系统引导扇区,通常位于硬盘的0磁道1柱面1扇区

(这是对于DOS来说的,对于那些以多重引导方式启动的系统则位于相应的主分区/扩展分

区的第一个扇区),是操作系统可直接访问的第一个扇区,它也包括一个引导程序和一个被

称为BPB(BIOS Parameter Block)的本分区参数记录表。其实每个逻辑分区都有一个OBR,

其参数视分区的大小、操作系统的类别而有所不同。引导程序的主要任务是判断本分区根目

录前两个文件是否为操作系统的引导文件(例如MSDOS或者起源于MSDOS的Win9x/Me

的和)。如是,就把第一个文件读入内存,并把控制权交予该文件。

BPB参数块记录着本分区的起始扇区、结束扇区、文件存储格式、硬盘介质描述符、根目

录大小、FAT个数、分配单元(Allocation Unit,以前也称之为簇)的大小等重要参数。OBR

由高级格式化程序产生(例如DOS 的)。

文件分配表

FAT(File Allocation Table)即文件分配表,是DOS/Win9x系统的文件寻址系统,为了数

据安全起见,FAT一般做两个,第二FAT为第一FAT的备份, FAT区紧接在OBR之后,其

大小由本分区的大小及文件分配单元的大小决定。关于FAT的格式历来有很多选择,

Microsoft 的DOS及Windows采用我们所熟悉的FAT12、FAT16和FAT32格式,但除此以

外并非没有其它格式的FAT,像Windows NT、OS/2、UNIX/Linux、Novell等都有自己的文

1

件管理方式。

目录区

DIR是Directory即根目录区的简写,DIR紧接在第二FAT表之后,只有FAT还不能定位

文件在磁盘中的位置,FAT还必须和DIR配合才能准确定位文件的位置。DIR记录着每个

文件(目录)的起始单元(这是最重要的)、文件的属性等。定位文件位置时,操作系统根

据DIR中的起始单元,结合FAT表就可以知道文件在磁盘的具体位置及大小了。在DIR区

之后,才是真正意义上的数据存储区,即DATA区。

数据区

DATA虽然占据了硬盘的绝大部分空间,但没有了前面的各部分,它对于我们来说,也

只能是一些枯燥的二进制代码,没有任何意义。在这里有一点要说明的是,我们通常所说的

格式化程序(指高级格式化,例如DOS下的Format程序),并没有把DATA区的数据清除,

只是重写了FAT表而已,至于分区硬盘,也只是修改了MBR和OBR,绝大部分的DATA

区的数据并没有被改变,这也是许多硬盘数据能够得以修复的原因。但即便如此,如

MBR/OBR/FAT/DIR之一被破坏的话,也足够咱们那些所谓的DIY老鸟们忙乎半天了……

需要提醒大家的是,如果你经常整理磁盘,那么你的数据区的数据可能是连续的,这样即使

MBR/FAT/DIR全部坏了,我们也可以使用磁盘编辑软件(比如DOS下的DiskEdit),只要

找到一个文件的起始保存位置,那么这个文件就有可能被恢复(当然了,这需要一个前提,

那就是你没有覆盖这个文件……)。

硬盘分区方式

我们平时说到的分区概念,不外乎三种:主分区、扩展分区和逻辑分区。

主分区是一个比较单纯的分区,通常位于硬盘的最前面一块区域中,构成逻辑C磁盘。

在主分区中,不允许再建立其它逻辑磁盘。

扩展分区的概念则比较复杂,也是造成分区和逻辑磁盘混淆的主要原因。由于硬盘仅仅

为分区表保留了64个字节的存储空间,而每个分区的参数占据16个字节,故主引导扇区中

总计可以存储4个分区的数据。操作系统只允许存储4个分区的数据,如果说逻辑磁盘就是

分区,则系统最多只允许4个逻辑磁盘。对于具体的应用,4个逻辑磁盘往往不能满足实际

需求。为了建立更多的逻辑磁盘供操作系统使用,系统引入了扩展分区的概念。

所谓扩展分区,严格地讲它不是一个实际意义的分区,它仅仅是一个指向下一个分区的

指针,这种指针结构将形成一个单向链表。这样在主引导扇区中除了主分区外,仅需要存储

一个被称为扩展分区的分区数据,通过这个扩展分区的数据可以找到下一个分区(实际上也

就是下一个逻辑磁盘)的起始位置,以此起始位置类推可以找到所有的分区。无论系统中建

立多少个逻辑磁盘,在主引导扇区中通过一个扩展分区的参数就可以逐个找到每一个逻辑磁

盘。

需要特别注意的是,由于主分区之后的各个分区是通过一种单向链表的结构来实现链接

的,因此,若单向链表发生问题,将导致逻辑磁盘的丢失。

数据存储原理

既然要进行数据的恢复,当然数据的存储原理我们不能不提,在这之中,我们还要介绍

一下数据的删除和硬盘的格式化相关问题……

文件的读取

操作系统从目录区中读取文件信息(包括文件名、后缀名、文件大小、修改日期和文件

在数据区保存的第一个簇的簇号),我们这里假设第一个簇号是0023。

操作系统从0023簇读取相应的数据,然后再找到FAT的0023单元,如果内容是文件

结束标志(FF),则表示文件结束,否则内容保存数据的下一个簇的簇号,这样重复下去直

到遇到文件结束标志。

2

文件的写入

当我们要保存文件时,操作系统首先在DIR区中找到空区写入文件名、大小和创建时

间等相应信息,然后在Data区找到闲置空间将文件保存,并将Data区的第一个簇写入DIR

区,其余的动作和上边的读取动作差不多。

文件的删除

Win9x的文件删除工作却是很简单的,简单到只在目录区做了一点小改动——将目录区

的文件的第一个字符改成了E5就表示将改文件删除了。

附录:

--------------------------------------------------------------------------------

Fdisk和Format的一点小说明

和文件的删除类似,利用Fdisk删除再建立分区和利用Format格式化逻辑磁盘(假设

你格式化的时候并没有使用/U这个无条件格式化参数)都没有将数据从DATA区直接删除,

前者只是改变了分区表,后者只是修改了FAT表,因此被误删除的分区和误格式化的硬盘

完全有可能恢复……

系统启动流程

各种不同的操作系统启动流程不尽相同,我们这里以Win9x/DOS的启动流程为例。

第一阶段:系统加电自检POST过程。POST是Power On Self Test的缩写,也就是加电

自检的意思,微机执行内存FFFF0H处的程序(这里是一段固化的ROM程序),对系统的

硬件(包括内存)进行检查。

第二阶段:读取分区记录和引导记录。当微机检查到硬件正常并与CMOS设置相符后,

按照CMOS设置从相应设备启动(我们这里假设从硬盘启动),读取硬盘的分区记录(DPT)

和主引导记录(MBR)。

第三阶段:读取DOS引导记录。微机正确读取分区记录和主引导记录后,如果主引导记

录和分区表校验正确,则执行主引导记录并进一步读取DOS引导记录(位于每一个主分区

的第一个扇区),然后执行该DOS引导记录。

第四阶段:装载系统隐含文件。将DOS系统的隐含文件入内存,加载基本的文

件系统FAT,这时候一般会出现Starting 的标志,将读入内存,

并处理和文件,加载磁盘压缩程序。

第五阶段:实DOS模式配置。系统隐含文件装载完成,微机将执行系统隐含文件,并执

行系统配置文件(),加载中定义的各种驱动程序。

第六阶段:调入命令解释程序()。系统装载命令管理程序,以便对系统的各种

操作命令进行协调管理(我们所使用的Dir、Copy等内部命令就是由提供的)。

第七阶段:执行批处理文件()。微机将一步一步地执行批处理文件中的各条

命令。

第八阶段:加载。负责将Windows下的各种驱动程序和启动执行文件

加以执行,至此启动完毕。

3

●硬盘数据恢复,二分区表的推算

Master Boot Record

The Master Boot Record is located at the physical beginning of a hard disk, editable using the

Disk Editor. It consists of a master bootstrap loader code (446 bytes) and four subsequent,

identically structured partition records. Finally, the hexadecimal signature 55AA completes a valid

Master Boot Record.

硬盘的主引导记录在硬盘的0磁头0柱面1扇区。

主引导记录由三部分组成:

(1)主引导程序;

(2)四个分区表;

(3)主引导记录有效标志字。

详见表1。

[表1主引导记录结构]

位 置

0000H -00D9H

00DAH -01BDH

01BEH -01CDH

01CEH -01DDH

01DEH -01EDH

01EEH -01FDH

01FEH -01FFH

内 容

主引导记录代码区

空闲区

分区1结构信息

分区2结构信息

分区3结构信息

分区4结构信息

55 AAH 主 引 导 记 录 有 效 标 志

说明:

A,分区表自偏移1BEH处开始,分区表共64个字节,表中可填入四个分区信息,每十六

个字节为一个分区说明项,这16个字节含义详见表2。

B,必须注意:扇区号的高二位占用柱面号所在字节的最高二位,即柱面号为10位,扇区

号6位。

The format of a partition record is as follows:

Offset Size Description

0 8 bit A value of 80 designates an active partition.

1 8 bit Partition start head

2 8 bit Partition start sector (bits 0-5)

3 8 bit Partition start track (bits 8,9 in bits 6,7 of sector)

4 8 bit Operating system indicator

5 8 bit Partition end head

4

6 8 bit Partition end sector (bits 0-5)

7 8 bit Partition end track (bits 8,9 in bits 6,7 of sector)

8 32 bit Sectors preceding partition

C 32 bit Length of partition in sectors

Operating system indicators: (hexadecimal, incomplete list)

00 Empty partition-table entry

01 DOS FAT12

04 DOS FAT16 (up to 32 MB)

05 DOS 3.3+ extended partition

06 DOS 3.31+ FAT16 (over 32 MB)

07 OS/2 HPFS, Windows NT NTFS, Advanced Unix

08 OS/2 v1.0-1.3, AIX bootable partition, SplitDrive

09 AIX data partition

0A OS/2 Boot Manager

0B Windows 95+ FAT32

0C Windows 95+ FAT32 (using LBA-mode INT 13 extensions)

0E DOS FAT16 (over 32 MB, using INT 13 extensions)

0F Extended partition (using INT 13 extensions)

17 Hidden NTFS partition

1B Hidden Windows 95 FAT32 partition

1C Hidden Windows 95 FAT32 partition (using LBA-mode INT 13 extensions)

1E Hidden LBA VFAT partition

42 Dynamic disk volume

50 OnTrack Disk Manager, read-only partition

51 OnTrack Disk Manager, read/write partition

81 Linux

82 Linux Swap partition, Solaris (Unix)

83 Linux native file system (ext2fs/xiafs)

85 Linux EXT

86 FAT16 volume/stripe set (Windows NT)

87 HPFS fault-tolerant mirrored partition, NTFS volume/stripe set

BE Solaris boot partition

C0 DR-DOS/Novell DOS secured partition

C6 Corrupted FAT16 volume/stripe set (Windows NT)

C7 Corrupted NTFS volume/stripe set

F2 DOS 3.3+ secondary partition

[表2分区结构信息]

偏移 长度 含义

5

00H 1 活动分区指示符,该值为80H表示为可自举分区(仅有一个),该值为00H表示

其余分区。

01H 1 分区起始磁头号。

02H 1 低6位是分区开始的扇区,高2位是分区开始的柱面的头两位。

03H 1 分区开始的起始柱面号的低8位。

04H 1 系统标志,该值为01H表示采用12位FAT格式的DOS 分区,该值04H表示

采用16位FAT格式的DOS分区,该值为05H表示为扩展DOS分区,为06H

表示为DOS系统。

05H 1 分区终止头号

06H 1 低6位为分区结束的扇区号,头2位为结束柱面号的前2位。

07H 1 分区结束柱面号的低8位。

08H 4 本分区前的扇区数,低位字节在 前。

0CH 4 本分区总的扇区数,低位字节在前。

重要公式:

02H为X,03H为Y。柱面=(X>>6)*16^2+Y;

以我的硬盘为例:

有九个可用分区,二个不可用分区;

两个Primary NTFS分区,第二个为active;

七个Extened 分区,第五个为NTFS其他为FAT32.

.

主分区表数据:位置cylinder0, head 0,sector1

0

1

2

3

4

5

6

7

8

9

A

B

C

D

E

1B

1C

1D

1E

1F

0

33

38

3C

96

41

0B

25

1 2 3 4 5 6 7

FB

01

C6

38

B4

0E

25

FB

06

29

08

06

28

85

A1

00

8

50

10

9

07

E2

A

50

F5

F6

B

1F

C

FC

D E F

C0 8E D0 BC 00 7C

50 57 B9 E5

15 83

74 16

06 3C

C6 46

16 81

24 C7

2C 7C 09 75

C6 10 49

74

04 B4

2B 40

58 72

00

BE 1B 7C

B1 04

8B

25

05

B4

74

BF

4E AC

46

50

04

8B 14

07

89

BF 1B 06

EE 83

F3 A4

2C 74

74

06

55

11

75

CB BE BE 07

CD 18

BE 10

EB F2 FA BB 07 00 0E CD 10

24

8A 46

CD 13

B4 0B 3C

10 F6

88

7F

3E

12

80

35

0C 74

C1 01

66

03

3A C4 75 BB AA 55

AA 75

8A E0 88 56

B8 01 02

5A 83 EF

91

74

07

07

00

52 99

E4 33

03

A1 06

C9 83

BE 59

85

13

53

11

F6

56

00

EB 1E

FF 05

07

75

00

99

08

00

81

83

00

31

0A 00

AA 74

8A 98

D5 4F

56

01

41

41

00

33

46

30

00

8B DC 33

05 7F

03 46

52 50

1E C6

B2 30

FF F3

00 00

8B 4E

EB

00

00

00

00

00

AA

6

4E 02 CD 13 72 FE 7D 55

00

24

00

00

01

00

5A EB

45

00

80

00

00

55

DA BE 2E 07

0A E8

C0 CD 13 EB B8

F6 56 56

FE 7F

FE 7F

00 00

4A 00

6A 00

00 00

C3 1C 20

FE F7

00 00

B3 0F FE FF

主分区表分析:

Master bootstrap loader code

0000H -00D9H

33 C0 8E D0 BC 00 7C FB 50 。。。

主引导记录代码,表示住分区表

01BEH -01CDH 分区1结构信息

multi(0)disk(0)rdisk(0)partition(0)

知该分区Boot Sector位于:起始磁

头为0头,起始柱面为70D,起始

扇区为1扇区。

01CEH -01DDH 分区2结构信息

multi(0)disk(0)rdisk(0)partition(1)

活动分区指示符为80H,表示该

分区为可自举分区。

系统标志为07表示OS/2 HPFS,

Windows NT NTFS, Advanced Unix

系统。知该分区Boot Sector位于:

起始磁头为0头,起始柱面为

304D,起始扇区为1扇区。

01DEH -01EDH 分区3结构信息

Extended partition

系统标志字节为0F,说明是扩展

分区Extended partition (using INT

13 extensions)。

从扩展分区说明项知下一个分

区表位于:起始磁头为0头,起始

柱面为435D,起始扇区为1扇区。

7

01EEH -01FDH 分区4结构信息

分区说明项数据均为00H没有定

义。

01FEH -01FFH 55 AAH 主引导

记录有效标志

扩展分区一分区表数据:位置cylinder435D, head 0,sector1

0

1B

1C

1D

1E

1F

扩展分区表分析:

01BEH -01CDH 分区1结构信息

multi(0)disk(0)rdisk(0)partition(3)

知该分区位于:起始磁头为1头,

起始柱面为435D,起始扇区为1

扇区(分区表占用磁头0)。

系统标志字0BH表示 Windows

95+ FAT32

0

00

41

00

00

1

00

2 3 4

00

5 6 7

00

00

00

00

8 9 A

00

97

00

00

B

00

C

00

D

00

00

00

00

00

E

00

00

00

00

00

55

F

00

00

00

00

00

AA

00 00

00 00

08 3F

00 00

00 00

00 00

00 00

53 00

00 00

00 00

B3 0B FE FF

05 FE FF

00 00

00 00

00

00

00

00

D5 53

00

00

00

00

C1 09 FF D6 D5 D6 D5 53

8

01BEH -01CDH 分区1结构信息

系统标志字节为05H,说明是扩

展DOS分区。于是知下一个分区

表位于:起始磁头为0头,起始柱

面为777D,起始扇区为1扇区。

Partition Table Entry #3

Partition Table Entry #4

数据均为00H没有定义。

数据均为00H没有定义。

其他扩展分区同理。

---------------------------------------------------------------------------------------------------------------------

附录:

Fdisk的MBR参数

MBR 系 (EXE) 一项未公布的开关,隐含于 MS DOS 3.30,延至 MS DOS

8.0(Windows ME)。实践中,有籍以修复主引导信息,重点在主引导程序。

FDISK /MBR 命令流程的分支有二:

读得主引导扇区检验标志(字) AA55h,操作单一,仅向主引导扇区位移 0-1BDH 写入当

前系统固有的主引导程序,安全可靠。

难能可贵的是它不触动主引导信息其余模块(分区表、检验标志),以及随后的 DOS 引导

信息、文件分配表、根目录,省事许多。检出检验标志非 AA55h,写主引导程序、初始化

分区表及登录检验标志,在 MS DOS 7.0 - 8.0 环境中,常规以系统支持的最大容量分配

给基本 DOS 分区的方式登录分区表。分区表初始化(可能幸存的分区表被清除)的后果不难

想象; 目前硬盘大都设置有其它分区,即使在高版本 DOS 环境中运作,常规建立的分区

表每难能符合实际需求,后续工作量也相当可观。

不过,它也不触动位于其后的 DOS 引导信息、文件分配表及根目录,高版本 FDISK

/MBR 命令适用于修复仅设基本 DOS 分区的硬盘分区表及检验标志受损,或主引导信息全

毁。

可见,在运行 FDISK /MBR 命令之前,需查明检验标志是否 AA55h,酌情处理,切忌

盲动。

经由 DOS 软盘引导,认硬盘,检验标志必健在。

另外,在 FDSIK 主菜单中选 4. Display Partition Information,列出分区信息,进一步证

实检验标志正常; 若现 No partitition defined,检验标志每变异,而分区表或许尚健在。

9

●硬盘数据恢复,三深入逻辑分区

现在深入每一个逻辑分区。逻辑分区结构如下:

FAT12/16

L

o

g

i

c

a

l

s

e

c

t

o

r

=

0

Logical

sector=1

(Floppy

disk=1~9)

Logical

sector=1+se

ctors_per_F

AT

(Floppydisk

=10~18)

Logical

sector=1+secto

rs_per_FAT*2

(Floppy

disk=19~32)

Logical

sector=1+sectors_per_FAT*2+sectors_of_ro

otdirectories

(Floppy disk=33~)

FAT32

Usually 32 sectors Logical sector Logical sector =0032h+

=0032h 2*sectors_per_FAT

D

a

t

a

a

r

e

a

(

w

h

e

r

e

f

i

l

e

s

a

n

d

a

l

l

b

d

i

r

e

c

t

o

r

i

e

s

a

r

e

s

t

o

r

e

d

)

D

O

S

B

o

o

t

R

e

c

o

r

e

3

S

e

c

t

o

r

s

R

e

s

e

r

v

e

d

s

e

c

t

o

r

s

R

e

s

e

r

v

e

s

e

c

t

o

r

s

C

o

p

y

o

f

r

e

c

o

r

d

F

A

T

1

在逻辑分区当中用逻辑的cluster和sector。换算关系为:

cluster=logical_sector/sectors_per_cluster;

这里sectors_per_cluster是在BIOS Parameter Block里得到的。

Sector=( logical_sector mod sectors_per_track)+1;

Head=( logical_sector / sectors_per_track)mod total_heads;

Cylinder= logical_sector(sectors_per_track* total_heads);

logical_sector=( cluster-2)*sectors_per_cluster+sector_of_file_area_offset;

logical_sector=(sector-1)+head*sector_per_track+sector*sector_per_track*heads;

每个扇区长度=512字节

10

F

A

T

2

D

a

t

a

a

r

e

a

(

w

h

e

r

e

f

i

l

e

s

a

n

d

s

u

b

d

i

r

e

c

t

o

r

i

e

s

a

r

e

s

t

o

r

e

d

)

D

O

S

B

o

o

t

S

e

c

t

o

r

R

O

O

T

D

i

r

e

c

t

o

r

y

F

A

T

1

F

A

T

2

总簇数=逻辑盘容量/簇容量

总簇数=FAT表长度(字节)/每个表项长度(字节)-2

FAT表长度=逻辑盘容量/簇容量*每个表项长度

Dos引导记录块位于逻辑0 sector中包含三部分:

(1) 磁盘IO参数表BPB;

(2) 磁盘基数表;

(3) 引导区代码。

FAT16的BPB(BIOS Parameter Block)表,描述逻辑盘结构组成,包含隐藏扇区数目

(从0-1-1开始计算)、FAT扇区数、FAT拷贝数、硬盘磁头总数、根目录表项最大值等。

FAT32系统中,BPB表的偏移与FAT16不同,但表项基本相同。整个隐藏扇区部分都作

为逻辑盘的描述区域。

典型的primary partion 的磁盘IO参数表BPB:

典型的 logical partion 磁盘参数表:

11

硬盘BPB主要结构说明:

(Cylinder柱面/磁道-Side/Head磁头-Sector扇区地址以下简称为?-?-?)

主分区

名称 地址 长度(扇区)

1

62

1

长度(扇区)

1

62

1

12

主引导记录(Main Boot 0-0-1

Record)

系统扇区(System Secotrs)

引导扇区(Boot)

扩展分区

名称

系统扇区(System Secotrs)

引导扇区(Boot)

0-0-2,0-0-63

0-1-1

地址

?-y-2,?-y-63

?-(y+1)-1

扩展分区(Extend Partition) ?-y-1

其后各项与主分区相同……

隐藏扇区(Hidden Secotrs):

FAT16 0-1-1 1

FAT32 0-1-1 32

文件分配表(File Allocation Table):

FAT16 0-1-2 根据逻辑盘容量变化

FAT32 0-1-33 根据逻辑盘容量变化

说明:

FAT16的每个表项由2字节(16位)组成,通常每个表项指向的簇包含64个扇区,即

32K字节。 逻辑盘容量最大为2047MB。

FAT32的每个表项由4字节(32位)组成,通常每个表项指向的簇包含8个扇区,即4K

字节。逻辑盘容量最小为512MB。

对于C分区,在MBR的偏移01c2H处,FAT16为06H,FAT32为0CH。

FAT是DOS、Windows9X系统的文件寻址格式,位于DBR之后。

在解释文件分配表的概念的时候,我们有必要谈谈簇(Cluster)的概念。文件占用磁盘空

间,基本单位不是字节而是簇。一般情况下,软盘每簇是1个扇区,硬盘每簇的扇区数与硬

盘的总容量大小有关,可能是4、8、16、32、64……同一个文件的数据并不一定完整地存

放在磁盘的一个连续的区域内,而往往会分成若干段,像一条链子一样存放。这种存储方式

称为文件的链式存储。由于硬盘上保存着段与段之间的连接信息(即FAT),操作系统在读

取文件时,总是能够准确地找到各段的位置并正确读出。

为了实现文件的链式存储,硬盘上必须准确地记录哪些簇已经被文件占用,还必须为每个

已经占用的簇指明存储后继内容的下一个簇的簇号。对一个文件的最后一簇,则要指明本簇

无后继簇。这些都是由FAT表来保存的,表中有很多表项,每项记录一个簇的信息。由于

FAT对于文件管理的重要性,所以为了安全起见,FAT有一个备份,即在原FAT的后面再

建一个同样的FAT。初形成的FAT中所有项都标明为“未占用”,但如果磁盘有局部损坏,

那么格式化程序会检测出损坏的簇,在相应的项中标为“坏簇”,以后存文件时就不会再使

用这个簇了。FAT的项数与硬盘上的总簇数相当,每一项占用的字节数也要与总簇数相适应,

因为其中需要存放簇号。FAT的格式有多种,最为常见的是FAT16和FAT32。

当一个磁盘Format后,在其逻辑0扇区(即BOOT扇区)后面的几个扇区中存在着一个重

要的数据表—文件分配(FAT),文件分配表一式两份,占据扇区的多小凭磁盘类型大小而

定。顾名思义,文件分配表是用来表示磁盘问件的空分配信息的。它不对引导区,文件目录

的信息进行表示,也不真正存储文件内容。

我们知道磁盘是由一个一个扇区组成的,若干个扇区合为一个簇,文件存取是以簇为单位

的,哪怕这个文件只有1个字节。每个簇在文件分配表中都有对应的表项,簇号即为表项号,

每个表项占1.5个字节(磁盘空间在10MB以下)或2个字节(磁盘空间在10MB以上)。

为了方便起见,以后所说的表项都是指2个字节的。

FAT表的开始由介质描述符+一串“已占用”标志组成:

FAT16硬盘----F8 FF FF 7F

FAT32硬盘----F8 FF FF 0F FF FF FF 0F

每个有效的FAT结构区包含两个完全相同的拷贝:FAT1、FAT2

文件分配表结构如1(H表示16进制)

13

表1

第0字节 表头,表磁盘类型。FFH双面软盘,每次道

8扇区FEH单面软盘,每磁道8扇区FDH双

面软盘,每磁道9扇区FCCH单面软盘,每

磁道9扇区FC8H硬盘

(表项号1)表示第一簇状态,因第一簇被系

统占据,故此两字节为FFFFH

(表项号2)表示第二簇状态,若为FFFH表

此簇为坏的,DOS已标记为不能用;0000H

表示此簇为空,可以用;FFF8H表不能示该

簇为文件的最后一簇;其余数字表示文件的

下一个簇号,注意高字节在后,低字节在前。

(表项号3)表示第三簇状态,同上。

第1~2字节

第3~4字节

第5~6字节

注意:

不要把表项内的数字误认为表示当前簇号,而应是该文件的下一个簇的簇号。.高字节在

后,低字节在前是一种存储数字方式,读出时应对其进行调整。是如两字节12H,34H,应

调整为3412H。

文件分配表与文件目录(FDT)相配合,可以统一管理整个磁盘的文件。它告诉系统磁盘

上哪些簇是坏的或已被使用,哪些簇可以用,并存储每个文件所使用的簇号。它是文件的“总

调度师”。

当DOS写文件时,首先在文件目录中检查是否有相同文件名,若无则使用一个文件目录

表项,然后依次检测FAT中的每个表项对应的簇中,同时将该簇号写入文件目录表项相的

26-27字节,如文件长度不止一簇,则继续向后寻找可用簇,找到后将其簇号写入上一次找

到的表项中,如此直到文件结束,在最后一簇的表项里填上FFF8H,形成单向链表。

DOS删除文件时只是把文件目录表中的该文件的表项第0个字节改为E5H,表此项已被

删除,并在文件分配表中把该文件占用的各簇的表项清0,并释放空间。其文件的内容仍然

在盘上,并没有被真正删除,这就是,等一类恢复删除工具能起作用

的原因。

文件分配表在系统中的地位十分重要,用户最好不要去修改它,以免误操作带来严重的后

果。

典型的FAT32表:

FF

09

0D

FF

15

19

00

FF

25

FF

00

00

FF

00

00

00

FF

00

FF

00

00

FF

00

00

00

FF

00

0F

00

00

0F

00

00

00

0F

00

06

0A

0E

00

FF

1A

1E

22

26

00

00

00

00

FF

00

00

00

00

00

00

00

00

FF

00

00

00

00

00

00

00

00

0F

00

00

00

00

FF

0B

0F

FF

FF

1B

FF

23

27

FF

00

00

FF

FF

00

FF

00

00

FF

00

00

FF

FF

00

FF

00

00

0F

00

00

0F

0F

00

0F

00

00

08

0C

10

14

FF

FF

20

24

28

00

00

00

00

FF

FF

00

00

00

00

00

00

00

FF

FF

00

00

00

00

00

00

00

0F

0F

00

00

00

14

文件目录表(File Directory Table),即根目录区,又称为ROOT区:

紧跟在FAT2的下一个扇区,长度为32个扇区(256个表项)。如果支持长文件名,则每

个表项为64个字节,其中,前32个字节为长文件链接说明;后32个字节为文件属性说明,

包括文件长度、起始地址、日期、时间等。如不支持长文件名,则每个表项为32个字节的

属性说明。

值得注意的是:

1,FAT32没有储存目录的目录区,而 FAT16储存根目录并把子目录放到数据区。

2,表示目录的目录项指出根目录地址同时长度字节为0,表示文件的目录项指出数据地址。

典型的FAT32根目录:

30

39

44

39

42

00

30

2B

4D

2B

49

00

30

39

32

39

4E

00

30

2B

4B

2B

42

00

30

05

44

0A

49

00

30

00

49

00

4E

00

20

3D

53

20

47

20

7C

4B

20

65

20

39

49

39

20

09

20

2B

4D

2B

20

2B

20

3A

47

88

20

00

10

34

20

02

08

00

00

00

00

5B

00

00

12

00

96

72

00

00

3C

00

13

00

00

7C

00

00

00

00

DB 40

DC 40

15

000000子目录

注意:DOS7前的怪字符为E5H,表示被删除,被删除文件仍旧能够找到开始簇,数据恢

复就依靠这一特点。

数据区(Data Area): 紧跟在FDT的下一个扇区,直到逻辑盘的结束地址。

由上图可以想到,即使目录被破坏仍旧可能从磁盘里把信息读出。

到现在为止,硬盘数据结构的理论部分已经讲完。

数据恢复主要是手动找出FAT、目录、数据的对应关系或直接找到数据,现在已经有完善

的磁盘编辑器帮助我们做到这一点,使工作大大简化了。

有只能化的恢复工具能不依靠FAT而恢复被删除文件,比如RECOVERNT,估计是依靠

Win2000的文件使用记录。这种方法在冲启动之前恢复文件的可能性很大。

从理论上讲只要数据不被覆盖总能被恢复的。

16

●硬盘数据恢复,四文件分配表

FAT是DOS、Windows9X系统的文件寻址格式,位于DBR之后。

在解释文件分配表的概念的时候,我们有必要谈谈簇(Cluster)的概念。文件占用磁盘空

间,基本单位不是字节而是簇。一般情况下,软盘每簇是1个扇区,硬盘每簇的扇区数与硬

盘的总容量大小有关,可能是4、8、16、32、64……同一个文件的数据并不一定完整地存

放在磁盘的一个连续的区域内,而往往会分成若干段,像一条链子一样存放。这种存储方式

称为文件的链式存储。由于硬盘上保存着段与段之间的连接信息(即FAT),操作系统在读

取文件时,总是能够准确地找到各段的位置并正确读出。

为了实现文件的链式存储,硬盘上必须准确地记录哪些簇已经被文件占用,还必须为每个已

经占用的簇指明存储后继内容的下一个簇的簇号。对一个文件的最后一簇,则要指明本簇无

后继簇。这些都是由FAT表来保存的,表中有很多表项,每项记录一个簇的信息。由于FAT

对于文件管理的重要性,所以为了安全起见,FAT有一个备份,即在原FAT的后面再建一

个同样的FAT。初形成的FAT中所有项都标明为“未占用”,但如果磁盘有局部损坏,那么

格式化程序会检测出损坏的簇,在相应的项中标为“坏簇”,以后存文件时就不会再使用这

个簇了。FAT的项数与硬盘上的总簇数相当,每一项占用的字节数也要与总簇数相适应,因

为其中需要存放簇号。FAT的格式有多种,最为常见的是FAT16和FAT32。

当一个磁盘Format后,在其逻辑0扇区(即BOOT扇区)后面的几个扇区中存在着一个重

要的数据表—文件分配(FAT),文件分配表一式两份,占据扇区的多小凭磁盘类型大小而

定。顾名思义,文件分配表是用来表示磁盘问件的空分配信息的。它不对引导区,文件目录

的信息进行表示,也不真正存储文件内容。

我们知道磁盘是由一个一个扇区组成的,若干个扇区合为一个簇,文件存取是以簇为单位

的,哪怕这个文件只有1个字节。每个簇在文件分配表中都有对应的表项,簇号即为表项号,

每个表项占1.5个字节(磁盘空间在10MB以下)或2个字节(磁盘空间在10MB以上)。

为了方便起见,以后所说的表项都是指2个字节的。

文件分配表结构如1(H表示16进制)

表1

第0字节 表头,表磁盘类型。FFH双面软盘,每次道

8扇区FEH单面软盘,每磁道8扇区FDH双

面软盘,每磁道9扇区FCCH单面软盘,每

磁道9扇区FC8H硬盘

(表项号1)表示第一簇状态,因第一簇被系

统占据,故此两字节为FFFFH

(表项号2)表示第二簇状态,若为FFFH表

此簇为坏的,DOS已标记为不能用;0000H

表示此簇为空,可以用;FFF8H表不能示该

簇为文件的最后一簇;其余数字表示文件的

下一个簇号,注意高字节在后,低字节在前。

(表项号3)表示第三簇状态,同上。

第1~2字节

第3~4字节

第5~6字节

17

注意:

不要把表项内的数字误认为表示当前簇号,而应是该文件的下一个簇的簇号。.高字节在

后,低字节在前是一种存储数字方式,读出时应对其进行调整。是如两字节12H,34H,应

调整为3412H。

文件分配表与文件目录(FDT)相配合,可以统一管理整个磁盘的文件。它告诉系统磁盘

上哪些簇是坏的或已被使用,哪些簇可以用,并存储每个文件所使用的簇号。它是文件的“总

调度师”。

当DOS写文件时,首先在文件目录中检查是否有相同文件名,若无则使用一个文件目录

表项,然后依次检测FAT中的每个表项对应的簇中,同时将该簇号写入文件目录表项相的

26-27字节,如文件长度不止一簇,则继续向后寻找可用簇,找到后将其簇号写入上一次找

到的表项中,如此直到文件结束,在最后一簇的表项里填上FFF8H,形成单向链表。

DOS删除文件时只是把文件目录表中的该文件的表项第0个字节改为E5H,表此项已被

删除,并在文件分配表中把该文件占用的各簇的表项清0,并释放空间。其文件的内容仍然

在盘上,并没有被真正删除,这就是,等一类恢复删除工具能起作用

的原因。

文件分配表在系统中的地位十分重要,用户最好不要去修改它,以免误操作带来严重的后

果。

FAT表的定位

硬盘分区的主要结构说明:

(Cylinder柱面/磁道-Side磁头-Sector扇区地址以下简称为?-?-?)

《主分区》

名称

主引导记录(Main Boot Record)

系统扇区(System Secotrs)

引导扇区(Boot)

地址

0-0-1

0-0-2,0-0-63

0-1-1

长度(扇区)

1

62

1

FAT16系统中,此扇区包含BPB(BIOS Parameter Block)表,描述逻辑盘结构组成,包

含隐藏扇区数目(从0-1-1开始计算)、FAT扇区数、FAT拷贝数、硬盘磁头总数、根目录

表项最大值等。

FAT32系统中,BPB表的偏移与FAT16不同,但表项基本相同。整个隐藏扇区部分都作

为逻辑盘的描述区域。

隐藏扇区(Hidden Secotrs):

FAT16 0-1-1 1

FAT32 0-1-1 32

文件分配表(File Allocation Table):

FAT16 0-1-2 根据逻辑盘容量变化

FAT32 0-1-33 根据逻辑盘容量变化

说明:

FAT16的每个表项由2字节(16位)组成,通常每个表项指向的簇包含64个扇区,即

32K字节。

18

逻辑盘容量最大为2047MB。

FAT32的每个表项由4字节(32位)组成,通常每个表项指向的簇包含8个扇区,即4K

字节。

逻辑盘容量最小为512MB。

对于C分区,在MBR的偏移01c2H处,FAT16为06H,FAT32为0CH。

有关计算公式为:

每个扇区长度=512字节

总簇数=逻辑盘容量/簇容量

总簇数=FAT表长度(字节)/每个表项长度(字节)-2

FAT表长度=逻辑盘容量/簇容量*每个表项长度

FAT表的开始由介质描述符+一串“已占用”标志组成:

FAT16硬盘----F8 FF FF 7F

FAT32硬盘----F8 FF FF 0F FF FF FF 0F

每个有效的FAT结构区包含两个完全相同的拷贝:FAT1、FAT2

文件目录表(File Directory Table),即根目录区,又称为ROOT区:

紧跟在FAT2的下一个扇区,长度为32个扇区(256个表项)。如果支持长文件名,则每

个表项

为64个字节,其中,前32个字节为长文件链接说明;后32个字节为文件属性说明,包

括文件长

度、起始地址、日期、时间等。如不支持长文件名,则每个表项为32个字节的属性说明。

数据区(Data Area):

紧跟在FDT的下一个扇区,直到逻辑盘的结束地址。

《扩展分区》

名称

扩展分区(Extend Partition)

系统扇区(System Secotrs)

引导扇区(Boot)

其后各项与主分区相同……

FAT表引起的读写故障

硬盘文件分配表庞大无法手工修复,只能依靠工具。

FAT表记录着硬盘数据的存储地址,每一个文件都有一组FAT链指定其存放的簇地址。FAT

表的损坏意味着文件内容的丢失。庆幸的是DOS系统本身提供了两个FAT表,如果目前使

用的FAT表损坏,可用第二个进行覆盖修复。但由于不同规格的磁盘其FAT表的长度及第

二个FAT表的地址也是不固定的,所以修复时必须正确查找其正确位置,一些工具软件如

NU等本身具有这样的修复功能,使用也非常的方便。采用DEBUG也可实现这种操作,即

采用其m命令把第二个FAT表移到第一个表处即可(不建议这样做)。如果第二个FAT表也

损坏了,则也无法把硬盘恢复到原来的状态,但文件的数据仍然存放在硬盘的数据区中,可

采用CHKDSK或SCANDISK命令进行修复,最终得到*.CHK文件,这便是丢失FAT链的

扇区数据。如果是文本文件则可从中提取出完整的或部分的文件内容。

19

地址

?-y-1

?-y-2,?-y-63

?-(y+1)-1

长度(扇区)

1

62

1

软盘文件分配FAT表修复

在运行某个程序时,有时会在屏幕上看到:File allocation table bad,drive A(文件分配表坏)

的错误信息,导致程序不能正常运行。

我们知道,在磁盘中有两个文件分配表:FAT1和FAT2。FAT1用于日常工作,FAT2备用。

因此,在FAT1损坏时,可用FAT2表修补。

具体方法是:运行DEBUG,将FAT2读入缓冲区,用缓冲区的FAT2数据覆盖磁盘中的FAT1。

例:修复3寸1.44M软盘,在A驱

在DOS环境下进入debug环境

在“-”提示符下进行如下操作:

-L 100 0 0A 9

-W 100 0 1 9

-q

其它类型的软盘的修复方法参照下表进行。

起止逻辑扇区 5.25"低密 5.25"高密 3.5"低密 3.5"高密

BOOT区 0 0 0 0

FAT1 1-2 1-7 1-3 1-9

FAT2 3-4 8-0EH 4-6 0A-12H

例如我们要修复5.25"高密软盘的FAT,则需将上述参数改为:

-L 100 0 8 7

-W 100 0 1 7

-q

20

●硬盘数据恢复,五相关工具及实例

Win2k”秘密武器”之磁盘编辑

一.简介

是一个微软自己开发的、应用于windows 2000环境下的磁盘

扇区编辑工具,主要用于硬盘扇区的编辑。这个工具允许使用者以本地管理员的

身份或权限直接对硬盘的物理扇区进行:读取、编辑、修改、保存及备份。这是

用别的方法难以实现的操作。是微软支持工具中的一个。

Dskprobe的应用有以下限制和适用范围:1. 这个工具与诺顿工具的最大区

别就是引入了对工具使用者权限的要求,当执行Dskprobe的时候,它会先要求

你输入管理员的登录密码。2.由于每台计算机配备的硬盘都可能不一样,所安装

的操作系统的类型、版本也参差不一;如果利用了多系统引导安装,则还存在怎

样组合问题,凡此种种,都会影响主引导记录和分区表乃至引导扇区的内容。所

以,进行对比的时候,决不能照搬书本上的例子。3.该工具不能在FAT32上使用,

即不支持FAT32系统。4.该工具不能用在动态磁盘上。

该工具在使用时可分成两个阶段:

1.备份阶段,这是指系统尚属正常的时候,事先使用Dskprobe来将重要信

息读出、并保存为一个或多个文件。需要保存的有:主引导记录、分区表和引导

扇区。

2.排除故障,当发现引导故障后,如果确认是主引导记录、分区表和引导扇

区的问题。就可以用Dskprobe先将原来备份的文件读出来,然后进行替换并保

存到相应的物理扇区。进一步说:由于Dskprobe工具实际可以对硬盘的任意物

理扇区进行编辑修改,所以,它也决不限于只能完成上面三部分替换。

二.如何进行针对主引导记录的操作?

硬盘上电后,系统首先访问硬盘控制电路中保存的诸如厂商、型号等等基本

信息备用。随后系统执行BIOS中的一段例行代码,首先读取的硬盘的主引导记

录(Master Boot Record (MBR))到内存中,然后执行引导记录中的代码,就可

以完成引导过程并最终将整个系统的控制权交给操作系统。这就是计算机引导过

程的粗略描述。如果要配置多个操作系统,希望在引导过程中可以被用户选择,

就需要修改引导记录中的代码来实现这些功能。当然,这种情况下的主引导记录

要比单一引导更为复杂。

要访问主引导记录,可以先启动程序:,启动成功的界面如图所示。

21

然后可以按照下列步骤:

1.先指定要读取(主引导记录所在)的驱动器,可用鼠标点击菜单中的:Drives

->Physical Drive,会显示一个用来指定物理驱动器的对话框。

2.这个对话框的编辑栏中默认显示一个"Physical Drive 0",这就是第一个物

理驱动器――硬盘。

3.鼠标点击"Physical Drive 0",再点击按钮Set Active,就完成了指定

物理驱动器的任务了。4.然后指定要读取的物理扇区位置。可以点击图1菜单中

的Sectors->Read Sectors。又出现的对话框可以用来指定扇区的起始位置和

要连续读取的扇区数。

22

如Starting Sector(起始扇区)=0,Number of Sectors(扇区数)=1,

点击OK按钮后,立即显示出来的内容如图1窗口中所示。这就是物理硬盘0

柱面0磁盘面第一扇区的信息,也就是主引导记录的内容(包含分区表信息)。

如果将这些信息单独截取出来,以文本方式显示,基本上与下面的类似:之所以

说成基本类似,是因为这些内容中有些部分不是每台计算机都相同的,例如分区

表会随分区数多少而不同,引导记录代码也会因是否加入多引导选择而不同。

5.将显示结果保存为一个文件:上面已经说过物理硬盘0柱面0磁盘面第一扇区

的信息非常重要,我们何不趁现在计算机正常时将这些信息保存起来呢?你可以

点击"File->Save as…",指定一个文件的保存路径和名称,就可以予以保

存,默认的后缀是.dsk。

6.用完好的主引导记录替换当前(损坏)的这个:如果你自己的计算机存在引导

问题并确认是主引导扇区的问题,况且以前保存有完好的引导记录文件,那么,

你就可以进行这个操作了。首先点击"File->Open",找到引导记录文件并打

开,如果核对一下没有问题,就可以再点击"Write -> Write Sector",然

后会有对话框让你指定(要写入的)起始扇区,选好后点击"OK",就可以完

成改写。必须说明的是:这种操作非常关键,一步也不能错。否则后果是非常严

重的,为防万一,动手之前重要数据先作好备份。

能导致主引导记录损坏的原因主要有:a.病毒,许多病毒都修改这里,因

为主引导记录被执行的时候,操作系统还没有在内存中完全取得系统控制权,这

种修改的结果是病毒先取得了系统控制权。如果真是这种情况,病毒代码往往还

会接着存放在后续的扇区中,而正常情况下,0柱面0磁面上应当是除了主引导

记录外什么也没有的。假设,你的硬盘是每面63个扇区,如果你发现0柱面0

磁盘面第一扇区之后的哪些扇区上并不是以0填充的,而是有别的非0值,就可

以肯定你的硬盘存在问题。b.分区表损坏。这也是常见的问题,我们留在后面

详细讨论。c.分区操作不当,这主要发生在没有安装操作系统之前,所以也用

不上本次所介绍的工具。

三.引导记录结构。

下面是一个主引导记录区的内容:最左边的:号前的数字是相对的物理地址;

中间的那些16进制数字是记录内容(限于蓝色的部分);粉红色的字体是磁盘

签名,在以前的dos中是没有这一项的;以80开头的红色字体部分是分区表;

末尾的55AA是引导结束标志。

Physical Sector: Cyl 0, Side 0, Sector 1

23

00000000: 33 C0 8E D0 BC 00 7C FB - 50 07 50 1F FC BE 1B

00000010: BF 1B 06 50 57 B9 E5 01 - F3 A4 CB BD BE 07 B1 04 ...PW...........

00000020: 38 6E 00 7C 09 75 13 83 - C5 10 E2 F4 CD 18 8B u..........

00000030: 83 C6 10 49 74 19 38 2C - 74 F6 A0 B5 07 B4 07 8B ...It.

00000040: F0 AC 3C 00 74 FC BB 07 - 00 B4 0E CD 10 EB F2 88 ..<.t...........

00000050: 4E 10 E8 46 00 73 2A FE - 46 10 80 7E 04 0B 74 0B N..F.s*.F..~..t.

00000060: 80 7E 04 0C 74 05 A0 B6 - 07 75 D2 80 46 02 06 83 .~..t....u..F...

00000070: 46 08 06 83 56 0A 00 E8 - 21 00 73 05 A0 B6 07 V...!.s.....

00000080: BC 81 3E FE 7D 55 AA 74 - 0B 80 7E 10 00 74 C8 A0 ..>.}U.t..~..t..

00000090: B7 07 EB A9 8B FC 1E 57 - 8B F5 CB BF 05 00 8A 56 .......W.......V

000000A0: 00 B4 08 CD 13 72 23 8A - C1 24 3F 98 8A DE 8A FC .....r#..$?.....

000000B0: 43 F7 E3 8B D1 86 D6 B1 - 06 D2 EE 42 F7 E2 39 B..9V

000000C0: 0A 77 23 72 05 39 46 08 - 73 1C B8 01 02 BB 00 7C .w#r.

000000D0: 8B 4E 02 8B 56 00 CD 13 - 73 51 4F 74 4E 32 E4 8A .N..V...sQOtN2..

000000E0: 56 00 CD 13 EB E4 8A 56 - 00 60 BB AA 55 B4 41 V.`..U.A.

000000F0: 13 72 36 81 FB 55 AA 75 - 30 F6 C1 01 74 2B 61 60 .r6..+a`

00000100: 6A 00 6A 00 FF 76 0A FF - 76 08 6A 00 68 00 7C 6A j.j..v..v.j.h.|j

00000110: 01 6A 10 B4 42 8B F4 CD - 13 61 61 73 0E 4F 74 0B .j..B.....

00000120: 32 E4 8A 56 00 CD 13 EB - D6 61 F9 C3 49 6E 76 61 2..V.....a..Inva

00000130: 6C 69 64 20 70 61 72 74 - 69 74 69 6F 6E 20 74 61 lid partition

ta

00000140: 62 6C 65 00 45 72 72 6F - 72 20 6C 6F 61 64 69 6E loadin

00000150: 67 20 6F 70 65 72 61 74 - 69 6E 67 20 73 79 73 74 g operating

syst

00000160: 65 6D 00 4D 69 73 73 69 - 6E 67 20 6F 70 65 72 61 g

opera

00000170: 74 69 6E 67 20 73 79 73 - 74 65 6D 00 00 00 00 00

00000180: 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 ................

00000190: 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 ................

000001A0: 00 00 00 00 00 00 00 00 - 00 00 00 00 00 00 00 00 ................

000001B0: 00 00 00 00 00 2C 44 63 - 32 31 37 31 35 0C 80 01 .....,

000001C0: 01 00 07 FE 7F 7D 3F 00 - 00 00 BF A3 5D 00 00 00 .... }?.....]...

000001D0: 41 7E 06 FE BF 62 FE A3 - 5D 00 A5 22 38 00 00 00 A~...b..].."8...

000001E0: 81 63 0B FE FF 7A A3 C6 - 95 00 18 A3 44 00 00 00 .c...z......D...

000001F0: C1 7B 05 FE FF FF BB 69 - DA 00 E2 48 D4 00 55 AA .{.....i...H..U.

重新格式化动态系统/启动分区后无法继续进行设置

日期: 2000年09月20日

故障现象

在进行文本模式设置和设置完毕后的文件复制过程中重新格式化系统/启动分区

后,当你重启计算机进入图形模式设置时可能会出现以下的某些故障:

计算机完成开电自检(POST)后出现黑屏,没有响应 。

24

出现以下错误信息:

Cannot find NTLDR(找不到NTLDR)

Press any key to restart(按下任意键重启)

原因

之所以出现以上现象,主要是由于启动扇区的BIOS参数块(BPB)中包含了非法

的驱动器转换值,从而阻碍了系统的正常启动。

解决

要继续完成设置,可以按照以下文章中描述的步骤创建启动盘,而后用启动盘进

行启动,这些文章收录在“微软知识基础”中。

完成设置后,可以采取以下的一种方法修正启动扇区的BPB,以使Windows 2000

能够正常启动。你可以使用“”工具修正BPB,该工具位于Windows

2000 CD-ROM的“SupportTools”文件夹中,它能够修改下列启动扇区的字段,

以符合硬盘的实际结构:

每磁道的扇区数

磁头(磁道/柱面)

修正FAT32格式的系统/启动分区

警告: 对于FAT32分区,不要在“查看”菜单中将启动扇区作为FAT启动分区

来浏览和保存,这种方式将破坏现有分区,你应当在编辑时将工具置于“字节”

模式。

1. 启动.

2. 在“驱动器”菜单中点击“物理驱动器”,而后双击代表系统/启动驱动器的

物理驱动器。

3. 点击“只读”复选框以取消选择,点击“设置激活”,而后点击“确定”。

4. 在“扇区”菜单中点击“读取”以使用缺省设置。

5. 在“驱动器”菜单中点击“卷信息”,而后注意以下值:

o

每磁道的扇区数

o

磁头(磁道/柱面)

6. 使用“计算器”()将上述值由十进制转换为十六进制,并将转换后的值留待以后

使用。例如:

Sectors / Track 十进制值 63转换为十六进制值3F。

Tracks / Cylinder 十进制值255转换为十六进制值FF。

7. 在“查看”菜单中点击“分区表”。

8. 双击每个分区表的索引项找到激活分区(“Boot Indicator”字段的值为“SYSTEM”)。注意

对应于激活分区(SYSTEM)的“相关扇区”号。

9. 点击激活分区“相关扇区”号旁的“执行”按钮。

10. 在“查看”菜单中点击“字节”,该操作将显示十六进制的BPB信息。

11. 修改偏移量0x018的值,修改范围从十六进制数01到步骤6中读取的扇区/磁道值。

12. 修改偏移量0x01A的值,修改范围从十六进制数01到步骤6中读取的扇区/磁道值。

13. 确认BPB条目的值都等于正确的十六进制值后,点击“扇区”菜单中的“写入”选项。

14. 确认你要写入的扇区与“相关扇区”设置中的相同,而后点击“写入”。

25

15. 退出“”工具而后重启计算机,此时不使用启动盘。

修正FAT (非FAT32)或NTFS系统/启动分区

1.

2.

3.

4.

5.

启动.

在“驱动器”菜单中点击“物理驱动器”,而后双击代表系统/启动驱动器的物理驱动器。

点击“只读”复选框以取消选择,点击“设置激活”,而后点击“确定”。

在“扇区”菜单中点击“读取”以使用缺省设置。

在“驱动器”菜单中点击“卷信息”,而后注意以下值:

o

每磁道的扇区数

o

磁头(磁道/柱面)

6. 在“查看”菜单中点击“分区表”。

7. 双击每个分区表的索引项找到激活分区(“Boot Indicator”字段的值为“SYSTEM”)。

注意对应于激活分区(SYSTEM)的“相关扇区”号。

8. 点击激活分区“相关扇区”号旁的“执行”按钮。

9. 基于当前文件系统类型,在“查看”菜单中点击“FAT启动扇区”或“NTFS启动扇区”,

该操作将显示需编辑的BPB信息。

10. 修改“每磁道扇区数”条目的值,取值范围为从“1”到步骤5中获取的“扇区/磁道”值。

11. 修改“磁头”条目的值,取值范围为从“1”到步骤5中获取的“扇区/磁道”值。

12. 确认BPB条目的值都正确后,点击“扇区”菜单中的“写入”选项。

13. 确认你要写入的扇区与“相关扇区”设置中的相同,而后点击“写入”。

14. 退出“”工具而后重启计算机,此时不使用启动盘。

Runtime's DiskExplorer

26

System Requirements:

Pentium processor

8 MB RAM

Windows 95/98/ME, NT or 2000

Runtime's DiskExplorer for NTFS

- Windows based Disk Editor for Ntfs file systems -

This sophisticated disk editor enables you to investigate your NTFS drive and conduct

your own data recovery, using the following features:

navigate through your NTFS drive by jumping to the partition table, boot record,

Master file table or the root directory,

choose between views as hex, text, index allocation, MFT, boot record, partition

table,

inspect the file entry details, NT attributes etc.,

search your drive for text, partition tables, boot records, MFT entries, index

buffers

view files,

save files or whole directories from anywhere on the drive,

identify the file a certain cluster belongs to,

create a virtual volume when the boot record is lost or corrupt,

edit your drive by using the direct read/write mode (not recommended) or the

virtual write mode.

System Requirements:

Pentium processor

8 MB RAM

Windows 95/98/ME, NT or 2000

Acronis Disk Editor 1.5

Acronis Disk Editor 1.5 is a flexible hard disk drive and partition editor.

This excellent utility gives you the power to edit your hard drive and

its partition data manually, fix hard drive data errors, exterminate

viruses, and succeed in myriad other tasks that require direct access to

hard drive data.

27

General

Acronis Disk Editor 1.5 was designed for editing partitions, partition

tables, free space and/or whole hard disk drive contents directly. In case

of emergency Acronis Disk Editor 1.5 will help you to restore accidentally

lost valuable data, repair hard drive data errors, and accomplish even

more complicated drive level tasks.

Features

Powerful editing tools. You can select data either with mouse or with keyboard. Selected

data could be copied, moved, filled with specified values, saved and restored. You can

always undo changes made or apply them. For your convenience modified data is

highlighted with different color.

Powerful navigation and search tools. Acronis Disk Editor 1.5 allows searching of both

strings and arbitrary set of characters. Case insensitive search is also supported.

Optionally you can specify search area. At any time you may jump to the beginning of the

area being edited, or to a sector specified.

Automatic computation of unknown fields in partition table from known data, for

example, during manual reconstruction of partition table.

Several modes for data viewing and editing:

o

Hex

In this mode hard disk data is represented as a dump of hexadecimal values and

corresponding symbols.

o

Partition table

This mode assumes that the current sector is either MBR or extended partition

table.

o

FAT 16/32 boot sector

These modes assume that the current sector is the boot-sector of a FAT16 or FAT

32 file system. The View/Edit window contains boot sector fields.

o

NTFS boot sector

This mode assumes that the current sector is the boot sector of an NTFS file

system. The View/Edit window contains boot sector fields.

In any mode you may edit data that is shown. In Hex mode all sector data is viewed and

edited in the same way. In other modes data is represented depending on the field type.

For your convenience, Acronis Disk Editor 1.5 provides additional methods of choosing

valid values from the list.

PLEASE NOTE: Using the Acronis Disk Editor 1.5 requires advanced

knowledge of partition and file system structure.

28

Screen shots

Several screen shots below demonstrate the powerful features of Disk

Editor and its user-friendly, graphical interface.

Click on preferred image to zoom in. The full-sized image will be opened

in a new window.

General Disk Editor outlook

Open new dialog.

Select view mode menu

You can browse and edit data in

several modes. In background you

will see a FAT32 boot sector viewed

in hex mode.

Choose partition type dialog

Disk Editor provides additional

methods of choosing valid values

from the list.

29

Search menu

Powerful search tools are included

in Disk Editor.

Search dialog

Acronis Disk Editor allows searching

of both strings and arbitrary set of

characters, ignoring case if

necessary. Optionally you can

specify search area.

Go to sector dialog

At any time you may jump to the

beginning of the area being edited,

or to a sector specified.

Fill dialog

You can fill a specified area with

any value and thus, for example,

completely delete/wipe confidential

information.

Write to file dialog

You can save any sector to file to

backup before applying changes.

30

Read from file dialog

You can read data from file to the

specified area of your hard drive

WinHex 9.92

General Information

About WinHex Ordering Information

Using a Hex Editor

Integer Data Types Floating-Point Data Types

Date Types

ANSI ASCII/IBM ASCII Checksums

Technical Hints Legal Hints

Working with the Hex Editor

Start Center Options

Entering Characters Edit Modes Status Bar

Useful Hints Routines

Disk Editor RAM Editor

Menu Reference

File Menu Edit Menu

Search Menu Position Menu

Tools Menu Options Menu

File Manager Window Menu

Help Menu Context Menu

Extras

Conversions Modify Data

Data Interpreter Disk Cloning

Position Manager Routine Manager Backup Manager

Template Editing File Recovery

31

Norton Disk Editor

老东西了,不用说了吧。

RecoverNT

老东西了,不用说了吧。

32

NTFS文件系统

一,ntfs文件系统

nt文件系的统主要特征是在引导记录了描述的。这些文件系统从引导扇区的位置开始直至

这些磁道加上卷(分区)里的磁道区域。分区是由簇构成,而且只能是簇(512字节)的整

数倍。每个分区的开始地址是(逻辑)0簇。

任何(软件的磁盘)定位系统都是用簇而不是磁道号。各种(磁盘)信息储存在文件分配表

(MFT)里。文件分配表的位置在引导扇区的“第一文件分配表”表项里给出。文件分配

表是一个数据库,包含了此分区的所有文件及目录的信息。每一个表项是1024字节(fat32

是4个字节,fat16是2个字节,fat12是1.5个字节)。每一个表项记录一个文件或目录(包

括文件分配表自己),并且有一个记录号等于文件分配表的位置除以1024。文件分配表的表

项由一个表头和表示文件或目录属性的列表组成。这些属性描述了文件或目录的名称、时间、

大小等。主要的属性如下:

10 Standard information: contains time stamps and DOS attributes,

30 File name: contains the file's name for different name spaces (usually NT's native Unicode file

name and DOS compatible DOS file name),

80 Data: if the entry represents a file, this attribute contains the file's data.

90 Index root: if the entry is a directory, this attribute describes the root of a binary tree in which

the directory entries are located,

A0 Index allocation: if the entry is a directory, this attribute contains a list of file names.

这些属性表比1024字节大,意味着一些属性必须记录在文件分配表表项外。在这种情况下,

就有一个运行列表(run list)记录这些在表项外的数据。运行列表实质上是簇的使用列表。

二,文件条目表项细节

任何一个文件或目录都被至少一条文件分配表项所描述。文件分配表位于一个系统文件,叫

做$MFT。这个文件能够理解为包括每一个文件和目录的数据库。每一个文件分配表的条目

默认1024字节。MFT条目位置由序号标志。例如:第100条的地址为100*1024。开始的

16条为保留区域,第0条是最重要的,它描述了文件分配表自己,其次第5条描述根目录 。

实例:

一个典型的6G硬盘,一个NTFS分区。

引导记录如下:

33

或这样看:

于是第一个文件分配表(MFT)就在25256(0x000062A8)处,每个表项2个磁道。

注意:此分区每个磁道一个簇,这也是ntfs比fat32节省空间的原因。

第一个表项:

此文件就是文件分配表$MFT,文件名如此.

0

46

01

00

10

1

49

00

00

00

2

4C

01

00

00

3

45

00

00

00

4

30

00

60

5

00

00

00

6

03

01

00

00

7

00

00

00

00

8

B0

B0

08

00

9

01

00

00

A

00

0F

18

B

00

07

00

C

00

00

00

D

00

04

00

00

E

00

00

00

00

F

00

00

00

00

34

2A 00 7B A4 A5 00

48

60

60

00

00

30

60

60

00

06

54

01

15

00

00

48

B0

00

40

58

21

C8

B0

00

40

E0

21

00

00

00

00

00

00

00

00

00

00

00

00

00

00

00

00

56

56

00

00

00

56

56

B4

00

00

00

25

2C

2C

06

00

00

00

22

02

25

00

00

00

03

02

00

00

00

00

00

00

00

00

00

00

00

00

00

00

00

00

5E

5E

00

00

00

00

5E

5E

44

00

00

40

02

00 18 00 00

C1

C1

00

00

00

01

C1

C1

00

00

00

07

00

00

00

01

00

00

00

00

41

00

00

00

00

00

00

00

00

00

00

00

00

00

00

00

00

00

00

00

00

00

01

01

00

00

00

00

01

01

00

00

00

00

00

00

00

D1

00

00

00

00

80

00

00

00

00

00

00

00

00

00

00

00

00

00

00

00

00

00

00

00

00

60

60

06

00

00

00

05

60

60

00

04

80

00

40

00

21

77

01

17

00

58

FF

01

01

00

E0

FF

00

00

00

00

00

00

00

00

00

00

00

00

00

00

00

56

56

00

00

00

00

00

56

56

03

00

00

00

20

60

00

00

30

22

FF

00

00

04

03

FF

00

00

00

00

00

00

00

00

00

00

00

00

00

00

00

5E

5E

00

00

00

18

00

5E

5E

24

00

00

00

D5 0D A4

D5 0D A4

00

00

00

00

00

00

00

00

00

00

00

01

00

00

00

C1 01

C1 01

00

00

00

03

05

00

00

00

00

00

D5 0D A4

D5 0D A4

00

00

00

00

00

00

68

18

00

00

00

00 4A 00

D5 0D A4

D5 0D A4

00

00

00

00

00

00

00

00

00

00

00

00

93

58

00

00

00

31

00

48

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

85

00

00

00

00

06

A2

00

00

00

00

00

00

00

00

00

00

00

00

00

00

00

00

00

00

00

00

D5 0D A4

D5 0D A4

00

00

00

00

00

00

58

00

00

00

33

01

00

00

00

00

70

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

63

00

00

00

00

00

1E

00

00

00

00

00

00

00

00

00

00

00

00

00

00

00

00

00

00

00

00

00

4D 00

C1 01

C1 01

00

46

00

00

00

00

9F

00

06

00

00

00

41

00

06

00

00

00

0F

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

08

00

00

00

00

00

07

00

00

00

00

00

00

00

00

00

00

00

00

00

00

00

35

B4 44

4A 04

4A 04

06

00

00

00

00

C8

87

00

00

00

00

C8

00

00

00

00

00

00

00

00

00

00

00

00

00

00

00

33

00

00

00

00

62

00

00

00

00

00

62

00

00

00

00

00

00

00

00

00

00

00

00

00

00

00

2C 4A 04

A8 62

00

40

00

00

00

08

FF

40

00

00

00

FF

00

00

00

00

00

00

00

00

00

00

00

00

00

00

00

81

00

00

00

00

F7

FF

00

00

00

00

FF

00

00

00

00

00

00

00

00

00

00

00

00

00

00

00

A2 EA 0D 31

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

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

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

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

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

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

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

00

00

00

00

00

00

00

00

00

00

00

00

00

00

00

00

0F

00

00

00

00

00

00

00

00

00

00

00

00

00

00

00

00

07

注意:左边绝对磁道62e7-相对磁道62a8=(分区表+保留扇区)3f,因为它们是不记如分区之内

的。

36

37

注意:run list表示数据不在这里。

38

这样的系统使用的表项一共最多16个:

39

而普通文件的表项如下:

换成目录方式就是:

40

代序。

41

关于int13与扩展int13

第一部分 简 介

1,1

一. 硬盘结构简介

1. 硬盘参数释疑

到目前为止, 人们常说的硬盘参数还是古老的 CHS (Cylinder/Head/Sector)参数. 那么为什么要

使用这些参数, 它们的意义是什么? 它们的取值范围是什么? 很久以前, 硬盘的容量还非常小的

时候, 人们采用与软盘类似的结构生产硬盘. 也就是硬盘盘片的每一条磁道都具有相同的扇区数.

由此产生了所谓的3D参数 (Disk Geometry). 既磁头数(Heads), 柱面数(Cylinders), 扇区数

(Sectors),以及相应的寻址方式.

其中:

磁头数(Heads) 表示硬盘总共有几个磁头,也就是有几面盘片, 最大为 255 (用 8 个二进制位存

储); 柱面数(Cylinders) 表示硬盘每一面盘片上有几条磁道, 最大为 1023 (用 10 个二进制位存

储); 扇区数(Sectors) 表示每一条磁道上有几个扇区, 最大为 63 (用 6 个二进制位存储).

每个扇区一般是 512个字节, 理论上讲这不是必须的, 但好象没有取别的值的.所以磁盘最大容

量为: 255 * 1023 * 63 * 512 / 1048576 = 8024 GB ( 1M = 1048576 Bytes ) 或硬盘厂商常用的单位:

255 * 1023 * 63 * 512 / 1000000 = 8414 GB ( 1M = 1000000 Bytes ) 在 CHS 寻址方式中, 磁头,

柱面, 扇区的取值范围分别为 0 到 Heads - 1, 0 到 Cylinders - 1, 1 到 Sectors (注意是从 1 开

始).

2. 基本 Int 13H 调用简介

BIOS Int 13H 调用是 BIOS 提供的磁盘基本输入输出中断调用, 它可以完成磁盘(包括硬盘和软

盘)的复位, 读写, 校验, 定位, 诊断, 格式化等功能.它使用的就是 CHS 寻址方式, 因此最大识

能访问 8 GB 左右的硬盘 ( 本文中如不作特殊说明, 均以 1M = 1048576 字节为单位).

3. 现代硬盘结构简介

在老式硬盘中, 由于每个磁道的扇区数相等, 所以外道的记录密度要远低于内道, 因此会浪费很

多磁盘空间 (与软盘一样). 为了解决这一问题, 进一步提高硬盘容量, 人们改用等密度结构生产

硬盘. 也就是说, 外圈磁道的扇区比内圈磁道多. 采用这种结构后, 硬盘不再具有实际的3D参数,

寻址方式也改为线性寻址, 即以扇区为单位进行寻址.为了与使用3D寻址的老软件兼容 (如使用

BIOS Int13H接口的软件), 在硬盘控制器内部安装了一个地址翻译器, 由它负责将老式3D参数

翻译成新的线性参数. 这也是为什么现在硬盘的3D参数可以有多种选择的原因 (不同的工作模

式, 对应不同的3D参数, 如 LBA, LARGE, NORMAL).

4. 扩展 Int 13H 简介

虽然现代硬盘都已经采用了线性寻址, 但是由于基本 Int 13H 的制约, 使用 BIOS Int 13H 接口

的程序, 如 DOS 等还只能访问 8 G 以内的硬盘空间.为了打破这一限制, Microsoft 等几家公司

制定了扩展 Int 13H 标准(Extended Int13H), 采用线性寻址方式存取硬盘, 所以突破了 8 G 的

限制, 而且还加入了对可拆卸介质 (如活动硬盘) 的支持.

二. Boot Sector 结构简介

1. Boot Sector 的组成

Boot Sector 也就是硬盘的第一个扇区, 它由 MBR (Master Boot Record), DPT (Disk Partition

Table) 和 Boot Record ID 三部分组成. MBR 又称作主引导记录占用 Boot Sector 的前 446 个

字节 ( 0 to 0x1BD ), 存放系统主引导程序 (它负责从活动分区中装载并运行系统引导程序).

DPT 即主分区表占用 64 个字节 (0x1BE to 0x1FD), 记录了磁盘的基本分区信息. 主分区表分

为四个分区项, 每项 16 字节, 分别记录了每个主分区的信息(因此最多可以有四个主分区).Boot

42

Record ID 即引导区标记占用两个字节 (0x1FE and 0x1FF), 对于合法引导区, 它等于 0xAA55,

这是判别引导区是否合法的标志.Boot Sector 的具体结构如下图所示:

0000 |------------------------------------------------|

| |

| |

| Master Boot Record |

| |

| |

| 主引导记录(446字节) |

| |

| |

| |

01BD | |

01BE |------------------------------------------------|

| |

01CD | 分区信息 1(16字节) |

01CE |------------------------------------------------|

| |

01DD | 分区信息 2(16字节) |

01DE |------------------------------------------------|

| |

01ED | 分区信息 3(16字节) |

01EE |------------------------------------------------|

| |

01FD | 分区信息 4(16字节) |

|------------------------------------------------|

| 01FE | 01FF |

| 55 | AA |

|------------------------------------------------|

2. 分区表结构简介

分区表由四个分区项构成, 每一项的结构如下:

BYTE State : 分区状态, 0 = 未激活, 0x80 = 激活 (注意此项)

BYTE StartHead : 分区起始磁头号

WORD StartSC : 分区起始扇区和柱面号, 底字节的低6位为扇区号,高2位为柱面号的第 9,10

位, 高字节为柱面号的低 8 位BYTE Type : 分区类型, 如 0x0B = FAT32, 0x83 = Linux 等,

00 表示此项未用

BYTE EndHead : 分区结束磁头号

WORD EndSC : 分区结束扇区和柱面号, 定义同前

DWORD Relative : 在线性寻址方式下的分区相对扇区地址

(对于基本分区即为绝对地址)

DWORD Sectors : 分区大小 (总扇区数)

注意: 在 DOS / Windows 系统下, 基本分区必须以柱面为单位划分( Sectors * Heads 个扇区),

如对于 CHS 为 764/255/63 的硬盘, 分区的最小尺寸为 255 * 63 * 512 / 1048576 = 7.844 MB.

3. 扩展分区简介

43

由于主分区表中只能分四个分区, 无法满足需求, 因此设计了一种扩展分区格式. 基本上说, 扩

展分区的信息是以链表形式存放的, 但也有一些特别的地方.首先, 主分区表中要有一个基本扩

展分区项, 所有扩展分区都隶属于它, 也就是说其他所有扩展分区的空间都必须包括在这个基本

扩展分区中. 对于DOS / Windows 来说, 扩展分区的类型为 0x05. 除基本扩展分区以外的其他

所有扩展分区则以链表的形式级联存放, 后一个扩展分区的数据项记录在前一个扩展分区的分

区表中, 但两个扩展分区的空间并不重叠.扩展分区类似于一个完整的硬盘, 必须进一步分区才

能使用. 但每个扩展分区中只能存在一个其他分区. 此分区在 DOS/Windows 环境中即为逻辑

盘. 因此每一个扩展分区的分区表 (同样存储在扩展分区的第一个扇区中)中最多只能有两个分

区数据项(包括下一个扩展分区的数据项). 扩展分区和逻辑盘的示意图如下:

|-----------------------| --------

| 主扩展分区(/dev/hda2) | ^

|-----------------------| |

| 扩 展 | 分区项 1 |-- |

| |------------| | |

| 分区表 | 分区项 2 |--+-- |

|-----------------------| | | |

| | | | |

| 逻辑盘 1 (/dev/hda5) |<-/ | |

| | | |

|-----------------------| | 主

| 扩展分区 2 |<----/

|-----------------------| 扩

| 扩 展 | 分区项 1 |--

| |------------| | 展

| 分区表 | 分区项 2 |--+--

|-----------------------| | | 分

| | | |

| 逻辑盘 2 (/dev/hda6) |<-/ | 区

| | | |

|-----------------------| | |

| 扩展分区 3 |<----/ |

|-----------------------| |

| 扩 展 | 分区项 1 |-- |

| |------------| | |

| 分区表 | 分区项 2 | | |

|-----------------------| | |

| | | |

| 逻辑盘 3 (/dev/hda7) |<-/ |

| | |

|-----------------------| ---------

三. 系统启动过程简介

系统启动过程主要由一下几步组成(以硬盘启动为例):

1. 开机 :-)

2. BIOS 加电自检 ( Power On Self Test -- POST )

44

内存地址为 0ffff:0000

3. 将硬盘第一个扇区 (0头0道1扇区, 也就是Boot Sector)

读入内存地址 0000:7c00 处.

4. 检查 (WORD) 0000:7dfe 是否等于 0xaa55, 若不等于

则转去尝试其他启动介质, 如果没有其他启动介质则显示

"No ROM BASIC" 然后死机.

5. 跳转到 0000:7c00 处执行 MBR 中的程序.

6. MBR 首先将自己复制到 0000:0600 处, 然后继续执行.

7. 在主分区表中搜索标志为活动的分区. 如果发现没有活动

分区或有不止一个活动分区, 则转停止.

8. 将活动分区的第一个扇区读入内存地址 0000:7c00 处.

9. 检查 (WORD) 0000:7dfe 是否等于 0xaa55, 若不等于则

显示 "Missing Operating System" 然后停止, 或尝试

软盘启动.

10. 跳转到 0000:7c00 处继续执行特定系统的启动程序.

11. 启动系统 ...

以上步骤中 2,3,4,5 步是由 BIOS 的引导程序完成. 6,7,8,9,10

步由MBR中的引导程序完成.

一般多系统引导程序 (如 SmartFDISK, BootStar, PQBoot 等) 都是将标准主引导记录替换成自

己的引导程序, 在运行系统启动程序之前让用户选择要启动的分区. 而某些系统自带的多系统引

导程序 (如 lilo, NT Loader 等) 则可以将自己的引导程序放在系统所处分区的第一个扇区中,

在 Linux 中即为 SuperBlock (其实 SuperBlock 是两个扇区). 注: 以上各步骤中使用的是标准

MBR, 其他多系统引导程序的引导过程与此不同.

第二部分 技术资料

第一章 扩展 Int13H 技术资料

一. 简介

设计扩展 Int13H 接口的目的是为了扩展 BIOS 的功能, 使其支持

多于1024柱面的硬盘, 以及可移动介质的琐定, 解锁及弹出等功能.

二. 数据结构

1. 数据类型约定

BYTE 1 字节整型 ( 8 位 )

WORD 2 字节整型 ( 16 位 )

DWORD 4 字节整型 ( 32 位 )

QWORD 8 字节整型 ( 64 位 )

2. 磁盘地址数据包 Disk Address Packet (DAP)

DAP 是基于绝对扇区地址的, 因此利用 DAP, Int13H 可以轻松地逾

越 1024 柱面的限制, 因为它根本就不需要 CHS 的概念.

DAP 的结构如下:

struct DiskAddressPacket

{

BYTE PacketSize; // 数据包尺寸(16字节)

BYTE Reserved; // ==0

WORD BlockCount; // 要传输的数据块个数(以扇区为单位)

DWORD BufferAddr; // 传输缓冲地址(segment:offset)

45

QWORD BlockNum; // 磁盘起始绝对块地址

};

PacketSize 保存了 DAP 结构的尺寸, 以便将来对其进行扩充. 在目前使用的扩展 Int13H 版本

中 PacketSize 恒等于 16. 如果它小于16, 扩展 Int13H 将返回错误码( AH=01, CF=1 ).

BlockCount 对于输入来说是需要传输的数据块总数, 对于输出来说 是实际传输的数据块个数.

BlockCount = 0 表示不传输任何数据块. BufferAddr 是传输数据缓冲区的 32 位地址 (段地址:

偏移量). 数据缓冲区必须位于常规内存以内(1M). BlockNum 表示的是从磁盘开始算起的绝对块

地址(以扇区为单位), 与分区无关. 第一个块地址为 0. 一般来说, BlockNum 与 CHS 地址的关

系是: BlockNum = cylinder * NumberOfHeads + head * SectorsPerTrack + sector - 1; 其中 cylinder,

head, sector 是 CHS 地址, NumberOfHeads 是磁盘 的磁头数, SectorsPerTrack 是磁盘每磁道的

扇区数. 也就是说 BlockNum 是沿着 扇区->磁道->柱面 的顺序记数的. 这一顺 序是由磁盘控

制器虚拟的, 磁盘表面数据块的实际排列顺序可能与此不同 (如为了提高磁盘速度而设置的间

隔因子将会打乱扇区的排列顺序).

3. 驱动器参数数据包 Drive Parameters Packet

驱动器参数数据包是在扩展 Int13H 的取得驱动器参数子功能调用中 使用的数据包. 格式如下:

struct DriveParametersPacket

{

WORD InfoSize; // 数据包尺寸 (26 字节)

WORD Flags; // 信息标志

DWORD Cylinders; // 磁盘柱面数

DWORD Heads; // 磁盘磁头数

DWORD SectorsPerTrack; // 每磁道扇区数

QWORD Sectors; // 磁盘总扇区数

WORD SectorSize; // 扇区尺寸 (以字节为单位)

};

信息标志用于返回磁盘的附加信息, 每一位的定义如下:

0 位:

0 = 可能发生 DMA 边界错误

1 = DMA 边界错误将被透明处理

如果这位置 1, 表示 BIOS 将自动处理 DMA 边界错误, 也就是说

错误代码 09H 永远也不会出现.

1 位:

0 = 未提供 CHS 信息

1 = CHS 信息合法

如果块设备的传统 CHS 几何信息不适当的话, 该位将置 0.

2 位:

0 = 驱动器不可移动

1 = 驱动器可移动

3 位: 表示该驱动器是否支持写入时校验.

4 位:

0 = 驱动器不具备介质更换检测线

1 = 驱动器具备介质更换检测线

5 位:

0 = 驱动器不可锁定

46

1 = 驱动器可以锁定

要存取驱动器号大于 0x80 的可移动驱动器, 该位必须置 1

(某些驱动器号为 0 到 0x7F 的设备也需要置位)

6 位:

0 = CHS 值是当前存储介质的值 (仅对于可移动介质), 如果

驱动器中有存储介质, CHS 值将被返回.

1 = CHS 值是驱动器支持的最大值 (此时驱动器中没有介质).

7 - 15 位: 保留, 必须置 0.

三. 接口规范

1. 寄存器约定

在扩展 Int13H 调用中一般使用如下寄存器约定:

ds:di ==> 磁盘地址数据包( disk address packet )

dl ==> 驱动器号

ah ==> 功能代码 / 返回码

在基本 Int13H 调用中, 0 - 0x7F 之间的驱动器号代表可移动驱动器 0x80 - 0xFF 之间的驱动器

号代表固定驱动器. 但在扩展 Int13H 调用中 0x80 - 0xFF 之间还包括一些新出现的可移动驱动

器, 比如活动硬盘等. 这些驱动器支持先进的锁定,解锁等功能. ah 返回的错误码除了标准

Int13H 调用规定的基本错误码以外,又增加了以下错误码:

B0h 驱动器中的介质未被锁定

B1h 驱动器中的介质已经锁定

B2h 介质是可移动的

B3h 介质正在被使用

B4h 锁定记数溢出

B5h 合法的弹出请求失败

2. API 子集介绍

1.x 版的扩展 Int13H 调用中规定了两个主要的 API 子集. 第一个子集提供了访问大硬盘所必

须的功能, 包括 检查扩展 In13H 是否存在( 41h ), 扩展读( 42h ), 扩展写( 43h ), 校验扇区

( 44h ), 扩展定位( 47h ) 和 取得驱动器参数( 48h ). 第二个子集提供了对软件控制驱动器锁定和

弹出的支持, 包括 检查扩展Int13H 是否存在( 41h ), 锁定/解锁驱动器( 45h ), 弹出驱动器( 46h ),

取得驱动器参数( 48h ), 取得扩展驱动器改变状态( 49h ), int 15h. 如果使用了调用规范中不支持

的功能, BIOS 将返回错误码 ah = 01h, CF = 1.

3. API 详解

1) 检验扩展功能是否存在

入口:

AH = 41h

BX = 55AAh

DL = 驱动器号

返回:

CF = 0

AH = 扩展功能的主版本号

AL = 内部使用

BX = AA55h

CX = API 子集支持位图

CF = 1

47

AH = 错误码 01h, 无效命令

这个调用检验对特定的驱动器是否存在扩展功能. 如果进位标志置 1 则此驱动器不支持扩展功

能. 如果进位标志为 0, 同时 BX = AA55h, 则存在扩展功能. 此时 CX 的 0 位表示是否支持

第一个子集, 1位表示是否支持第二个子集.对于 1.x 版的扩展 Int13H 来说, 主版本号 AH = 1.

AL 是副版本号, 但这仅限于 BIOS 内部使用, 任何软件不得检查 AL 的值.

2) 扩展读

入口:

AH = 42h

DL = 驱动器号

DS:DI = 磁盘地址数据包(Disk Address Packet)

返回:

CF = 0, AH = 0 成功

CF = 1, AH = 错误码

这个调用将磁盘上的数据读入内存. 如果出现错误, DAP 的 BlockCount项中则记录了出错前实

际读取的数据块个数.

3) 扩展写

入口:

AH = 43h

AL

0 位 = 0 关闭写校验

1 打开写校验

1 - 7 位保留, 置 0

DL = 驱动器号

DS:DI = 磁盘地址数据包(DAP)

返回:

CF = 0, AH = 0 成功

CF = 1, AH = 错误码

这个调用将内存中的数据写入磁盘. 如果打开了写校验选项, 但 BIOS不支持, 则会返回错误码

AH = 01h, CF = 1. 功能 48h 可以检测BIOS是否支持写校验. 如果出现错误, DAP 的

BlockCount 项中则记录了出错前实际写入的数据块个数.

4) 校验扇区

入口:

AH = 44h

DL = 驱动器号

DS:DI = 磁盘地址数据包(Disk Address Packet)

返回:

CF = 0, AH = 0 成功

CF = 1, AH = 错误码

这个调用校验磁盘数据, 但并不将数据读入内存.如果出现错误, DAP 的BlockCount 项中则记录

了出错前实际校验的数据块个数.

5) 锁定/解锁驱动器

入口:

AH = 45h

AL

48

= 0 锁定驱动器

= 1 驱动器解锁

= 02 返回锁定/解锁状态

= 03h-FFh - 保留

DL = 驱动器号

返回:

CF = 0, AH = 0 成功

CF = 1, AH = 错误码

这个调用用来缩定指定驱动器中的介质. 所有标号大于等于 0x80 的可移动驱动器必须支持这

个功能. 如果在支持可移动驱动器控制功能子集的固定驱动器上使用这个功能调用, 将会成功返

回. 会成功返回. 驱动器必须支持最大255次锁定, 在所有锁定被解锁之前, 不能在物理上 将驱

动器解锁. 解锁一个未锁定的驱动器,将返回错误码 AH= B0h. 如果锁定一个已锁定了255次的

驱动器, 将返回错误码 AH = B4h. 锁定一个没有介质的驱动器是合法的.

6) 弹出可移动驱动器中的介质

入口:

AH = 46h

AL = 0 保留

DL = 驱动器号

返回:

CF = 0, AH = 0 成功

CF = 1, AH = 错误码

这个调用用来弹出指定的可移动驱动器中的介质.

所有标号大于等于 0x80 的可移动驱动器必须支持这个功能. 如果

在支持可移动驱动器控制功能子集的固定驱动器上使用这个功能调用, 将

会返回错误码 AH = B2h (介质不可移动). 如果试图弹出一个被锁定的介质

将返回错误码 AH = B1h (介质被锁定).

如果试图弹出一个没有介质的驱动器, 则返回错误码 Ah = 31h (驱动器

中没有介质).

中没有介质).

如果试图弹出一个未锁定的可移动驱动器中的介质, Int13h会调用 Int15h

(AH = 52h) 来检查弹出请求能否执行. 如果弹出请求被拒绝则返回错误码(同

Int15h). 如果弹出请求被接受,但出现了其他错误, 则返回错误码 AH = B5h.

7) 扩展定位

入口:

AH = 47h

DL = 驱动器号

DS:DI = 磁盘地址数据包(Disk Address Packet)

返回:

CF = 0, AH = 0 成功

CF = 1, AH = 错误码

这个调用将磁头定位到指定扇区.

8) 取得驱动器参数

入口:

AH = 48h

49

DL = 驱动器号

DS:DI = 返回数据缓冲区地址

返回:

CF = 0, AH = 0 成功

DS:DI 驱动器参数数据包地址, (参见前面的文章)

CF = 1, AH = 错误码

这个调用返回指定驱动器的参数.

9) 取得扩展驱动器介质更换检测线状态

入口:

AH = 49h

DL = 驱动器号

返回:

CF = 0, AH = 0 介质未更换

CF = 1, AH = 06h 介质可能已更换

这个调用返回指定驱动器的介质更换状态.

这个调用与 Int13h AH = 16h 子功能调用相同, 只是允许任何驱动器标号. 如果对一台支持可移

动介质功能子集的固定驱动器使用此功能,则永远返回 CF = 0, AH = 0. 简单地将可移动介质锁

定再解锁就可以激活检测线, 而无须真正更换介质.

10) Int 15h 可移动介质弹出支持

入口:

AH = 52h

DL = 驱动器号

返回:

CF = 0, AH = 0 弹出请求可能可以执行

CF = 1, AH = 错误码 B1h 或 B3h 弹出请求不能执行

这个调用是由 Int13h AH=46h 弹出介质功能调用内部使用的.

50


本文标签: 文件分区扇区引导磁盘