Win98内核分析(Kernel32)

/ns/wz/sys/data/20020807010744.htm

Win98内核分析(Kernel32)


作者:不详
IBMBIO各模块的介绍。

一、环境管理块emb
要读入EMB,可使用INT 21 的52H号功能。调用该中断后,EMB的地址会放在ES:BX
中。具体用法如下:
C:\>debug
-a
0F6C:0100 mov ah,52
0F6C:0102 int 21
0F6C:0104 int 3
0F6C:0105
-g=0100 0104 //运行100至104的命令
AX=5200 BX=0026 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000
DS=0F6C ES=00C9 SS=0F6C CS=0F6C IP=0104 NV UP EI PL NZ NA PO NC
0F6C:0104 CC INT 3
-d00c9:0024 //显示EMB的内容
00C9:0020 11 02 46 13-C9 00 CC 00 C9 00 4C 00 ..F...
....L.
00C9:0030 70 00 16 00 70 00 00 02-6D 00 C9 00 00 00 97 D5 p...p...m.
第一个MCB地址 0211:0000
FILES运行环境链链头地址 00C9:00CC
当前标准输入设备标题首址 0070:0016
BUFFERS运行环境链链头地址 00C9:006D
FCBS运行环境链头地址 D2E7:0000
逻辑驱动器号 05
设备驱动程序链头地址 D181:0000
DPT链头地址 00C9:1346
当前时钟设备标题首址 0070:004C
每个缓冲区字节数 0200
磁盘路径表(DPAT)首址 D597:0000
DOS不能自动关闭的FCB数目 0000
最末驱动器号 1A

......
00C9:0040 00 00 E7 D2 00 00 05 1A-00 00 81 D1 04 80 CD 0D ..........
......
(从0024读起是为了读入MCB的地址)二、磁盘参数表DPT和磁盘路径表DPAT
1.磁盘参数表DPT
由EMB的表格知道DPT链头地址为00C9:1346,根据该地址可读出DPT的内容如下代
码:

// 0 1 2 3 4 5 6 7 8 9 A B C D E F
-d00c9:1346
00C9:1340 00 00-00 02 FE 00 01 00 02 40 ....
.....@
00C9:1350 00 09 00 60 01 02 00 05-00 5E 00 70 00 00 80 83 ...`.....
^.p....
00C9:1360 13 C9 00 00 00 FF FF FF-FF 89 1E EC 18 2E 8C 09 ..........
......
-d00c9:1383
00C9:1380 01 01 00 02 FE-00 01 00 02 40 00 09 00 .......
..@...
00C9:1390 60 01 02 00 05 00 5E 00-70 00 00 80 C0 13 C9 00 `.....^.p.
......
00C9:13A0 00 00 FF FF FF FF 35 80-3F 0E 74 0A 09 00 00 00 ......5.?.
t.....
-d00c9:13c0
00C9:13C0 02 02 00 02 1F 05 01 00-02 00 02 01 02 2E EF F0 ..........
......
00C9:13D0 00 E1 01 5E 00 70 00 F8-00 FD 13 C9 00 02 00 FF ...^.p....
......
00C9:13E0 FF FF FF 00 1A 72 0D 06-2E 01 02 00 00 2E EF 00 .....r....
......-d00c9:13fd
00C9:13F0 03 03 00
...
00C9:1400 02 3F 06 01 00 02 00 02-01 02 37 EF F0 00 E1 01 .?........
7.....
00C9:1410 5E 00 70 00 F8 00 3A 14-C9 00 00 00 FF FF FF FF ^.p...:...
......
-d00c9:143a
00C9:1430 04 04 00 02 1F 05
......
00C9:1440 01 00 02 00 02 01 02 2E-EF F0 00 E1 01 5E 00 70 ..........
...^.p
00C9:1450 00 F8 00 00 00 6E 06 00-00 FF FF FF FF CD 17 C3 .....n....
......
-d066e:0000
066E:0000 06 06 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ..........
......
066E:0010 00 00 00 00 00 6A 06 00-00 FF FF FF FF 00 00 00 .....j....
......
066E:0020 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ..........
......
066E:0030 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ..........
......
066E:0040 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ..........
......


现在把上面有阴影的代码按从左到右,从上到下的顺序读出其中的具体内容:


00 相同设备的BPB序号为0
00 本DPT对应的逻辑驱动器号为0
00 02 每扇区字节数为0200,即512个字节
FE 每簇扇区数,当前A盘不用,该数据项无效
00 每簇扇区数对2的对数,当前A盘不用,该数据项无效
01 00 保留扇区数为1
02 FAT个数为2
40 00 根目录项数为40H个
09 00 文件区起始扇区号为0009
60 01 文件区占用簇数为0160H
02 每个FAT占用扇区数为2
00 05 目录区起始扇区号为0500
00 5E 00 70 相应设备驱动程序设备标题指针为7000:5E00
80 介质描述字节,当前A盘不用,该数据项无效
00 该DPT使用标志,当前A盘不用,该数据项无效
83 13 C9 00 下一个DPT指针为00C9:1383
00 00 当前目录的首簇号为0000,
FF FF FF FF 空簇数

