《复合文档的二进制存储格式.docx》由会员分享,可在线阅读,更多相关《复合文档的二进制存储格式.docx(8页珍藏版)》请在三一办公上搜索。
1、复合文档的二进制存储格式研究(word,xls,ppt.)复合文档(Compound Document)是一种不仅包含文本而且包括图形、电子表格数据、声音、视频图象以及其它信息的文档。可以 把复合文档想象成一个所有者,它装着文本、图形以及多媒体信息如声音和图象。目前建立复合文档的趋势是使用面向对象技术,在这里, 非标准信息如图像和声音可以作为独立的、自包含式对象包含在文档中。Microsoft Windows就是使用这种技术,叫做“OLE2 storage file format” 或 “Microsoft Office compatible storage file format”。当然Ex
2、cel、Word等都是用这种格式存储的。本文主要研究复合文档的二进制结构。目录第一章仓库与流(Storages and Streams)第二章 扇区与扇区链(Sectors and Sector Chains)第三章复合文档头(C ompound Document Header)第四章扇区配置(Sector Allocation)第五章短流(Short-Streams)第六章目录(Directory)第七章Excel文件实例剖析第一章仓库与流复合文档的原理就像一个文件系统(文件系统:如FAT与NTFS)。复合文档将数据分成许多流(Streams),这些流又存储在不同 的仓库(Storages)
3、里。将复合文档想象成你的D盘,D盘用的是NTFS(NT File System)格式,流就相当于D盘里的文件,仓库就相 当于D盘里的文件夹。流和仓库的命名规则与文件系统相似,同一个仓库下的流及仓库不能重名,不同仓库下可以有同名的流。每个复合文档都有一个根仓 库(root storage)2. 1扇区与扇区标识所有的流又分成更小的数据块,叫做数据扇区(sectors)。Sectors可能包含控制数据或用户数据。整个文件由一个头(Header)结构以及其后的所有Sectors组成。Sectors的大小在头中确定,且每个Sectors的大小都相同。以下为示意图:HEADERSECTOR 0SECTO
4、R 1SECTOR 2SECTOR 3SECTOR 4SECTOR 5SECTOR 6IISectors简单的以其在文件中的顺序列举,一个扇区的索引(从0开始)叫做扇区标识(SID: sector identifier)o SID是一个有符号的32位的整型值。如果一个SID的值非负,就表示真正存在的那个Sector;如果为负,就表示特殊的含义。下表给出有效的特殊SID:SID NameMeaning-1 Free SID 空闲sector,可存在于文件中,但不是任何流的组成部分。-2 End Of Chain SID SID链的结束标记(见2.2节)-3 SAT SID此Sector用于存放扇
5、区配置表(SAT)(见4.2节)-4 MSAT SID 此Sector用于存放主扇区配置表(MSAT)(见4.1节)2. 2扇区链与扇区标识链用于存储流数据的所有Sectors的列表叫做扇区链(Sector Chain )。这些Sectors可以是无序的。因此用于指定一个流的Sectors的顺序的SID数组就称为SID chain。一个SID chain总是以End Of Chain SID (2)为结束标记。例:一个流由4个Sector组成,其SID链为1,6, 3, 5,-2。流的SID链是通过扇区配置表构建的(见4.2节),但短流和以下两种内部流除外1 .主扇区配置表,其从自身构建SID
6、链(每个扇区包含下一个扇区的SID)。2.扇区配置表,其通过主扇区配置表构建SID链。第三章复合文档头3.1复合文档头的内容复合文档头在文件的开始,且其大小必定为512字节。这意味着第一个Sector的开始相对文件的偏移量为512字节。复合文档头的结构如下:Offset SizeContents08复合文档文件标识:D0H CFH 11H E0H A1H B1H 1AH E1H816此文件的唯一标识(不重要,可全部为0)242文件格式修订号(一般为003EH)262文件格式版本号(一般为0003H)282字节顺序规则标识(见 3.2):: FEHFFH = Little-Endian FFH
7、FEH = Big-Endian302复合文档中sector的大小(ssz),以2的幂形式存储,sector实际大小为s_size=2ssz字节(一般为9即512字节,最小值7即128字节)322short-sector的大小(见5.1),以2的幂形式存储,short-sector实际大小为s_s_size = 2sssz字节(一般为6即64字节,最大为sector的大小)3410Not used444用于存放扇区配置表(SAT)的sector总数484用于存放目录流的第一个sector的SID (见6)524Not used564标准流的最小大小(一般为4096 bytes),小于此值的流即
8、为短流。604用于存放短扇区配置表(SSAT)的第一个sector的SID (见5.2),或为-2(EndOf ChainSID)如不存在。644用于存放短扇区配置表(SSAT)的sector总数684用于存放主扇区配置表(MSAT)的第一个sector的SID (见4.1),或为-2(EndOf ChainSID)若无附加的sectors。724用于存放主扇区配置表(MSAT)的sector总数76436存放主扇区配置表(MSAT)的第一部分,包含109个SID。3.2 字节顺序(Byte Order)文件数据的二进制存储有两种方法Little-Endian和Big-Endian,但实际应用
9、中只使用Little-Endian方法即:低位8字节存放在地址 的低位,高位8字节存放在地址的高位。例:一个 32 位的整数 13579BDFH (转为十进制即 324508639),以 Little-Endian 存放为 DFH 9BH 57H13H,以 Big-Endian 存放为 13H57H 9BH DFH。( H下标表示十六进制)3.3扇区偏移量从头中的信息可以计算出一个sector的偏移量(offset),公式为:sec_pos(SID) = 512 + SID ? s_size = 512 + SID ? 2 ssz例:ssz = 10 and SID = 5:sec_pos(S
10、ID) = 512 + SID ? 2 ssz = 512 + 5 ? 210 = 512 + 5 ? 1024 = 5632.第四章扇区配置4.1主扇区配置表主扇区配置表(MSAT: master sector allocation table)是一个SID数组,指明了所有用于存放扇区配置表(SAT: sector allocation table) 的sector的SID。MSAT的大小(SID个数)就等于存放SAT的sector数,在头中指明。MSAT的前109个SID也存放于头中,如果一个MSAT的SID数多余109个,那么多出来的SID将存放于sector中,头中巳经指明了 用于存放
11、MSAT的第一个sector的SID。在用于存放MSAT的sector中的最后一个SID指向下一个用于存放MSAT的sector,如果没有 下一个则为 End Of Chain SID (-2)。存放MSAT的sector的内容:(s_size表示sector的大小)Offset SizeContents0s_size-4MSAT 的(s_size4) / 4 个 SID 的数组s_size44下一个用于存放MSAT的sector的SID,或一2 (巳为最后一个)最后一个存放MSAT的sector可能未被完全填满,空闲的地方将被填上Free SID(-1)。例:一个复合文档需要300个sect
12、or用于存放SAT,头中指定sector的大小为512字节,这说明一个sector可存放128个SID。MAST 有300个SID,前109个放于头中,其余的191个将要占用2个sector来存放。此例假定第一个存放MSAT的sector为sector 1,则sector 1包含127个SID。第128个SID指向一个用于存放MSAT的sector,假定为sector 6,则sector 6包含剩下的64个SID (最后一个SID 为一2,其他的值为一1)。4.2扇区配置表扇区配置表(SAT: sector allocation table)是一个SID数组,包含所有用户流(短流除外)和内部控
13、制流(the short-stream container stream,见 5.1, the short-sector allocation table,见 5.2, and the directory,见 7)的 SID 链。SAT 的大小(SID 个数)就等于复合文档中所存在的sector的个数。SAT的建立就是通过按顺序读取MSAT中指定的sector中的内容。存放SAT的sector的内容:(s_size表示sector的大小)OffsetSizeContents0s_sizeSAT 的 s_size / 4 个 SID 的数组当通过SAT为一个流创建SID链时,SAT数组的当前位置
14、(array index)表示的就是当前的sector,而该位置存放的SID则指向下 一个 sector oSAT可能在任意位置包含Free SID (-1),这些sector将不被流使用。如果该位置包含End Of Chain SID (-2)表示一个流的结 束。如果sector用于存放SAT则为SAT SID (-3),同样用于存放MSAT则为MSAT SID (-4)。一个SID链的起点从用户流的目录入口(directory entry,见6.2节)或头(内部控制流)或目录流本身获得。例:一个复合文档包含一个用于存放SAT的sector (sector 1)和2个流。Sector 1的内
15、容如下图:Amy indexesSAT (SIDs)在位置1其值为一3,表明Sector 1是SAT的一部分。其中一个流为内部目录流,假定头中指定其开始为Sector 0,SAT中位置0的值 为2,位置2的值为3,位置3的值为一2。因此目录流的SID链为0, 2, 3, -2,即此目录流存放于3个sector中。目录中包含一个用 户流的入口假定为sector 10,从图中可看出此流的SID链为10, 6, 7, 8, 9,-2。第五章短流5.1短流存放流当一个流的大小小于指定的值(在头中指定),就称为短流(short-stream)。短流并不是直接使用sector存放数据,而是内含在一 种特殊
16、的内部控制流短流存放流(short-stream container stream)中。短流存放流象其他的用户流一样:先从目录中的根仓库入口(root storage entry)获得第一个使用的sector,其SID链从SAT中获 得。然后此流将其所占用的sectors分成short-sector,以便用来存放短流。此处也许较难理解,我们来打个比方:既然流组成符合文档, 而短流组成短流存放流,这两者是相似的。把短流存放流当作复合文档,那么短流对应流,short-sector对应sector,唯一的不同是复合 文档有一个头结构,而短流存放流没有。short-sector的大小在头中巳经指定,因
17、此可根据SID计算short-sector相对于短流存放流的偏 移量(offset)。公式为:short_s_pos(SID) = SID ? short_s_size = SID ? 2 sssz例:sssz = 6 and SID = 5:short_s_pos(SID) = SID ? 2 sssz = 5 ? 26 = 5 ? 64 = 320.5.2短扇区配置表短扇区配置表(SSAT: short-sector allocation table)是一个SID数组,包含所有短流的SID链。与SAT很相似。用于存放SSAT的第一个sector的SID在头中指定,其余的SID链从SAT中获
18、得。存放SSAT的sector的内容:(s_size表示sector的大小)OffsetSizeContents0s_sizeSSAT 的 s_size / 4 个 SID 的数组SSAT的用法与SAT类似,不同的是其SID链引用的是short-sector。第六章 目录6.1目录结构目录(directory)是一种内部控制流,由一系列目录入口(directory entry)组成。每一个目录入口都指向复合文档的一个仓库或流。目 录入口以其在目录流中出现的顺序被列举,一个以0开始的目录入口索引称为目录入口标识(DID: directory entry identifier)o 如下图所示:DI
19、RECTORY ENTRY 0DIRECTORY ENTRY 1DIRECTORY ENTRY 2DIRECTORY ENTRY 3 目录入口的位置不因其指向的仓库或流的存在与否而改变。如果一个仓库或流被删除了,其相应的目录入口就标记为空。在目录的开 始有一个特殊的目录入口,叫做根仓库入口(root storage entry),其指向根仓库。目录将每个仓库的直接成员(仓库或流)放在一个独立的红黑树(red-black tree)中。红黑树是一种树状的数据结构,本文仅简单介 绍一下,详细情况请参考有关资料。建构一个Red-Black tree的规则:1. 每个节点(node)的颜色属性不是红就
20、是黑。2. 根节点一定是黑的。3. 如果某个节点是红的,那它的子节点一定是黑的。4. 从根节点到每个叶节点的路径(path)必须有相同数目的黑节点。ex:B(用图形来解说第4点,从根节点/ 到最底层的node,你会发现每个BBpath都恰好有3个black node)/ /B BR B/ / R BB RR/ 注意并不总是执行上述规则。安全的方法是忽略节点的颜色。例:以第一章中的图为例1. 根仓库入口描述根仓库,它不是任何仓库入口的成员,因此无需构建红黑树。2. 根仓库的所有直接成员(Storagel”,“Storage2”,“Streaml”,“Stream2”,“Stream3”,和 “S
21、tream4”)将组成一棵红黑树,其根节点的 DID 存放于根仓库入口中。3. 仓库Storagel只有一个成员Streaml,Streaml构成一棵红黑树,此树只有一个节点。Storage 1的目录入口包含Stream 1的DID。4. 仓库Storage2包含3个成员“Stream21”,“Stream22”,和“Stream23”。这3个成员将构建一棵红黑树,其根节点的DID存放于Storage2 的目录入口中。这种存放规则将导致每个目录入口都包含3个DID:1. 在包含此目录入口的红黑树中,此目录入口的左节点的DID。2. 在包含此目录入口的红黑树中,此目录入口的右节点的DID。3.
22、若此目录入口表示一个仓库,则还包含此仓库的直接成员所组成的另一颗红黑树的根节点的DID。在构建红黑树的过程中,一个节点究竟作为左还是右,是通过比较其名字来判断的。一个节点比另一个小是指其名字的长度更短,如长度 一样,则逐字符比较。规定:左节点根节点右节点。6.2目录入口一个目录入口的大小严格地为128字节,计算其相对目录流的偏移量的公式为:dir_entry_pos(DID) = DID ? 128。目录入口的内容:Offset Size Contents064此入口的名字(字符数组),一般为16位的Unicode字符,以0结束。(因此最大长度为31个字符)642用于存放名字的区域的大小,包括
23、结尾的0。(如:一个名字右5个字符则此值为(5+1)?2 = 12)66 1入口类型:00H = Empty 03H = LockBytes (unknown) 01H = User storage04H = Property (unknown) 02H = User stream 05H = Root storage67 1此入口的节点颜色:00H = Red 01H = Black68 4其左节点的DID (若此入口为一个user storage or stream)若没有左节点就为一1。724其右节点的DID (若此入口为一个user storage or stream),若没有右节点就
24、为一 1。764其成员红黑树的根节点的DID (若此入口为storage),其他为一1。8016唯一标识符(若为storage)(不重要,可能全为0)964用户标记(不重要,可能全为0)1008创建此入口的时间标记。大多数情况都不写。1088最后修改此入口的时间标记。大多数情况都不写。1164若此为流的入口,指定流的第一个sector或short-sector的SID,若此为根仓库入口,指定短流存放流的第一个sector的 SID,其他情况,为0。1204若此为流的入口,指定流的大小(字节)若此为根仓库入口,指定短流存放流的大小(字节)其他情况,为0。1244 Not used时间标记(tim
25、e stamp)是一个符号的64位的整数,表示从1601-01-01 00:00:00开始的时间值。此值的单位为10-7秒。 当计算时间标记是要注意闰年。例:时间标记值为01AE408B10149C00H公式结果t0 = 121,105,206,000,000,000 rfrac = t0 mod 107 t1 = t0 / 107 rsec = t1 mod 60 t2 = t1 / 60 rmin = t2 mod 60 t3 = t2 / 60 rhour = t3 mod 24 t4 = t3 / 24计算步骤转为十进制rfrac = 0t1 = 12,110,520,600rsec
26、= 0t2 = 201,842,010rmin = 30t3 = 3,364,033rhour = 1t4 = 140,168ryear = 1601 + 383 = 1984t5 = 140,168 一 139,887 = 281化成秒的余数化成秒的整数化成分的余数化成秒的整数化成小时的余数化成小时的整数化成天的余数化成天的整数 距 1601-01-01 的整年 ryear = 1601 + t4 含的年到1984年还剩的天数t5 = t4 - (1601-01-01到1984-01-01的天数)rmonth = 1 + 9 = 10t6 = 281 一 274 = 7rday = 1距19
27、84-01-01的月数rmonth = 1 + t5含的月数到10月还剩的天数 t6 = t5 - (1984-01-01到1984-10-01的天数)10月最终天数rday = 1 + t6第七章Excel文件实例剖析看实例永远是最好的学习方法,呵呵。这章我们以一个Excel文件作为实例来分析其二进制结构。1.复合文档头内容如下:首先,读取此文件头,假定此Excel文件的头(512字节)00000000H D0 CF 11 E0 A1 B1 1A E1 00 00 00 00 00 00 00 00 00000010H 00 00 00 00 00 00 00 00 3B 00 03 00
28、FE FF 09 0000000020H 06 00 00 00 00 00 00 00 00 00 00 00 01 00 00 0000000030H 0A 00 00 00 00 00 00 00 00 10 00 00 02 00 00 0000000040H 01 00 00 00 FE FF FF FF 00 00 00 00 00 00 00 0000000050H FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 00000060H FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF 00
29、000070H FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF00000080H FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF00000090H FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF000000A0H FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF000000B0H FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF000000C0H FF FF F
30、F FF FF FF FF FF FF FF FF FF FF FF FF FF000000D0H FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF000000E0H FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF000000F0H FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF00000100H FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF00000110H FF FF FF FF FF FF FF F
31、F FF FF FF FF FF FF FF FF00000120H FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF00000130H FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF00000140H FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF00000150H FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF00000160H FF FF FF FF FF FF FF FF FF FF FF FF F
32、F FF FF FF00000170H FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF00000180H FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF00000190H FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF000001A0H FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF000001B0H FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF00000
33、1C0H FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF000001D0H FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF000001E0H FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF000001F0H FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF1)前8个字节是固定的标识,表示这是一个复合文档文件。00000000H D0 CF 11 E0 A1 B1 1A E1 00 00 00 00 00 0
34、0 00 002)接着16个字节是唯一标识,其后的4个字节表示修订号和版本号,可不用管它。00000000H D0 CF 11 E0 A1 B1 1A E1 00 00 00 00 00 00 00 0000000010H 00 00 00 00 00 00 00 00 3B 00 03 00 FE FF 09 003)接下来的2个字节是字节顺序(Byte Order)标识符,总是FEH FFH。00000010H 00 00 00 00 00 00 00 00 3B 00 03 00 FE FF 09 004)接着的2个字节表示sector的大小,再2个字节表示short-sector的大小
35、。分别是2A9=512字节和2A6=64字节。00000010H 00 00 00 00 00 00 00 00 3B 00 03 00 FE FF 09 0000000020H 06 00 00 00 00 00 00 00 00 00 00 00 01 00 00 005)接着的10个字节无有效数据,可忽略。00000020H 06 00 00 00 00 00 00 00 00 00 00 00 01 00 00 006)接着的4个字节表示用于存放扇区配置表(SAT)的sector总数,此例为1个。00000020H 06 00 00 00 00 00 00 00 00 00 00 00
36、 01 00 00 007)接着的4个字节表示用于存放目录流的第一个sector的SID,这里为sector 10o00000030H 0A 00 00 00 00 00 00 00 00 10 00 00 02 00 00 008)接着的4个字节无有效数据,可忽略。00000030H 0A 00 00 00 00 00 00 00 00 10 00 00 02 00 00 009)接着的4个字节表示标准流的最小大小,这里为00001000H = 4096字节。00000030H 0A 00 00 00 00 00 00 00 00 10 00 00 02 00 00 0010)接着的4个字节
37、表示用于存放短扇区配置表(SSAT)的第一个sector的SID,其后4个字节表示用于存放短扇区配置表(SSAT)的sector总数,这里SSAT从sector 2开始,并只占用1个sectoro00000030H 0A 00 00 00 00 00 00 00 00 10 00 00 02 00 00 0000000040H 01 00 00 00 FE FF FF FF 00 00 00 00 00 00 00 0011)接着的4个字节表示用于存放主扇区配置表(MSAT)的第一个sector的SID,其后的4个字节表示用于存放主扇区配置表(MSAT) 的sector总数,这里SID为一2,
38、说明没有附加的sector用于存放MSAT。00000040H 01 00 00 00 FE FF FF FF 00 00 00 00 00 00 00 0012)最后的436个字节包含MSAT的前109个SID。只有第一个SID有效,因为上面巳经说了 SAT只占用1个sector。从这里可看出为sector 0。其他的SID标记为Free SID值为一1。00000040H 01 00 00 00 FE FF FF FF 00 00 00 00 00 00 00 0000000050H FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF000000
39、60H FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF2, 主扇区配置表头中巳经包含整个MSAT,其SID链为0,2。3. 扇区配置表在此例中扇区配置表仅占用sector 0,它开始于文件偏移量为00000200H = 512字节处。假定内容如下:00000200H FD FF FF FF FF FF FF FF FE FF FF FF 04 00 00 0000000210H 05 00 00 00 06 00 00 00 07 00 00 00 08 00 00 0000000220H 09 00 00 00 FE FF FF FF 0B 0
40、0 00 00 FE FF FF FF00000230H FFFFFF FF FF FF FF FF FFFFFFFFFFFF FF FF00000240H FFFFFF FF FF FF FF FF FFFFFFFFFFFF FF FF00000250H FFFFFF FF FF FF FF FF FFFFFFFFFFFF FF FF00000260H FFFFFF FF FF FF FF FF FFFFFFFFFFFF FF FF00000270H FFFFFF FF FF FF FF FF FFFFFFFFFFFF FF FF00000280H FFFFFF FF FF FF FF FF
41、 FFFFFFFFFFFF FF FF00000290H FFFFFF FF FF FF FF FF FFFFFFFFFFFF FF FF000002A0H FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF000002B0H FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF000002C0H FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF000002D0H FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF000
42、002E0H FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF000002F0H FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF00000300H FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF00000310H FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF00000320H FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF00000330H FF FF FF
43、 FF FF FF FF FF FF FF FF FF FF FF FF FF00000340H FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF00000350H FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF00000360H FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF00000370H FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF00000380H FF FF FF FF FF FF FF FF
44、 FF FF FF FF FF FF FF FF00000390H FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF000003A0H FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF000003B0H FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF000003C0H FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF000003D0H FF FF FF FF FF FF FF FF FF FF FF FF FF
45、 FF FF FF000003E0H FF FF FF FF FF FF FF FF FFFFFFFF FF FF FF FF000003F0H FF FF FF FF FF FF FF FF FFFFFFFF FF FF FF FF因此可构建SAT的SID数组为:Array index 0 1234 5678 9 10 1112.SID array | -3 | -1 | -2 | 4 | 5 | 6 | 7| 8 |9 | -2 | 11 | -2|-1| . |可看出sector 0被标记为SAT SID (3), sector 1和sector 12及其后的所有sector都未被使用。
46、4. 短扇区配置表在头中我们知道SSAT从sector 2开始只占用一个sector SAT中可看出位置2的值为一2,表示结束,故SSAT的SID链为2, -2。开始于文件偏移量为00000600H = 1536字节处。假定内容如下:00000600H 01 00 00 00 02 00 00 00 03 00 00 00 04 00 00 0000000610H 05 00 00 00 06 00 00 00 07 00 00 00 08 00 00 0000000620H 09 00 00 00 0A 00 00 00 0B 00 00 00 0C 00 00 0000000630H 0D 00 00 00 0E 00 00 00 0F 00 00 00 10 00 00 0000000640H 11 00 00 00 12 00 00 00 13 00 00 00 14 00 00 0000000650H 15 00 00 00 16 00 00 00 17 00 00 00 18 00 00 0000000660H 19 00 00 00 1A 00 00 00 1B 00 00 00 1C 00 00 0000000670H 1D 00 00 00 1E 00 00 00 1F 00 00 00 20 00 00 0000000680H 2