首先来说明一个wince.nls是什么来的,wince.nls规定某个国家语言、日期格式、货币格式等(即区域设置里的国家),另外联系人的排序也与这个有关,如果不是在XIP中替换掉的话,那联系人排序有可能会出问题,所以我们必须在XIP中替换掉wince.nls。
替换XIP文件,其实和XIP移植也差不多了,不过就简单多了,因为没有替换模块文件,而且只是替换一个文件,这样产生的地址错误就大大减少,可以用这个当做是XIP移植的初级教程吧,呵呵。
这篇教程必备的软件是:1、winhex,这个去搜一下就可以找到下载,我就不上传了。2、简体的wince.nls,这个几乎原来简体ROM都可以提取,不过方便些,我还是上传到上来吧。
上一篇教程有提到,解NBH的时候,会在temp目录里产生一个xip.bin(具体的命令看上一篇教程),然后我们将xip.bin移到xip_tools里,用xippport.exe的dump xip.bin解开xip.bin,形成一个out目录
不过后面我们并没有用上xip.bin啊?一个模板只需要OEM、SYS和ROM目录,而ROM里只有一个OS.NB.payload和XIP目录下的boot.rgu,那XIP去哪了?其实xip就在os.nb.payload里(我们之前的xip.bin就是从os.nb.payload dump出来的),在制作ROM过程中,我们只是更改了os.nb.payload里的imgfs.bin,并没有更改过xip。这样对os.nb.payload的结构有一些了解了吧?还不了解?那我再说详细一点
os.nb.payload是个非常重要的文件,他包括了两个部分的内容,即xip+imgfs,而xip又分成xip01、xip02,其中xip01也叫做small boot,最为核心的是xip02,也就是我们平时说的xip.bin;而imgfs分为oem和sys,因此总的来说os.nb.payload=xip01+xip02+oem+sys。我们利用模板制作ROM,一般只是修改oem和sys(即imgfs.bin),再将修改过的内容按照原来os.nb.payload结构形成新的os.nb.payload,再签名成刷机文件。这样明白了吧?所以我们利用模板制作ROM是不需要xip.bin的,因为这个已经在os.nb.payload里了。
os.nb.payload还会规定这四部分的大小和位置,因此如果我们修改xip.bin后,xip的大小超过os.nb.payload里规定的xip大小的话,我们还要修改os.nb.payload才可以,至于具体的查看和修改方法我们后面再说(修改放在最后一篇)。
那我们今天继续下一步操作吧
一、打开xipport,点击write maps,这个意思是将各个模块等文件的地址写进maps里,后面我们需要打开maps.txt来查看是否有地址冲突等错误。
二、将OUT目录备份一份,因为等一下要对比修改前和修改后的变化(其实只需备份map.txt和romhdr.txt就可以了,不过我们不必在乎这点小空间,是不?)
三、点击xipport的make pkgs,这个作用是将OUT目录里的文件分类好
四、我们很快就可以找到所需要替换的wince.nls,在xip_tools\OUT\FILES\WinCENLS_WWE下面
五、我们右键点击wince.nls,看看大小,是273,514字节
六、用计算器将273514转换成16进制,是42C6A。然后打开wince.nls.imageinfo.txt看一下,发现nRealFileSize和nCompFileSize后面的值正好是00042C6A,看来wince.nls.imageinfo.txt这两项是记录wince.nls的大小的。
七、我们将简体的wince.nls替换掉原版的,再看看简体的wince.nls大小,原来是889,018 字节,转换成16进制后是D90BA,我们再将这个数字替换掉wince.nls.imageinfo.txt里的42C6A吧。
八、然后我们再点击xipport.exe的undo,这个意思是将分类的文件目录再次返回分类前的模样
九、我们再点击realloc P,这个是重新分配模块的位置,一般点击后会出现4个如下图所标的错误,不需要理会它,直接点击确定关掉他。
十、不过关掉4个上面的错误提示后,出现下面这个错误提示,这个就是真正的错误了,提示Not enough space。这句英文大家都懂吧?就是提示空间不足,看来我们将800多K的wince.nls替换掉200多K的wince.nls导致大小超出原xip定义的空间了。
十一、我们点击“继续”关掉那个错误窗口(按退出就会退出xipport,点错了也没关系,再打开xipport就可以了。我们去到out目录,打开romhdr.txt看一下
十一、因为提示空间不足,所以我们要把xip的空间加大才可以,因为简体的wince.nls比英文的大600K左右,因此我们把空间先加大1M吧,这样肯定够了吧。我们主要修改这几个内容:
physfirst: P=80000000
physlast: 803E1A3C
nummods: (00000022)
ulRAMStart: R=803E2000
ulRAMFree: 80487000
ulRAMEnd: 83400000
上面是原来的,physfirst是起始地址,physlast是结束地址,我们要增大1M的空间,就要把physlast的地址改后1M即修改成804E1A3C,然后后面的ulRAMStart和ulRAMFree也要顺着延后1M地址才可以,即最终修改成这样:
physfirst: P=80000000
physlast: 804E1A3C
nummods: (00000022)
ulRAMStart: R=804E2000
ulRAMFree: 80587000
ulRAMEnd: 83400000
保存关闭后,我们点击xipport的realloc P,这次关闭掉那四个error!unknown o32 region flags:d0000040错误后,这次没有再弹出错误了,看来空间是足够的了。
十二、这次xipport会等一会儿才会执行完(拖动一下xipport,如果可以拖动就是执行完了),我们再点击write maps,将重新分配模板位置的值写进map.txt。
十三、然后我们进入out目录,打开map.txt查看有没有地址冲突的。如果有冲突的话会显示N个感叹号的。我们搜索一下!!!,结果没有找到,看来是没有冲突的地址(因为我们只是换一个非模块的文件而已,只要空间够的话一般不会和其他模块有冲突的)。难道这样就可以了吧?当然不是,我们看看map.txt最后几行:
80476abc – 80477e8a L000013ce filedata e163825b-6e7b-b284-7373-da8c33ae39cd.dsm
80477e8a – 804e1a3c L00069bb2 NUL
804e1a3c – 804e1a3c L00000000 End: highest physical address
804e1a3c – 804e2000 L000005c4 NUL
804e2000 – 804e2000 L00000000 Start: start of RAM
804e2000 – 80587000 L000a5000 NUL
80587000 – 80587000 L00000000 —— start of RAM free space
80587000 – 83400000 L02e79000 NUL
83400000 – 83400000 L00000000 End: end of RAM
我们再打开刚才备份的map.txt,对比一下:
803e066c – 803e1a3a L000013ce filedata e163825b-6e7b-b284-7373-da8c33ae39cd.dsm
803e1a3c – 803e1a3c L00000000 End: highest physical address
803e1a3c – 803e2000 L000005c4 NUL
803e2000 – 803e2000 L00000000 Start: start of RAM
803e2000 – 803e3000 L00001000 initialized data of region_1 hd.dll
803e3000 – 803e7000 L00004000 initialized data of region_1 osaxst0.dll
803e7000 – 803e8000 L00001000 initialized data of region_1 osaxst1.dll
803e8000 – 803f0000 L00008000 NUL
803f0000 – 803f6000 L00006000 uninitialized data of region_1 nk.exe
803f6000 – 80474000 L0007e000 initialized data of region_2 nk.exe
80474000 – 80487000 L00013000 initialized data of region_1 kd.dll
80487000 – 80487000 L00000000 —— start of RAM free space
80487000 – 83400000 L02f79000 NUL
83400000 – 83400000 L00000000 End: end of RAM
可以发现原本在RAM里有几个模块的,现在没有了(因为我们加大地址然后把那些都挤飞了^_^),我们还要将原本那些模块加回来才可以。不过我们首先处理physlast先。
我们看修改后的map.txt,发现这几行:
80476abc – 80477e8a L000013ce filedata e163825b-6e7b-b284-7373-da8c33ae39cd.dsm
80477e8a – 804e1a3c L00069bb2 NUL
804e1a3c – 804e1a3c L00000000 End: highest physical address
说明physlast从地址80477e8a就已经结束了,后面多出80477e8a – 804e1a3c L00069bb2 NUL来,多浪费啊,我们重新修改一下吧ROMHDR.txt,将physlast修改成刚才实际结束地址再+2(留一点点大小出来比较好),即80477e8a+2=80477e8c,保存退出后再用xipport realloc P、write maps,然后再打开map.txt,这下不浪费了(图30、31)
十四、然后我们对比备份的map.txt来把那几个模块加进去吧
十五、这里有两点是必须要注意的,这是老麦的心得:
1、ulRAMStart一定是physlast的最小1000倍
2、nk的起始偏移量必须是ulRAMStart的10000倍(尤其是这个,很多人不知道,教程里面也没有写这个)
不明白是什么意思?我们接着往下看。
十六、再打开ROMHDR.txt,刚才我们修改了physlast,不过ulRAMStart还没修改,这样同样会浪费,所以我们一样要修改一下,不过这里就注意了,就是上面所说的第一点,这个地址一定是physlast的最小1000倍,即把physlast的千位数加1,后面为0,即physlast是80477E8C,那ulRAMStart就是要80478000才可以,所以把ulRAMStart修改成80478000吧。后面的ulRAMFree同样也会浪费,不过我们要等弄回那几个模块后才能得出ulRAMFree正确而不浪费的地址。
十七、看到十五点的第2个注意事项了吧?nk的起始偏移量必须是ulRAMStart的10000倍!因此,我们先来解决nk模块,因为ulRAMStart的地址80478000,那nk的地址必须是80480000,nk模块比较特别,我们要用专门处理nk模块的软件来解决。
十八、打开M’Reloc_nk.exe
十九、点击Choose module,选择中nk.exe
二十、把803F0000改成80480000,再按Doit!
二十一、进入nk.exe目录(xip_tools\OUT\MODULES\nk.exe),打开imageinfo.txt
我们可以看到备份下来的原版map.txt后面的nk模块有两个地址:
803f0000 – 803f6000 L00006000 uninitialized data of region_1 nk.exe
803f6000 – 80474000 L0007e000 initialized data of region_2 nk.exe
分别是region_1 nk.exe和region_2 nk.exe,region_1就是o32[1].o32_realaddr,region_2就是o32[2].o32_realaddr
所以我们要将这两个地址修改才可以
nk模块的imageinfo.txt里,o32[1].o32_realaddr是这样的:
o32[1].o32_realaddr: P+003F0000
P+003F0000是什么意思呢?我们可以打开ROMHDR.txt看一下,其中有一行是这样的:
physfirst: P=80000000
看到没?P的意思是physfisrt的地址,=80000000
因此nk模块的o32[1].o32_realaddr: P+003F0000的地址就=P+003F0000=80000000+003F0000=803F0000,这个正好是原map.txt里的region_1 nk.exe地址。因此我们刚才已经将nk的起始偏移地址改成了80480000,因此我们要将这里的地址修改,80480000-P=80480000-80000000=00480000,因此我们要把P+003F0000修改成P+00480000,这样就解决掉region_1 nk.exe了,我们接着修改region_2 nk.exe。
二十二、我们看备份下来的原map.txt,可以发现region_1 nk.exe的大小是6000,而region_2 nk.exe的起始地址就是region_1的地址+6000,因此我们只需把刚才计算出o32[1].o32_realaddr的地址480000+6000就是o32[2].o32_realaddr的地址了,即486000,我们把:
o32[2].o32_realaddr: P+003F6000
修改成:
o32[2].o32_realaddr: P+00486000
就可以了
保存好退出imageinfo.txt吧,然后我们用xipport realloc p再write maps一次,看看现在的map.txt是否出现了nk模块
二十三、我们打开map.txt,可以看见RAM里已经出现了nk模块:
80478000 – 80478000 L00000000 Start: start of RAM
80478000 – 80480000 L00008000 NUL
80480000 – 80486000 L00006000 uninitialized data of region_1 nk.exe
80486000 – 80504000 L0007e000 initialized data of region_2 nk.exe
80504000 – 80587000 L00083000 NUL
80587000 – 80587000 L00000000 —— start of RAM free space
80587000 – 83400000 L02e79000 NUL
83400000 – 83400000 L00000000 End: end of RAM
二十四、我们继续将其余的模块加进去吧。我们可以发现nk模块前有8000的空余地方,因此那里应该可以塞进几个小的模块。我们打开备份的原map,可以发现RAM里的hd.dll、osaxst0.dd、osaxst1.dll这几个模块加起来才6000大,因此把这几个放在nk的前面吧:
803e2000 – 803e2000 L00000000 Start: start of RAM
803e2000 – 803e3000 L00001000 initialized data of region_1 hd.dll
803e3000 – 803e7000 L00004000 initialized data of region_1 osaxst0.dll
803e7000 – 803e8000 L00001000 initialized data of region_1 osaxst1.dll
803e8000 – 803f0000 L00008000 NUL
二十五、这些普通模块,我们可以直接用winhex来修改,我们先从hd.dll开始吧,这个模块放在最前面,所以它的地址就是RAM的起始地址(ulRAMStart),即80478000。
二十六、进入hd.dll目录(xip_tools\OUT\MODULES\hd.dll)先打开imageinfo.txt,将o32[1].o32_realaddr: P+003E2000改成o32[1].o32_realaddr: P+00478000。
二十七、然后用WINHEX打开同目录的imageinfo.bin,我们也要在这里把地址修改才可以
二十八、因为16进制的特殊性,里面存放的地址是次序是倒过来的,如AaBbCcDd,那里WINHEX里是显示DdCcBbAa的,因此,hd.dll原本的的地址是803e2000,那在imageinfo.bin里显示应该是00203e80才对,我们搜索一下,很快就到地址
二十九、hd.dll新的地址是80478000,因此应该改成00804780才对,修改吧~然后保存退出,这个模块就解决了~
三十、接着是osaxst0.dll,原本地址是hd.dll+1000=80478000+1000=80479000,所以打开osaxst0.dll里的imageinfo.txt,将o32[1].o32_realaddr: P+003E3000改成o32[1].o32_realaddr: P+00479000,然后用WINHEX打开imageinfo.bin,将00303E80改成00904780
三十一、接着是osaxst1.dll,它的地址是osaxst0.dll+4000=80479000+4000=8047D000,因此打开osaxst1.dll里的imageinfo.txt,将o32[1].o32_realaddr: P+003E7000改成o32[1].o32_realaddr: P+0047D000,然后用WINHEX打开imageinfo.bin,将00703E80改成00D04780
三十二、然后是最后一个模块kd.dll了,这个大小有13000,在前面放不下了,就放在nk.exe的后面吧
三十二、我们打开map.txt,发现nk模块最后的结束地址是80504000,所以这个就是kd.dll的起始地址。打开kd.dll里的imageinfo.txt,将o32[1].o32_realaddr: P+00474000改成o32[1].o32_realaddr: P+00504000,然后用WINHEX打开imageinfo.bin,将00404780改成00405080
三十三、OK~~~解决模块全部调整完毕~~~再次用xipport realloc P、write maps看看吧~~完成后打开map.txt:
80478000 – 80478000 L00000000 Start: start of RAM
80478000 – 80479000 L00001000 initialized data of region_1 hd.dll
80479000 – 8047d000 L00004000 initialized data of region_1 osaxst0.dll
8047d000 – 8047e000 L00001000 initialized data of region_1 osaxst1.dll
8047e000 – 80480000 L00002000 NUL
80480000 – 80486000 L00006000 uninitialized data of region_1 nk.exe
80486000 – 80504000 L0007e000 initialized data of region_2 nk.exe
80504000 – 80517000 L00013000 initialized data of region_1 kd.dll
80517000 – 80587000 L00070000 NUL
80587000 – 80587000 L00000000 —— start of RAM free space
80587000 – 83400000 L02e79000 NUL
83400000 – 83400000 L00000000 End: end of RAM
三十四、已经接近完美了~~~之所以说是接近,因为start of RAM free space(ulRAMFree)之前还有很多没利用上的地址,所以我们要修改ulRAMFree才可以,因为模块最后的结束地址是80517000,所以这个地址就是ulRAMFree的地址了,我们打开ROMHDR.txt,将:
ulRAMFree: 80587000
改成:
ulRAMFree: 80517000
然后再用xipport realloc P、write maps,打开map.txt:
80478000 – 80478000 L00000000 Start: start of RAM
80478000 – 80479000 L00001000 initialized data of region_1 hd.dll
80479000 – 8047d000 L00004000 initialized data of region_1 osaxst0.dll
8047d000 – 8047e000 L00001000 initialized data of region_1 osaxst1.dll
8047e000 – 80480000 L00002000 NUL
80480000 – 80486000 L00006000 uninitialized data of region_1 nk.exe
80486000 – 80504000 L0007e000 initialized data of region_2 nk.exe
80504000 – 80517000 L00013000 initialized data of region_1 kd.dll
80517000 – 80517000 L00000000 —— start of RAM free space
80517000 – 83400000 L02ee9000 NUL
83400000 – 83400000 L00000000 End: end of RAM
哈哈,相当完美嘛~~~
当然最终完不完美要导入xip.bin,成功开的了机才行,我们继续吧,离成功只差一步了~
三十五、点击xipport的build xip_out.bin,然后就会生成一个xip_out.bin,这个就是我们替换后wince.nls的xip来的了。
三十六、接着我们要导入xip_out.bin到os.nb.payload里才可以。将rom目录里的os.nb.payload移到xip_tools目录里。
三十七、我们要先看看os.nb.payload的xip区域是否够大,如果不够大又要扩建XIP才可以。
三十八、用WINHEX打开os.nb.payload
三十九、我们看看000000464这行,看到后面的40060000吧?这个就是os.nb.payload定义的xip起始地址,转换为正确的地址要先倒过来,即00000640,然后这个地址要乘以800才是正确的地址(不要问我为什么乘以800……我也不懂@_@),即640*800=320000(要用计算器在16进制里乘),我们去到地址320000看一下:点击WINHEX下方状态栏的偏移,然后输入320000,再按确定
四十、那行就是xip的标志头了,看来位置对了,我们再返回最前面,看看40060000的后面
四十一、后面就是00090000,这个就是xip的大小
四十二、我们换算一下,00000900*800=480000,这个os.nb.payload的XIP有480000字节大,我们再看看替换wince.nls后的xip_out.bin大小是多少
四十三、可以看见大小是4,685,450 字节,转换成16进制是477E8A,小于480000嘛,太好了,直接将xip_out.bin导入os.nb.payload就可以了嘛。
四十四、在xipport的write xip_out.bin to:下面的两个框填00320000(XIP的起始地址)及OS.NB.payload(要导入的文件名),然后按一下write xip_out.bin就可以了~~~YEAH~~~(这个过程很快的,留意os.nb.payload的修改时间,变化了就成功了)
四十五、XIP终于完成了~~~我们将os.nb.payload移回ROM目录,然后直接制作ROM刷机吧~
四十六、刷机……祈祷吧……(菜鸟就只能祈祷了,呵呵)
四十七、成功进行系统~YEAH~(XIP有问题一般会死在第一屏),看看区域里,是不是有中国了?
终于完成了……超累……写一个教程比自己做一个出来要花10倍时间啊……
看来下一篇中文化ROM就更长时间了……可能要2、3天吧……累……
os.nb.payload文件中, 起始地址及大小并不是实际在ROM的偏移地址,而是以扇区为单位,我们要转换成实际的地址及大小的话,就要将那里的数值乘以扇区大小.
扇区大小的查看很简单,就是看MSFLSH50的起始偏移地址是多少,touch pro的ROM的MSFLSH50起始地址是0x800,因此扇区就是800。
所以LZ查看os.nb.payload文件里的大小时, 要乘以800.
谢谢你的提醒,这篇文章是比较早之前写的,后面还有一篇《重构os.nb.payload教程(扩建/缩小XIP区域、缩小/删除UDLR、前移IMGFS等)》,有兴趣可以看看:http://bbs.rombeta.com/viewthread.php?tid=17519&highlight=