01 相同设备的BPB序号为1
01 本DPT对应的逻辑驱动器号为1
00 02 每扇区字节数为0200,即512个字节
FE 每簇扇区数,当前B盘不用,该数据项无效
00 每簇扇区数对2的对数,当前B盘不用,该数据项无效
01 00 保留扇区数为1
02 FAT个数为2
40 00 根目录项数为40H个
09 00 文件区起始扇区号为0009
60 01 文件区占用簇数为0160H
02 每个FAT占用扇区数为2
00 05 目录区起始扇区号为0500
00 5E 00 70 相应设备驱动程序设备标题指针为7000:5E00
80 介质描述字节,当前B盘不用,该数据项无效
00 该DPT使用标志,当前B盘不用,该数据项无效
C0 13 C9 00 下一个DPT指针为00C9:13C0
00 00 当前目录的首簇号为0000,
FF FF FF FF 空簇数

02 相同设备的BPB序号为2
02 本DPT对应的逻辑驱动器号为2
00 02 每扇区字节数为0200,即512个字节
1F 每簇扇区数为20H (每簇有32个扇区)
05 每簇扇区数对2的对数为5 (32为2的5次方)
01 00 保留扇区数为1
02 FAT个数为2
00 02 根目录项数为200H个
01 02 文件区起始扇区号为0201
2E EF 文件区占用簇数为EF2EH
F0 每个FAT占用扇区数为F0H
00 E1: 目录区起始扇区号为E100H
01 5E 00 70 相应设备驱动程序设备标题指针为7000:5E01
F8 介质描述字节为F8,表示硬盘
00 该DPT 使用标志为00,正在使用
C0 13 C9 00 下一个DPT指针为00C9:13FD
02 00 当前目录的首簇号为0200H
FF FF FF FF 空簇数

03 相同设备的BPB序号为3
03 本DPT对应的逻辑驱动器号为3
00 02 每扇区字节数为0200,即512个字节
3F 每簇扇区数为40H (每簇有64个扇区)
06 每簇扇区数对2的对数为6 (64为2的6次方)
01 00 保留扇区数为1
02 FAT个数为2
00 02 根目录项数为200H个
01 02 文件区起始扇区号为0201
37 EF 文件区占用簇数为EF37H
F0 每个FAT占用扇区数为F0H
00 E1: 目录区起始扇区号为E100H
01 5E 00 70 相应设备驱动程序设备标题指针为7000:5E01
F8 介质描述字节为F8,表示硬盘
00 该DPT 使用标志为00,正在使用
3A 14 C9 00 下一个DPT指针为00C9:143A
00 00 当前目录的首簇号为0000,即根目录
FF FF FF FF 空簇数

04 相同设备的BPB序号为4
04 本DPT对应的逻辑驱动器号为4
00 02 每扇区字节数为0200,即512个字节
1F 每簇扇区数为20H (每簇有32个扇区)
05 每簇扇区数对2的对数为5 (32为2的5次方)
01 00 保留扇区数为1
02 FAT个数为2
00 02 根目录项数为200H个
01 02 文件区起始扇区号为0201
2E EF 文件区占用簇数为EF2EH
F0 每个FAT占用扇区数为F0H
00 E1: 目录区起始扇区号为E100H
01 5E 00 70 相应设备驱动程序设备标题指针为7000:5E01
F8 介质描述字节为F8,表示硬盘
00 该DPT 使用标志为00,正在使用
00 00 6E 06 下一个DPT指针为066E:0000
00 00 当前目录的首簇号为0000,即根目录
FF FF FF FF 空簇数

后面的代码内容都差不多,就不在赘述了
分析:
1) 与DOS旧版本来说,WIN98的DPT内数据项的偏移有所不同,从介质描述字节项开
始,后面数据项的偏移都下移一位,即介质描述字节偏移为17H,DPT使用标志偏移
为18H等等。
2) 由于没有使用A、B盘,所以A、B盘对应的DPT里面的一些数据项的内容会表现的
不合理。
3) 对于C、D、E盘来说,由于保留扇区数为1,而根目录项占用了200H个扇区,所
以文件区起始扇区为0201H,即文件区起始扇区号值包含了引导记录、FAT表和根目
录所占用的扇区总数。
4) 由于C、D、E盘都为硬盘,所以相应设备驱动程序设备标题指针都相同,都是硬
盘驱动程序设备标题指针。

