

给O2 XDA ZINC写的一个XIP移植教程,拿出来共享算啦!
第一步:
准备工具,提取XIP.BIN(假定你已经知道如何提取和写入XIP.BIN了)
XIPPort的版本比较混乱,建议用大小是72,704字节的版本。
第二步:
解开ZINC的XIP,WRITEMAP、BuildPkg:
检查你的out目录,应该长这样:
其中,OEM开头的File和Modules目录是要保留的。
第三步:
同样解开一个更高版本的ROM的XIP,我用的Kaiser 沃达丰英国版Build19199的XIP。
其中,WinCENLS_WWE和LangDB我们都可以不管(对ZINC目前来说,没用到,但WM6.1大部分都是需要WINCE.NLS的)
第四步:文件替换
将ZINC XIP的Files和Modules目录的MSXIPKernel和MSXIPKernelLTK都替换为Kaiser的版本。在替换以前,记得备份ZINC XIP的整个OUT目录。
第五步:尝试Reloc Slot0和Slot1
5.1
检查地址冲突
Undo的意思是将刚才打好包的MSXIPKernel、OEMXIPKernel之类的文件夹里的东西重新直接移回到Out里。Realloc P是重新计算各模块的位置,WriteMaps是将计算结果写入到MAP.TXT里。
现在打开MAP.TXT,会发现很多!!!!!!!,这是冲突的地址。咱们运气好,SLOT0里没有冲突J,在SLOT1里才有。
先看头两行位于Slot1里的冲突地址:
03e06000 - 03e54000 L0004e000 Virtual base address of TrueFFS.dll
03e54000 - 03e5a000 L00006000 Virtual base address of ceddk.dll
03e56000 - 03e5a000 L00004000 !!!!!!!!!!!!!!!!!!
03e56000 - 03e5a000 L00004000 Virtual base address of regenum.dll
03e5a000 - 03e5e000 L00004000 Virtual base address of cecompr.dll
03e5a000 - 03e5e000 L00004000 !!!!!!!!!!!!!!!!!!
03e5a000 - 03e69000 L0000f000 Virtual base address of pm.dll
意思是:
03e54000 - 03e5a000 L00006000 Virtual base address of ceddk.dll
(ceddk.dll的E32_VBASE从3e540000开始,长度是6000)
03e56000 - 03e5a000 L00004000 !!!!!!!!!!!!!!!!!!
(这里两个DLL之间,重叠了4000长度的区域!)
03e56000 - 03e5a000 L00004000 Virtual base address of regenum.dll
(regenum.DLL的E32_VBASE从3e56000开始,长度是4000)
后面那一串!!!!!!!!也是这个意思,差了4000的区域,就不重复了。
5.2
计算地址
因此,SLOT1里共缺了两处4000的长度。显然我们需要将TrueFFS.DLL和CEDDK.DLL的E32VBASE向前挪8000字节,REGENUM.DLL和CECOMPR.DLL的E32VBASE向前挪4000字节,这样大家就都和谐了。
现在拿起计算器,进行16进制运算,得到需要搬移的4个DLL的E32VBASE:
TrueFFS.dll:
3DFE000
ceddk.dll:
3E4C000
regenum.dll:
3E52000
cecompr.dll:
3E56000
5.3
Reloc模块
OK,记下上面这4个值,分别打开这4个模块的目录,修改imageinfo.txt,例如TrueFFS.dll:
改为
IMAGE.TXT改完以后,还需要用M’Reloc修改模块S00X:
==>
同样,修改全部4个DLL模块。
5.4 检查
咱们再用XIPPORT,Reloc P,WriteMAP。现在MAP.TXT中SLOT0和SLOT1看上去相当的和谐。
第六步:修改物理地址和RAM起始位置
6.1
检查物理地址
由于新加进来的文件比原来的大,所以一些文件不可避免的越界了,占用了以前系统认为是RAM的虚拟地址。
在MAP.TXT的最后,出现了这样的!!!!!!!!!!!!!!!!!!!:
803fa000 - 80405848 L0000b848 o32 region_0 rva=00001000 vsize=0000b848 real=03e5b000 psize=0000b848 f=68000020 for pm.dll
8040072c - 80405848 L0000511c !!!!!!!!!!!!!!!!!!
8040072c - 8040072c L00000000 End: highest physical address
8040072c - 80401000 L000008d4 NUL
80401000 - 80401000 L00000000 Start: start of RAM
80401000 - 80406000 L00005000 NUL
80406000 - 80407000 L00001000 initialized data of region_1 giisr.dll
80407000 - 8040a268 L00003268 NUL
8040a268 - 80415268 L0000b000 filedata boot.hv
80410000 - 80415268 L00005268 !!!!!!!!!!!!!!!!!!
80410000 - 80416000 L00006000 uninitialized data of region_2 nk.exe
80415268 - 80416000 L00000d98 !!!!!!!!!!!!!!!!!!
80415268 - 8041ca30 L000077c8 filedata boot.rgu
80416000 - 8041ca30 L00006a30 !!!!!!!!!!!!!!!!!!
80416000 - 80439000 L00023000 initialized data of region_3 nk.exe
8041ca30 - 80439000 L0001c5d0 !!!!!!!!!!!!!!!!!!
8041ca30 - 80423a30 L00007000 filedata mxip_lang.vol
80423a30 - 804273d5 L000039a5 filedata sysroots.p7b
804273d8 - 804284fa L00001122 filedata a9b11ebe-60a1-a4c8-9ba1-f13452768aaf.dsm
804284fa - 80439000 L00010b06 NUL
80439000 - 80439000 L00000000 ------ start of RAM free space
80439000 - 83c00000 L037c7000 NUL
83c00000 - 83c00000 L00000000 End: end of RAM
可以看到,物理地址不够长了,PM.DLL写越界了,同时,一些文件被放到了RAM里面,我们需要增加物理地址的长度。
6.2 计算物理地址结束点
有两种办法:
1、将所有欠缺的长度、误放置的文件的长度加起来,然后在8040072C的基础上加上这个长度。
2、直接给一个足够大的值,让XIPPORT帮你算真实的值,我喜欢用这一种J
打开ROMHDR.TXT:
我们直接为物理地址加上1M字节,我猜肯定够了:
将physlast:改为8050072C,因此,RAMSTART、RAMFREE的地址也相应往后排1M,应该改成:80501000,80539000。再用XIPPORT RelocP,WriteMAP
新的MAP.TXT的结尾部分,出现了这句话:
804273d8 - 804284fa L00001122 filedata a9b11ebe-60a1-a4c8-9ba1-f13452768aaf.dsm
804284fa - 8050072c L000d8232 NUL
8050072c - 8050072c L00000000 End: highest physical address
意思是,从804284fa到8050072c,多出来d8232这么多的物理地址!所以,真实需要的物理地址结尾就是:804284fa。
6.3 计算RAM起始点
物理地址的结尾是804284fa,本着最大化RAM的原则,RAM的起始点应该是一个16进制的1000的最小倍数,也就是80429000。
接下来计算FREE RAM的起始点,打开原始版本(刚才备份的)MAP.TXT,最后是:
80401000 - 80401000 L00000000 Start: start of RAM
80401000 - 80402000 L00001000 initialized data of region_1 hd.dll
80402000 - 80406000 L00004000 initialized data of region_1 osaxst0.dll
80406000 - 80407000 L00001000 initialized data of region_1 giisr.dll
80407000 - 80410000 L00009000 NUL
80410000 - 80416000 L00006000 uninitialized data of region_2 nk.exe
80416000 - 80439000 L00023000 initialized data of region_3 nk.exe
80439000 - 80439000 L00000000 ------ start of RAM free space
它告诉我们,有4个模块的5个部分通过COPYENTRY放在了高端只读RAM里面。我们回头检查一下,发现NK.EXE和GIISR.DLL是OEM的,HD.DLL和OSAXST0.DLL是微软的。
现在把这四个文件的COPYENTRY收集一下:
这是ZINC原版的:
80406000 - 80407000 L00001000 initialized data of region_1 giisr.dll
80410000 - 80416000 L00006000 uninitialized data of region_2 nk.exe
80416000 - 80439000 L00023000 initialized data of region_3 nk.exe
这是KAISER的:
80306000 - 80307000 L00001000 initialized data of region_1 hd.dll
80307000 - 8030b000 L00004000 initialized data of region_1 osaxst0.dll
现在关注一下这些COPYENTRY的长度:
L00001000 initialized data of region_1 giisr.dll
L00006000 uninitialized data of region_2 nk.exe
L00023000 initialized data of region_3 nk.exe
L00001000 initialized data of region_1 hd.dll
L00004000 initialized data of region_1 osaxst0.dll
加起来:
1000 + 6000 + 23000 + 1000 + 4000 = 2F000
那么FREE RAM的起始地址应该是:80429000 + 2F000 = 80458000
咱们就又把ROMHDR.TXT根据上面算的这些值改回去:
physlast:
804284fa
ulRAMStart:
R=80429000
ulRAMFree:
80458000
用XIPPORT RELOCP,WRITEMAP
第7步:修改COPYENTRY
1.计算
拿刚才COPYENTRY的地址出来,根据个人喜好调整一下顺序(我喜欢把NK放在最前面)
L00006000 uninitialized data of region_2 nk.exe
L00023000 initialized data of region_3 nk.exe
L00001000 initialized data of region_1 giisr.dll
L00001000 initialized data of region_1 hd.dll
L00004000 initialized data of region_1 osaxst0.dll
从RAMSTART(80429000)开始,顺序计算各个COPYENTRY的开始地址:
region_2 nk.exe:
80429000(起始地址)
region_3 nk.exe:
8042F000(80429000+L00006000)
region_1 giisr.dll:
80452000(8042F000+L00023000)
region_1 hd.dll:
80453000
region_1 osaxst0.dll:
80454000
2.修改
首先修改NK.EXE,打开NK.EXE的IMAGEINFO.TXT,找到这两句:
o32[2].o32_realaddr: P+00290000
o32[3].o32_realaddr: P+00296000
这里P的意思是ROMHDR.TXT里的physfirst,也就是80180000,因此,新的NK.EXE的O32[2]和O32[3]的地址分别应该是:
80429000-80180000 = 2A9000;
8042F000-80180000 = 2AF000;
根据计算结果,修改IMAGEINFO.TXT
然后用M'Reloc_nk.exe打开NK.EXE,修改O32_REALADDR:
同样的方法修改剩下的三个文件。
注意:M'Reloc_nk.exe有BUG
1、无法输入字母,所以只有用右键菜单粘贴;
2、粘贴后Doit按钮不能用,我一般是把输入框末尾的0删除,又输入一次,Doit就好了;
3、在Reloc DLL的时候,输入的值会被自动加上o32_size,输入前需要自己先减去,(NK.EXE和HD.DLL除外,XIPPORT已经帮你加了)。例如:
==>
第8步:生成XIP_OUT.BIN
现在用XIPPORT,RELOCP、WRITEMAP、BUILD XIP_OUT.BIN,这个MAP基本上可以乱真啦~
第9步:NK.EXE的特殊要求
有的NK.EXE的O32地址好像是有要求的,根据俺这个文章的第一个读者阿秋的经验,将移动的目的地取一个很和谐的大整数,也许可以解决这个问题。
附件: 您所在的用户组无法下载或查看附件