WordDocument流的偏移0处是一个 FIB(File Information Block)。
FIB
FIB包含文档信息和指向文档各个部分的指针。
FIB由基础部分和扩展的节(section)组成,基础部分的长度固定,节的数量和长度可变,每一个节包含一个count域指明下一个节的长度。
图1,FIB结构
csw (2 bytes):无符号整形,指明后面的fibRgW个数。fibRgW大小为2字节,该值必须为0x000E。
fibRgW (28 bytes):为FibRgW97格式。
cslw (2 bytes):无符号整形,指明后面的fibRgLw个数。fibRgLw大小为4字节,该值必须为0x0016。
fibRgLw (88 bytes):格式为FibRgLw97。
cbRgFcLcb (2 bytes):无符号整形,指明后面的fibRgFcLcbBlob 个数。fibRgFcLcbBlob 大小为8字节。其值根据FibBase中的nFib而不同:
fibRgFcLcbBlob (可变):格式为FibRgFcLcb。
cswNew (2 bytes):无符号整形,指明后面的fibRgCswNew个数。fibRgCswNew大小为2字节。其值根据FibBase中的nFib而不同:
fibRgCswNew (variable):如果cswNew非0,结构为 fibRgCswNew。否则,该域在文件中不存在。
FibBase
FIB的起始部分为32字节的基础部分,如图2所示:
1) wIdent (2字节):用来说明这是一个woud二进制文件,值必须为0xA5EC。
2) nFib (2字节):说明文件格式的版本号,如果存在FibRgCswNew.nFibNew域,则被该域取代。值通常为0x00C1。
3) unused (2字节):被忽略。
图2,FIB基础部分结构
4) lid (2字节):说明产生该文档的应用程序的语言。
5) pnNext (2字节):一个无符号整数,说明所有包含 AutoText(文档、图像)项的FIB在WordDocument流中的偏移,其位置为pnNext*512。如果为0,表示没有AutoText项。如果fGlsy是1或fDot是0,这个值必须是0。如果pnNext非0,则必须与FibRgFcLcb97.fcPlcBteChpx,FibRgFcLcb97.lcbPlcBteChpx,FibRgFcLcb97.fcPlcBtePapx,FibRgFcLcb97.lcbPlcBtePapx和FibRgLw97.cbMac的值相同。
6) A - fDot (1位):说明是否为文档模板。
7) B - fGlsy (1位):是否为一个只包含AutoText元素的文档。
8) C - fComplex (1位):该文档的最后一次保存操作是否为incremental save(除了附加或修改部分内容,保留其它内容,不是重建等)。
9) D - fHasPic (1位):为0,表示没有图片。
10) E - cQuickSaves (4位):无符号整形。如果nFib小于0x00D9,该域表示连续进行的incrementally save的次数。如果nFib大于等于0x00D9,该域必须为0xF。
11) F - fEncrypted (1位):说明该文档是否被加密或混淆。
12) G - fWhichTblStm (1 bit):为1,则文档使用1Table流,为0,则文档使用0Table流。
13) H - fReadOnlyRecommended (1 bit):是否文档只能以只读方式打开。
14) I - fWriteReservation (1 bit):文档执行写操作是否需要密码。
15) J - fExtChar (1 bit):为1。
16) K - fLoadOverride (1 bit):是否重写istd 0中段落格式中指定的语言信息和字体为与当前应用适应的值。
17) L - fFarEast (1 bit):创建文档的语言是否为East Asian language。
18) M - fObfuscated (1 bit):如果 fEncrypted为1,改为说明文档是否被执行异或混淆。
19) nFibBack (2 bytes):为0x00BF或0x00C1。
20) lKey (4 bytes): 如果fEncrypted和fObfuscation都是1,这个值是异或混淆验证器。如果fEncrypted是1fObfuscation都是0,则该域为EncryptionHeader的长度。否则为0。
21) envr (1 byte):必须为0,且被忽略。
22) N - fMac (1 bit):必须为0,且被忽略。
23) O - fEmptySpecial (1 bit):必须为0,且被忽略。
24) P - fLoadOverridePage (1 bit):是否根据所安装应用的语言修改页尺寸的节属性,方向。
25) Q - reserved1 (1 bit):忽略。
26) R - reserved2 (1 bit):忽略。
27) S - fSpare0 (3 bits):忽略。
28) reserved3 (2 bytes):必须为0,且被忽略。
29) reserved4 (2 bytes):必须为0,且被忽略。
30) reserved5 (4 bytes):被忽略。
31) reserved6 (4 bytes):被忽略。