2.磁盘路径参数表DPAT
由EMB的表格知道DPT链头地址为00C9:1346,根据该地址可读出DPT的内容如下代
码:
// 0 1 2 3 4 5 6 7 8 9 A B C D E F
-dd597:0000
D597:0000 41 3A 5C 00 00 00 00 00-00 00 00 00 00 00 00 00 A:\.......
......
D597:0010 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ..........
......
D597:0020 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ..........
......
D597:0030 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ..........
......
D597:0040 00 00 00 00 40 46 13 C9-00 FF FF FF FF B2 6E 02 ....@F....
....n.
D597:0050 00 00 C0 0A 81 D1 00 00-42 3A 5C 00 00 00 00 00 ........B:
\.....
D597:0060 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ..........
......
D597:0070 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ..........
......
D597:0080 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ..........
......
D597:0090 00 00 00 00 00 00 00 00-00 00 00 00 40 83 13 C9 ..........
..@...
D597:00A0 00 FF FF FF FF FF FF 02-00 00 00 00 00 00 00 00 ..........
......
D597:00B0 43 3A 5C 00 57 49 4E 39-38 00 20 46 49 4C 45 53 C:\.WIN98.
FILES
D597:00C0 5C 4D 53 49 5C 53 4F 46-54 43 4F 4F 4C 45 52 00
\MSI\SOFTCOOLER.
D597:00D0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ..........
......
D597:00E0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ..........
......
D597:00F0 00 00 00 00 40 C0 13 C9-00 FF FF FF FF B2 6E 02 ....@.....
....n.
D597:0100 00 00 C0 0A 81 D1 00 00-44 3A 5C 00 00 00 00 00 ........D:
\.....
D597:0110 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ..........
......
D597:0120 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ..........
......
D597:0130 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ..........
......
D597:0140 00 00 00 00 00 00 00 00-00 00 00 00 40 FD 13 C9 ..........
..@...
D597:0150 00 FF FF FF FF B2 6E 02-00 00 C0 0A 81 D1 00 00 ......n...
......
D597:0160 45 3A 5C 00 00 00 00 00-00 00 00 00 00 00 00 00 E:\.......
......
D597:0170 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ..........
......
D597:0180 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ..........
......
D597:0190 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ..........
......
D597:01A0 00 00 00 00 40 3A 14 C9-00 FF FF FF FF B2 6E 02 ....@:....
....n.
D597:01B0 00 00 C0 0A 81 D1 00 00-46 3A 5C 00 00 00 00 00 ........F:
\.....
D597:01C0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ..........
......
D597:01D0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ..........
......
D597:01E0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ..........
......
D597:01F0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ..........
......
D835:0200 00 FF FF FF FF FF FF 02-00 00 00 00 00 00 00 00 ..........
......
D835:0210 47 3A 5C 00 00 00 00 00-00 00 00 00 00 00 00 00 G:\.......
......
D835:0220 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ..........
......
D835:0230 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ..........
......
D835:0240 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ..........
......
D835:0250 00 00 00 00 40 00 00 6E-06 FF FF FF FF B2 6E 02 ....@..n..
....n.
D835:0260 00 00 C0 0A 81 D1 00 00-48 3A 5C 00 00 00 00 00 ........H:
\.....

由上述代码读出带阴影部分,得到如下表格:

