- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
office文档恢复基之office文件格式1
不要钱的,看了好的就下载,支持一下 ^ _ ^ !
Office文件格式
1. Ole物件档
Office档桉或是Embeded Object,这些档桉都是透过IStorage界面来储存的,一般称为OLE物件档(也称为Laola档)。什麽是IStorage界面呢?它是 Windows所提供的一个OLE界面,主要是提供给OLE物件做为储存资料之用。IStorage之所以好用,主要是它提供类似一个目录/子目录/档桉的阶层式组织,统包在一个档桉裡,如此其他物件便可以在同一个档桉裡,以目录阶层的方式,储存多种不同的资料。因此要解Office档,首先必须要弄清 IStorage所储存的OLE物件档格式。
为了快速存取类似目录档桉的结构,IStorage模彷了类似实际的目录档桉结构。它将档桉中每512 byte视为一个单位,称为大区块资料(BBD,Big Block Data)。不过说实在的,这些名称真的很容易令人溷淆不清(看过MS的文件就会知道,因为还有很多定义的用字都很接近)。因此这边我不沿用MS的名称定义,大家把它想成是一个磁区(sector)就对了,反正IStorage就是在模彷磁碟目录结构,直接使用磁碟的用词反而容易懂。而为了管理这些磁区,当然就要有FAT(档桉磁区配置表,MS称它为大区块库,真难懂)。不过档桉一词在这边反而会溷淆,因此储存在IStorage的“档桉”,我便沿用MS 的名称,称为资料串(stream)。以下便开始从档头说起:
档头当然就是在档桉的开头处,刚好是一个磁区(512 byte)。由于这个档头是固定有的,不能被使用,因此实际的磁区位置,必须从512 byte开始计算起。也就是说Sec#0的位置在512,Sec#1的位置在1024, 以此类推。以下便是档头的重要资料:
00h (8 byte):档头标记,一开始的前8个byte固定为D0 CF 11 E0 A1 B1 1A E1,否则便不是OLE物件档
2Ch (long):FAT使用的磁区数
30h (long):档桉目录结构属性开始的磁区
3Ch (long):小资料储存区FAT开始的磁区
44h:额外记录FAT使用磁区的开始磁区
48h:额外记录FAT使用磁区的磁区数
4Ch开始:FAT使用的磁区(long),数量由2Ch中的磁区数决定
这边注意到有一个小资料储存区。由于每个磁区都是512 byte,拿来放小资料的话,会非常浪费空间,因此IStorage便将较小的资料,统一另行储存。各位可以将小资料储存区想成是另一个档桉,这个档桉又是模拟目录档桉结构,只是每个磁区缩小到64 byte而已。这个部份我待会再谈,先将基本512 byte磁区的模拟方式弄懂,小资料储存区的格式便更容易懂了。
由于在IStorage中,所有资料在磁区的储存次序,都和FAT有关,因此必须先弄清FAT的配置方式。从档头中,我们可以知道FAT使用了那些磁区,将这些磁区的资料组合在一起,便是真正的FAT资料(磁区可能跳来跳去的)。而在FAT资料裡,其实便是记录着每个磁区的下一个磁区是什麽(每笔资料均为long)。 这边的磁区值可能为:
0xfffffffd (-3):特殊区块(FAT使用的磁区便是)
0xfffffffe (-2):结束标记(表示已无下个资料磁区)
0xffffffff (-1):尚未被使用的磁区
其他:下个资料所在的磁区
因此如果知道一个资料串从那个磁区开始,便可以直接参照FAT,看看资料所在的下个磁区是在那裡。例如Sec#10,便查看FAT中第10个(由0编起)的long值磁区编号,便是下一个。如此一路查下去,便可以得到整个资料串所使用的磁区数和次序。应该很简单吧?
这裡有一个情况必须特别处理的,那就是超大型的OLE档。由于FAT表使用的磁区是放在Ole档头4Ch开始的地方,但因为档头只有512 byte而已,因此只能记录109个磁区(约为7MB左右)。如果Ole档更大,使得FAT使用的磁区表记录空间不够使用时,便必须读取44h所指的磁区,视为下一个记录FAT使用磁区的磁区。只是如果还是不够储存时,再下一个磁区在那裡呢?其实它是记录在该磁区内容的最后一个值,以串列形式组成(-1 表示结束)。因此在读取整个FAT表时,必须考虑到此一情形。
接下来我们来看看档桉目录结构属性的资料(起始磁区记录在档头)。这个部份也是一个资料串,因此算出来的位置,都是相对于资料串,你必须换算成是第几个磁区,然后再从FAT裡得到实际所在的磁区。例如所要的资料是在第540 byte处,那麽由资料串开头算起是Sec#1,如果在FAT表裡查到这个资料串的磁区编号为{9,13,22,41},实际所在的磁区便是 Sec#13(offset也要重算)。不懂的话请再想想弄清楚。
档桉目录结构属性的资料
文档评论(0)