一、ICI文件

游戏的主要资源文件就是这几个了,其中rio和rio.002根据文件名可推测是分卷形式,仍需进一步分析。
经过简单的CreateFile断点之后,发现rugp.exe先读取了ici文件,所以先对ici文件进行分析。
经过简单跟踪,发现主要的代码都在UnivUI.dll里,加载了mfc120等符号之后,可以发现文件读写使用了MFC的CFile类。
继续跟踪之后发现引擎给CFile保证了一层,类名是CSizedFile。


先创建了一个CSizedFile然后调用虚函数Open实际打开了文件。
如果打开成功,会进入CreatePmArchive这个函数。
这个函数是一个工具函数,用于创建CPmArchive对象。
上面代码简化之后就是这样:
CFile* pFile = new CSizedFile();
pFile->Open( pszFileName );
ar = CreatePmArchive( pFile );
return ar;

进入CPmArchive的构造函数之后发现CPmArchive里有一个CArchive对象。

这个CArchive是MFC的东西,所以需要查看MFC的源码。网上以及MSDN都有详细介绍。
简单说CArchive就是MFC为了方便APP存储和载入文档而造的一个轮子,相当于一个文件读写工具。
说高端点就是对象の序列化と反序列化。
从这个函数出来,CArchive/CPmArchive对象已经构造完整,并且可以开始读写文件了。
接着跟踪几步之后,就会到LoadForChild这个函数,当然名字是我随便写的。

由于Ici文件是个加密文件,所以并不走这个分支,而是接着往下走。

先通过CPmArchive::HeapSerialize从文件中读取并解密数据。加密数据中包含了Heap的大小,所以不需要读取时指定。
把数据读取到Heap之后,还要经过一次解密(UTIL_DecryptIci),才能得到明文的Ici数据。

得到明文数据之后,就开始进行读取载入了。