41 3A 5C 表示目录路径区为A:\
46 13 C9 00 相应DPT地址为00C9:1346
42 3A 5C 表示目录路径区为B:\
83 13 C9 00 相应DPT地址为00C9:1383
43 3A 5C 00 57 49 4E 39-38 00 20 46 49 4C 45 53 5C 4D 53 49 5C 53 4F
46-54 43 4F 4F 4C 45 52: 表示目录路径区为C:\.WIN98. FILES
\MSI\SOFTCOOLER.
C0 13 C9 00 相应DPT地址为00C9:13C0
44 3A 5C 表示目录路径区为D:\
FD 13 C9 00 相应DPT地址为00C9:13FD
45 3A 5C 表示目录路径区为E:\
3A 14 C9 00 相应DPT地址为00C9:143A
46 3A 5C 表示目录路径区为F:\
47 3A 5C 表示目录路径区为G:\
分析
1) 从上面读出的内容可了解到:硬盘有A、B、C、D、E五个区,其中A、B是默认
设置,而C、D、E是硬盘上的逻辑分区。
2) 这五个区的DPT地址都与DPT表中的地址相符合。而F、G这些不是逻辑分区,所
以在硬盘路径表DPAT中虽然都为这些盘符开设了相应空间,但并没有给出具体内容
。三、句柄参数区HPA和句柄参数表HPT
由EMB表格可读出句柄FILES运行环境链链头地址为00C9:00CC,由此可读出下列
代码:
// 0 1 2 3 4 5 6 7 8 9 A B C D E F
-d00c9:00cc
00C9:00C0 00 00 64 D2
..d.
00C9:00D0 05 00 1C 00 02 00 00 C0-00 28 00 70 00 00 00 2E .........
(.p....
00C9:00E0 4E 91 26 00 00 00 00 00-00 00 00 00 00 00 00 00 N.&.......
......
00C9:00F0 00 00 41 55 58 20 20 20-20 20 20 20 20 28 00 00 ..AUX
(..
00C9:0100 00 00 00 92 84 00 00 00-00 00 00 00 00 54 00 02 ..........
...T..
-dd264:0000
D264:0000 08 00 30 06 23 00 01 00-80 00 20 42 90 01 00 01 ..0.#.....
B....
D264:0010 00 00 00 20 A0 D3 24 EB-EA 01 00 13 1F 00 00 00 ... ..$...
......
D264:0020 00 05 00 00 00 00 20 20-20 20 20 20 20 20 20 20 ......

D264:0030 20 00 00 00 00 01 00 87-08 00 00 00 00 00 00 C0 .........
......
D264:0040 0A 01 00 80 00 20 42 90-01 00 01 00 00 00 20 A0 ..... B...
.... .
D264:0050 D3 24 F0 7D 00 00 10 7C-00 00 00 00 06 00 00 00 .$.}...|..
......
D264:0060 00 20 20 20 20 20 20 20-20 20 20 20 00 00 00 00 .
....
D264:0070 01 00 87 08 00 00 00 00-00 00 C0 0A 01 00 00 00 ..........
......
-d0630:0008
0630:0000 FF FF FF FF 0A 00 00 00 ..
......


我们从上面带阴影的代码可读出HPA的表格

00 00 64 D2 下一个HPA的地址为D264:0000

05 00 本环境拥有文件句柄参数表个数为5,这五个句柄是标准输入设备的HPT、标
准输出设备的HPT、标准错误设备的HPT、标准辅助设备的HPT、标准打印设备的
HPT
08 00 30 06 下一个HPA的地址为0630:0008
23 00 本环境拥有文件句柄参数表个数为23H,即45个
FF FF FF FF 表明本HPA为最后一个HPA
0A 00 本环境拥有文件句柄参数表个数=A-5=5

现在具体分析地址为D264:0000的HPA的第一个HPT,得如下表格:

01 00 标志位,表示句柄打开
80 00 打开方式,以FCB方式打开
20 文件属性字
42 90 设备属性字
01 00 01 00 DPT地址
00 00 起始簇号
20 A0 时间
D3 24 日期
EB EA 01 00 文件长度
13 1F 00 00 读写指针
00 00 磁盘文件所占簇数太大,不表示
05 00 当前簇号
00 00 逻辑扇区号
00 目录项号
20 20 20 20
20 20 20 20
20 20 20 文件名+扩展名,而在这里全为空格,表明这里把本HPT对应的文件的文
件名和扩展名都隐藏起来,在这里不能读出,当在读下面几个HPT都会发现类似情
况,具体见上面的代码的阴影部分

一个有趣的现象:
在WIN98系统默认设置下,句柄参数表个数30个,而不是40个,即在系统文件
CONFIG.SYS中,加入FILES=30和没有加入这一命令语句读出的HPA是一样。
当在CONFIG.SYS中,加入FILES=N
当N=30,即是缺省设置。
当N<30,会读出4个HPA,第一个HPA的HPT的个数为5,第二HPA的HPT的个数为N-5,
第三个HPA 的HPT的个数为30-N,第四HPA的HPT的个数为A
当N>30,会读出3个HPA,第一个HPA的HPT的个数为5,第二HPA的HPT的个数为N-5,
,第三个HPA 的HPT的个数A
举例:
当N=9,即在CONFIG.SYS中加入FILES=40。
9=5+4
当N=40,即在CONFIG.SYS中加入FILES=40。
40=23H+5=35+5
当N=50,即在CONFIG.SYS中加入FILES=50,上面的代码就是加入该语句读出的。
50=2DH+5=45+5
这说明了当N<30,四个HPA中,头一个HPA记录了五个标准设备的HPT,第二个HPA记
录了N-5个HPT,而显然至少需要打开30个HPT才能满足WINDOWS系统的需要,所以第
三个HPA记录了30-N个HPT。而最后一个HPA中的A是一个无用数据(纯属个人观点)

当N>30,三个HPA中,头一个HPA记录了五个标准设备的HPT,中间一个HPA记录了
大部分文件的HPT,而最后一个HPA中的A是一个无用数据

以下是在CONFIG.SYS中加入FILES=9后读出的4个HPA代码:
-d00c9:00cc
00C9:00C0 00 00 64 D2
..d.
00C9:00D0 05 00 1C 00 02 00 00 C0-00 28 00 70 00 00 00 2E .........
(.p....
00C9:00E0 4E 91 26 00 00 00 00 00-00 00 00 00 00 00 00 00 N.&.......
......
00C9:00F0 00 00 41 55 58 20 20 20-20 20 20 20 20 28 00 00 ..AUX
(..
00C9:0100 00 00 00 92 84 00 00 00-00 00 00 00 00 54 00 02 ..........
...T..
-dd264:0000
D264:0000 0C 00 37 06 04 00 01 00-80 00 20 42 90 01 00 01 ..7.......
B....
D264:0010 00 00 00 20 A0 D3 24 EB-EA 01 00 13 1F 00 00 35 ... ..$...
.....5
D264:0020 00 05 00 0D 00 0E 20 20-20 20 20 20 20 20 20 20 ......
D264:0030 20 00 00 00 00 01 00 AC-08 00 00 C4 12 00 00 C0 .........
......
D264:0040 0A 01 00 80 00 20 42 90-01 00 01 00 00 00 20 A0 ..... B...
.... .
D264:0050 D3 24 F0 7D 00 00 10 7C-00 00 35 00 06 00 0D 00 .$.}...|..
5.....
D264:0060 0E 20 20 20 20 20 20 20-20 20 20 20 8F 12 00 00 .
....
D264:0070 01 00 AC 08 00 00 C4 12-00 00 C0 0A 00 00 00 00 ..........
......
-d0637:000c
0637:0000 0C 00 85 06
....
0637:0010 15 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ..........
......
0637:0020 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ..........
......
0637:0030 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ..........
......
0637:0040 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ..........
......
0637:0050 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ..........
......
0637:0060 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ..........
......
0637:0070 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ..........
......
0637:0080 00 00 00 00 00 00 00 00-00 00 00 00 ..........
..
-d0685:000c
0685:0000 FF FF FF FF 0A 00 00 00 ..
......

四、内存控制块MCB
从EMB表格中可读出内存控制块MCB的起始地址为0211:0000,由此读出以下代码:

// 0 1 2 3 4 5 6 7 8 9 A B C D E F
-d0211:0000
0211:0000 4D 08 00 C7 02 00 00 00-53 44 00 00 00 00 00 00 M.......
SD......
-d04d9:0000
04D9:0000 4D 08 00 04 00 4D 4D 00-53 43 3A 20 44 4D 41 20 M....MM.SC:
DMA
-d04de:0000
04DE:0000 4D 2C 05 01 00 33 C0 26-43 4F 4D 4D 41 4E 44 00 M,...3.
&COMMAND.
-d04e0:0000
04E0:0000 4D 02 06 0D 00 4D 50 3D-43 3A 5C 50 57 49 4E 39 M....MP=C:
\PWIN9
-d4ee:0000
04EE:0000 4D EF 04 2D 00 43 41 46-45 53 31 39 33 38 00 41 M..-.
CAFES1938.A
-d051c:0000
051C:0000 4D 2C 05 0E 00 03 01 46-BA B9 02 83 C2 15 C1 EA M,.....F..
......
-d052b:0000
052B:0000 4D 2C 05 D5 00 75 06 2E-57 49 4E 00 01 8B 44 01 M,...u..
WIN...D.
-d0601:0000
0601:0000 4D 02 06 FE 00 00 00 00-76 6D 6D 33 32 00 00 00 M.......
vmm32...
-d0700:0000
0700:0000 4D 11 07 0F 00 B3 F7 0E-9B CE EB 82 CB B3 45 00 M.........
....E.
-d0710:0000
0710:0000 4D 11 07 65 01 CE EB 82-43 4F 4D 4D 41 4E 44 00 M..e....
COMMAND.
-d0876:0000
0876:0000 4D 11 07 59 00 0D 34 BD-8B 1E 31 09 3C 02 74 1F M..Y..4...
1.<.t.
-d8d0:0000
08D0:0000 4D E2 08 10 00 A0 1A 00-8A E0 89 07 1F 07 58 5B M.........
....X[
-d8e1:0000
08E1:0000 5A E2 08 1D 97 8A 33 D2-44 45 42 55 47 00 D1 E9 Z.....3.
DEBUG...

由上面代码的阴影部分得出以下表格:

4D 标记,表示本内存控制块非最后一块
08 00 本内存分配块已分配,该数值表示本内存分配块分配给了系统使用
C7 02 本内存分配块的大小为02C7节(可求得下一个内存分配块地址
=0211+02C7+1=04D9)
4D 标记,表示本内存控制块非最后一块
08 00 本内存分配块已分配,该数值表示本内存分配块分配给了系统使用
04 00 本内存分配块的大小为0004节
(可求得下一个内存分配块地址=04D9+0004+1=04DE)
4D 标记,表示本内存控制块非最后一块
2C 05 本内存分配块已分配
01 00 本内存分配块的大小为0001节
4D 标记,表示本内存控制块非最后一块
2C 06 本内存分配块已分配
0D 00 本内存分配块的大小为000D节
……… ………………
……… ………………
4D 标记,表示本内存控制块非最后一块
2C 05 本内存分配块已分配
2D 00 本内存分配块的大小为000E节
4D 标记,表示本内存控制块非最后一块
2C 05 本内存分配块已分配
D5 00 本内存分配块的大小为00D5节
4D 标记,表示本内存控制块非最后一块
02 06 本内存分配块已分配
FE 00 本内存分配块的大小为00FE节
4D 标记,表示本内存控制块非最后一块
E2 08 本内存分配块已分配
10 00 本内存分配块的大小为0059节
5A 标记,表示本内存控制块为最后一块
E2 08 本内存分配块已分配
1D 97 本内存分配块的大小为971D节


分析:
1、 已知MCB首址,求下一个MCB的地址有两种方法:
一种是:N=现在MCB的地址+1+分配块节数,然后N作为段址,段内偏移为0,可求得
下一个MCB的地址。
另一种是:N=现在MCB的地址*16+1+分配块节数,然后N作为段内偏移,段址相同,
同样可得下一个MCB的地址。(即把现有的地址偏移一位,再与其他数据相加)。

这两种方法求得的地址虽然不同,可读出的内容却一样,这是因为不同的逻辑地址
对应同一物理地址。

由此的如下内存分配图:

第一个MCB

第二个MCB

第三个MCB

第四个MCB

第五个MCB

第六个MCB

第七个MCB

第八个MCB

第九个MCB

第十个MCB

第十一个MCB

第十二个MCB

第十三个MCB

五、BUFFERS运行环境
由EMB表格可读出BUFFERS链的首地址为00C9:006D,由此可读出以下代码:
// 0 1 2 3 4 5 6 7 8 9 A B C D E F
-d00c9:006d
00C9:0060 04 00 96
00C9:0070 04 00 00 00 00 00 00 00-00 01 00 00 B9 04 F4 12
-d0496:0004
0496:0000 04 00 96 04-FF 00 FF FF FF FF B8 00 ......
......
0496:0010 6C CD 21 0F 82 07 00 8B-D8 B4 3E CD 21 F8 58 59 l.!.......
<font class=col36>&gt;.!.XY
</font>
从上面代码可看出,在 WIN98下只有两个缓冲区,这显然是不对,所以WIN98的
BUFFERS链不能这样读出,我们只能从MSDOS6.22或WIN98的MS-DOS方式下读出
BUFFERS链,如下代码:

-d00c9:006d
00C9:0060 58 34 D7
(0.
00C9:0070 26 02 00 00 00 00 00 00-00 00 00 00 00 00 F4 12 &.........
......
-d26d7:3458
26D7:3450 88 38 f0 14 02 04 F2 9B ..
.8....
26D7:3460 08 00 01 00 00 00 00 C0-13 C9 00 00 00 00 00 00 ..........
......
-d26d7:3888
26D7:3880 18 20 58 34 02 04 F1 9B
X4.!....
26D7:3890 08 00 01 00 00 00 00 C0-13 C9 00 00 07 00 4E 61 ..........
....Na
-d26d7:2018
26D7:2010 30 04 88 38 72 00 00 00
w%..r...
26D7:2020 41 72 00 77 00 75 00 6E-00 69 00 0F 00 26 6E 00 Ar.w.u.n.
i...&n.
-d26d7:0430
26D7:0430 70 36 18 20 02 04 18 24-09 00 01 00 00 00 00 C0 p6.C...$..
......
26D7:0440 13 C9 00 FF 0A 00 0A 00-45 47 41 20 20 20 20 20 ........EGA

-d26d7:3670
26D7:3670 48 06 30 04 02 04 19 24-09 00 01 00 00 00 00 C0 0G0....$..
......
26D7:3680 13 C9 00 11 C8 11 2A 12-58 43 4F 50 59 33 32 20 ......*.
XCOPY32
-d26d7:0648
26D7:0640 A8 51 70 36 02 08 1A 55 ..
.Q...U
26D7:0650 05 00 01 00 00 00 00 C0-13 C9 00 79 73 63 6C 61 ..........
.yscla
-d26d7:51a8
26D7:51A0 48 06 38 1B 02 02 2B 00 H.
8...+.
26D7:51B0 00 00 02 FA 00 00 00 C0-13 C9 00 C7 03 00 00 00 ..........
......
-d26d7:1b38
26D7:1B30 98 23 A8 51 02 08 3D 55 .
Q`K..=U
26D7:1B40 05 00 01 00 00 00 00 C0-13 C9 00 CC BF D8 D6 C6 ..........
......
-d26d7:2398
26D7:2390 08 17 38 1B 02 42 01 00 .
...B..
26D7:23A0 00 00 02 FA 00 00 00 C0-13 C9 00 4E 6F 72 74 6F ..........
.Norto
-d26d7:1708
26D7:1700 20 19 98 23 02 48 A2 1F
(0 ..H..
26D7:1710 00 00 01 00 00 00 00 C0-13 C9 00 E0 00 4E 00 19 ..........
...N..
-d26d7:1920
26D7:1920 28 30 08 17 02 08 F5 1E-00 00 01 00 00 00 00 C0 ...#......
......
26D7:1930 13 C9 00 FF FF FF FF 00-64 20 30 30 63 39 3A 30 ........d
00c9:0
-d26d7:3028
26D7:3020 90 4F 20 19 02 04 DE 9B .
O......
26D7:3030 08 00 01 00 00 00 00 C0-13 C9 00 00 00 00 00 00 ..........
......

-d26d7:4f90
26D7:4F90 E0 29 28 30 02 04 DF 9B-08 00 01 00 00 00 00 C0 .)(0......
......
26D7:4FA0 13 C9 00 00 00 D8 C4 21-57 45 4C 43 4F 4D 45 20 .......
!WELCOME
-d26d7:29e0
26D7:29E0 60 08 90 4F 02 04 E0 9B-08 00 01 00 00 00 00 C0 `..O......
......
26D7:29F0 13 C9 00 00 00 00 00 00-4F 44 42 43 49 4E 53 54 ........
ODBCINST
-d26d7:0860
26D7:0860 90 0C E0 29 02 04 E1 9B-08 00 01 00 00 00 00 C0 ...)......
......
26D7:0870 13 C9 00 FF FF FF 00 00-51 54 57 20 20 20 20 20 ........QTW

-d26d7:0c90
26D7:0C90 78 0A 60 08 02 04 E2 9B-08 00 01 00 00 00 00 C0 x.`.......
......
26D7:0CA0 13 C9 00 53 65 63 74 69-50 52 4F 47 4D 41 4E 20 ...
SectiPROGMAN
-d26d7:0a78
26D7:0A70 A8 0E 90 0C 02 04 E3 9B ..
......
26D7:0A80 08 00 01 00 00 00 00 C0-13 C9 00 FF FF FF FF 0E ..........
......
-d26d7:0ea8
26D7:0EA0 D8 12 78 0A 02 04 E4 9B ..
x.....
26D7:0EB0 08 00 01 00 00 00 00 C0-13 C9 00 49 53 50 2E 49 ..........
.ISP.I
-d26d7:12d8
26D7:12D0 50 1D A8 0E 02 04 E5 9B P.
......
26D7:12E0 08 00 01 00 00 00 00 C0-13 C9 00 31 39 39 37 01 ..........
.1997.
-d26d7:1d50
26D7:1D50 68 1F D8 12 02 04 E6 9B-08 00 01 00 00 00 00 C0 h.........
......
26D7:1D60 13 C9 00 00 00 0A 00 D3-49 4E 54 45 52 4E 7E 31 ........
INTERN~1
-d26d7:1f68
26D7:1F60 A0 3A 50 1D 02 04 E7 9B .:
P.....
26D7:1F70 08 00 01 00 00 00 00 C0-13 C9 00 73 EA 00 00 00 ..........
.s....
-d26d7:3aa0
26D7:3AA0 00 00 68 1F 02 04 E8 9B-08 00 01 00 00 00 00 C0 ..h.......
......
26D7:3AB0 13 C9 00 FF 04 00 29 00-41 63 00 64 00 33 00 32 ......).
Ac.d.3.2
-d26d7:0000
26D7:0000 C0 10 A0 3A 02 04 E9 9B-08 00 01 00 00 00 00 C0 ...:......
......
26D7:0010 13 C9 00 00 4E 00 98 00-41 6F 00 75 00 74 00 6C ....N...
Ao.u.t.l
-d26d7:10c0
26D7:10C0 B8 3C 00 00 02 04 EA 9B-08 00 01 00 00 00 00 C0 .&lt;........
......
26D7:10D0 13 C9 00 47 41 01 00 00-4E 45 54 53 43 41 50 45 ...GA...
NETSCAPE
-d26d7:3cb8
26D7:3CB0 D0 3E C0 10 02 04 EB 9B .
<font class=col36>&gt;......
</font>26D7:3CC0 08 00 01 00 00 00 00 C0-13 C9 00 00 FF FF FF FF ..........
......
-d26d7:3ed0
26D7:3ED0 18 45 B8 3C 02 04 EC 9B-08 00 01 00 00 00 00 C0 .E.&lt;......
......
26D7:3EE0 13 C9 00 2C 45 30 30 30-42 54 54 4E 43 55 52 20 ...,
E000BTTNCUR


-d26d7:4518
26D7:4510 48 49 D0 3E 02 04 ED 9B
HI.&gt;....
26D7:4520 08 00 01 00 00 00 00 C0-13 C9 00 35 39 33 63 70 ..........
.593cp
-d26d7:4948
26D7:4940 E8 40 18 45 02 04 EE 9B ..
.E....
26D7:4950 08 00 01 00 00 00 00 C0-13 C9 00 08 00 06 00 30 ..........
.....0
-d26d7:40e8
26D7:40E0 00 43 48 49 02 04 16 24 .
C.%...$
26D7:40F0 09 00 01 00 00 00 00 C0-13 C9 00 58 45 00 04 00 ..........
.XE...
-d26d7:4300
26D7:4300 F8 2B E8 40 02 04 17 24-09 00 01 00 00 00 00 C0 0..@...$..
......
26D7:4310 13 C9 00 50 00 17 00 00-43 53 45 54 55 50 20 20 ...P....
CSETUP
-d26d7:2bf8
26D7:2BF0 78 4D 00 43 02 04 F4 9B
xM......
26D7:2C00 08 00 01 00 00 00 00 C0-13 C9 00 00 00 00 00 00 ..........
......
-d26d7:4d78
26D7:4D70 30 47 F8 2B 02 04 F5 9B .
%.+....
26D7:4D80 08 00 01 00 00 00 00 C0-13 C9 00 F7 BF 10 E4 07 ..........
......
-d26d7:4730
26D7:4730 40 32 78 4D 02 02 45 00-00 00 02 FA 00 00 00 C0 @2p6..E...
......
26D7:4740 13 C9 00 01 00 00 00 FF-01 44 02 44 03 44 04 44 .........
D.D.D.D
-d26d7:3240
26D7:3240 C8 27 30 47 02 04 F5 01-00 00 01 00 00 00 00 C0 .'0G......
......
26D7:3250 13 C9 00 00 00 00 00 00-4D 53 44 4F 53 20 20 20 ........
MSDOS
-d26d7:27c8
26D7:27C0 60 4B 40 32 02 02 4A 00
`K@2..J.
26D7:27D0 00 00 02 FA 00 00 00 C0-13 C9 00 00 00 00 00 00 ..........
......
-d26d7:4b60
26D7:4B60 80 21 C8 27 02 04 D5 9B-08 00 01 00 00 00 00 C0 8..'......
......
26D7:4B70 13 C9 00 32 31 D3 A1 B6-2E 20 20 20 20 20 20 20 ...21....

-d26d7:2180
26D7:2180 10 2E 60 4B 02 04 F0 9B-08 00 01 00 00 00 00 C0 .8........
......
26D7:2190 13 C9 00 48 00 00 00 0E-41 53 00 74 00 75 00 64 ...H....
AS.t.u.d
-d26d7:2e10
26D7:2E10 B0 25 80 21 02 04 EF 9B-08 00 01 00 00 00 00 C0 .!HI......
......
26D7:2E20 13 C9 00 00 00 00 00 00-55 4E 45 4E 43 39 37 20 ........
UNENC97
-d26d7:25b0
26D7:25B0 F0 14 10 2E 02 04 F6 9B-08 00 01 00 00 00 00 C0 .@xM......
......
26D7:25C0 13 C9 00 65 CF 07 03 00-E5 50 53 35 33 33 33 20 ...e.....
PS5333
-d26d7:14f0
26D7:14F0 58 34 B0 25 02 04 15 24-09 00 01 00 00 00 00 C0 .#H....$..
......
26D7:1500 13 C9 00 64 61 72 64 20-2E 20 20 20 20 20 20 20 ...dard .


分析:从上面代码我们可了解到
1、 首先,由EMB表格中得到BUFFER区的首地址指针为00c9:006d
2、 其次,从读出代码看出,所有的BUFFER都在同一段内,即段地址相同。所以后
面的BUFFER只需给出下一个BUFFERS的偏移地址就可找到下一个BUFFER。
3、 从BUFFER头的具体内容可看到,在BUFFER的头四个字节中,前两个字节指出了
下一个BUFFER的偏移地址,而后两个字节指出了前一个BUFFER的偏移地址,从而构
成了一个双向链表。同时,第一个BUFFER的后两个字节指向了最后一个BUFFER,而
最后一个BUFFER的前两个字节也指向了第一个BUFFER,从而形成了一个循环链表。
可见BUFFERS是一个循环双向链表。

六、硬盘分区表
我们知道硬盘分区表是放在硬盘的隐含扇区中,所以需用INT 13H来读出。当读出
分区BOOT程序后,只要偏移1BE,就可读出硬盘分区表,如下代码:
-d0f6c:31be
0F6C:31B0 80 01
..
0F6C:31C0 01 00 06 FE 3F 79 3F 00-00 00 BB E7 1D 00 00 00 ....?y?...
......
0F6C:31D0 01 7A 05 FE BF 6D FA E7-1D 00 F4 90 7A 00 00 00 .z...m....
..z...
0F6C:31E0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ..........
......
0F6C:31F0 00 00 00 00 00 00 00 00-00 00 00 00 00 00 55 AA ..........
....U.
0F6C:3200 8C 08 26 C6 06 8E 08 FF-26 A2 C1 08 FC B9 10 00 ..&.....&.
......
0F6C:3210 BF 8F 08 F3 AA B9 10 00-BF 9F 08 F3 AB 07 5F 59 ..........
...._Y

从上面有阴影的代码可得到如下表格:

80 自举分区标志
01 01 00 分区1开始于1头0柱1扇区
06 系统标志,表示FAT为16位大容量的DOS
FE 3F 79 分区1结束于FE头79柱3F扇区
3F 00 00 00 分区1的相对扇区号为3F
BB E7 1D 00 分区1的扇区数为001D E7BB个 (可求得分区1的容量=1DE7BB *
200 ≈ 1GB)
00 非自举分区标志
00 01 7A 分区2开始于0头7A柱1扇区
05 系统标志,表示扩展D0S
FE BF 6D 分区2结束于FE头6D柱BF扇区
FA E7-1D 00 分区2的相对扇区号为001D E7FA (注意:1DE7FA=1DE7BB+3F)
F4 90 7A 00 分区2的扇区数为007A 90F4个 (可求得分区2的容量=7A90F4 *
200 ≈ 4GB)
55 AA 主引导记录有效标志为AA55,表示有效

分析:
1、从上面读出的硬盘分区内容可了解到,在WINDOWS系统中,通常分为两个分区,
一个为自举分区,它为系统区,即C盘。另一个为扩展分区,扩展分区包括所有的
逻辑分区,而逻辑分区的具体内容并不在上面的硬盘分区表中显示,我们可从前面
的磁盘参数表DPT和磁盘路径表中读出逻辑分区的具体内容。
2、 分区1的相对扇区号正是隐含扇区占用的扇区数,而分区2的相对扇区号恰是分
区1的分区大小加上隐含扇区的大小。这在上面表格中可看出。

七、驱动参数块DPB
使用第一章介绍的命令,我们可读出以下代码:-l 0f6e:1000 2 0 1

// 0 1 2 3 4 5 6 7 8 9 A B C D E F
-d00c9:0024
-d0f6e:1000
0F6E:1000 EB 3C 90 4D 53 57 49 4E-34 2E 31 00 02 20 01 00 .&lt;.MSWIN4.
1.. ..
0F6E:1010 02 00 02 00 00 F8 F0 00-3F 00 FF 00 3F 00 00 00 ........?.
..?...
0F6E:1020 BB E7 1D 00 80 00 29 5D-A3 59 25 20 20 20 20 20 ......)].
Y%

由带阴影部分的代码,我们可得到以下表格:

4D 53 57 49 4E 34 2E 31 当前操作系统的版本号MSWIN4.1
00 02 每扇区字节数为200H,即512字节
20 每簇扇区数为20H,即32个扇区
01 00 保留扇区数为1
02 FAT个数为2
00 02 根目录项数为200H,即512项
00 00 总扇区数,这里因数目过大在后面表示
F8 介质描述字节
F0 00 每个FAT占用的扇区数为0FH
3F 00 每道扇区数为3F
FF 00 磁头数为FFH,共255个磁头
3F 00 00 00 隐含扇区数为3FH
BB E7 1D 00 总扇区数为1DBBE7

分析:
1、 上面表格的第一项并不属于DPB,但从中可读出当前操作系统的版本号,若操
作系统为MSDOS,就会显示DOS的版本号,若为WINDOWS,则显示WINDOWS的版本号。
WIN98对应的版本号为MSWIN4.1。当你运行WIN98附件中的系统工具的系统信息可同
样读出系统信息:Microsoft Windows 98 4.10.1998。
2、 在高版本的操作系统中,由于硬盘容量太大,两个字节不能表示,通常在隐含
扇区数后4个字节记录总扇区数。从表格的最后一项可读出该总扇区数也就是C盘的
扇区数(参考前面硬盘分区表中的分区1的数据)。这是因为当前读出的DPB是C盘
对应的DPB。也可以另外读出D、E盘的DPB。