九天雁翎的博客
如果你想在软件业获得成功,就使用你知道的最强大的语言,用它解决你知道的最难的问题,并且等待竞争对手的经理做出自甘平庸的选择。 -- Paul Graham

SelfExtractor自解压模块理解文档

SelfExtractor理解文档

ReadToc(CString Filename)

首先从文件尾反向Seek一个strlen(文件标志)的距离,然后读取文件标志,判断此文件标志.错误即返回INVALID_SIG.

然后再从文件尾反向Seek一个strlen(文件标志)+sizeof(int)的距离,读取一个整数,此整数代表文件数量.当其为0,即返回NOTHING_TO_DO,

然后根据文件数量,循环依次反向的Seek,读取文件名长度,文件名,文件长度,文件在文档中的偏移值.将各文件的信息保存在m_InfoArray数组中,将最后得到的偏移值,保存在m_nTOCSize中,此偏移值即整个文档头的大小.

阅读全文....

读windows核心编程,结构化异常部分,理解摘要

23章

结束处理程序

__try{} __finally{}块语句,能保证在运行完__try的语句后能调用__finally{}块中的语句,就算是提前的return,break,continue,goto, 内存访问违规等都可以保证,但是当调用ExitThreadExitProcess时,将立即结束线程或进程,由于调用TerminateThreadTerminateProcess而结束线程或进程,不会执行__finally块中的代码。

但是在__try块过早退出时,会导致局部展开,影响效率,应该尽量放在外面。

当碰到一些的确需要在块内部使用return时,可以先用__leave关键字代替,以直接从__try块转到__finally,并在最后调用return语句返回,这样避免了局部展开,提高了效率,但是额外的代价是需要加入一个表示函数成功完成的bool变量。

可以在__finally块中调用AbnormalTermination内部函数确定是否是非正常退出__try块,发生局部展开和内存访问违规等都算在内,此时返回true,当自然进入__finally块时,此函数返回false。可以通过这种方式决定到底在__finally块中执行什么代码。不能在其它地方调用。

此结束处理程序的作用:

简化错误处理,提高程序可读性,使代码更容易维护,使用得当具有很小的系统开销。

阅读全文....

MPQ Strom库使用及源代码理解文档

读取文件流程:

  1. 用要打开文档的文件名调用SFileOpenArchive()函数打开文档,得到打开文档的句柄.
  2. 用上步得到的文档句柄,和要打开的文件名调用SFileOpenFileEx()函数,得到打开的文件句柄.
  3. 用上步得到的文件句柄,调用SFileReadFile()函数,读取数据.
  4. 关闭文件,文档句柄.

阅读全文....

MPQ文档布局分析

MPQ文档布局分析(以暗黑破坏神2的一个补丁patch_d2.MPQ和燃烧远征的一个补丁patch-2.MPQ文档为实例,以下简称D2,P2)

说明:因为MPQ实际上是由很多文件数据组成,包含很多文件,为了区别好MPQ文件与一般文件,这里将MPQ文件在作为一个集合的时候称为文档(ARCHIVE),表示实际存储在硬盘上的一个文件时称为MPQ文件(file),而文件都指保存于MPQ中的一般文件.

说明2:intel x86系统的存储格式都是低位在前(Little-endian),比如一个int32型的数据44(00 00 00 2Ch)存储在文件和内存中实际为2C 00 00 00h,下面不再说明.

说明3:以下以[]后缀中表示此类型一共重复几次,以()前缀表示一个此类型所占字节数.比如(1)char[4]表示此处有4个1个字节的char类型数据.

说明4:本文主要信息来自The MoPaQ File Format 1.0.txt,只是附带个人结合D2,P2后的分析,因为会经常提到原文件,以后简称其为MFF.另外也经常会提到http://www.zezula.net/en/mpq/mpqformat.html一文,简称为MFH.

说明5:在一段文本的开头的十六进制数字都表示文件中的偏移地址,在段中,都以offset +十六进制数字说明此处表示在原文件的偏移地址.

阅读全文....

Breakpad 使用方法理解文档

只需要在任何异常前正常创建一个ExceptionHandler类的成员函数,就可以完成异常的捕捉及dump.

在创建ExceptionHandler时,第一参数为宽字符表示的dump存储路径,第二参数为dump前客户需要运行的程序,程序原型应该为

阅读全文....