Windows Mobile系统ROM定制指南(三)
- 来源:微型计算机 smarty:if $article.tag?>
- 关键字:Windows Mobile,系统,ROM smarty:/if?>
- 发布时间:2010-12-02 13:58
在前两期文章中,我们详细介绍了Windows Mobile系统(以下简称“WM”)的ROM定制的相关知识、操作术语以及ROM定制所需的工具,并通过实例分析了ROM的主要结构。在此基础之上,本期将教大家如何实现WM系统ROM移植以及制作OEM。需要说明的是,ROM移植是一项非常复杂的工作,除了要熟练掌握各种ROM制作工具外,还要对各机型的硬件以及ROM具有一定了解,方可进行移植。
ROM移植
Imgfstools下的ROM移植
在imgfstools下的ROM移植主要是对XIP和SYS的移植,由于imgfstools不具备自动移植的功能,所以很多工作需要玩家手动完成。
XIP移植
XIP即eXecute In Place的缩写,是WinCE核心部分。在微软的定义中,这块区域是以非压缩格式存放的,无需加载,由Bootloader直接调用执行。不同机型的XIP中OEMXIPKernel不同,而移植的目的是将低版本的Windows Mobile系统升级到高版本,即替换XIP中的MSXIPKernel。
●Step 1:获取XIP.BIN
XIP.BIN文件获取方式有很多,下面主要介绍用OSNBTools来获取XIP的方式,具体指令为“osnbtool -sp os.nb”。
从图1中可以看到OS.NB文件已经被分解为纯OS镜像文件:os.nb.OS.NB。分区1为XIP部分,分区2为IMGFS部分。下面先导出XIP部分,输入“osnbtool -d os.nb.OS.NB 1 xip.bin”,得到了xip.bin文件(图2)。
●Step 2:移植XIP
利用XIPPort,点击dump xip.bin(图3 ),得到OUT 文件夹。先按writema p s 纪录修改前面的地址,将MAP.txt文件另存后再按make pkgs进行整理。替换除OEMXIPKernel文件夹之外的其它文件后,按“undo”→“realloc P”重排地址。若提示出错,可能是地址重排时出现地址重叠,只要按照之前另存的MAP.txt文件中的顺序,按照新替换的文件大小,重新计算后修改新替换文件的imageinfo.txt中的地址“e32_vbase:”和“o32[1].o32_realaddr:”,然后再次进行realloc P地址重排即可。有时出错是因为替换的新文件超过原来的限制,这时有两个方法:一是删除并不需要的文件后再重排地址;二就是对XIP的大小进行扩容,具体操作为:
打开romhdr.txt,我们主要修改这几个内容:
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,若没有再报错,则说明空间足够大了。点击write maps,将重新分配模板位置的值写进map.txt。然后再进入out目录,打开map.txt查看有没有地址冲突。如果有冲突,需要修改新替换文件的imageinfo.txt中的地址。
对比修改前后的map.txt文件,可以发现原本在RAM里有几个模块而现在没有了。这是因为加大地址后把那些文件都挤出了地址范围,为此我们要将这些模块加回来。
此外,从修改后的map.txt文件中不难看出physlast从地址80477e8a就已经结束了,后面多出“80477e8a - 804e1a3cL 0 0 0 6 9 b b 2 N U L”,重新修改一下ROMHDR.txt,将physlast修改成80477e8c,保存退出后再用xipport realloc P、writemaps。打开ROMHDR.txt,把ulRAMStart修改成80478000。
接下来需要往map.txt中加入nk、hd.dll、osaxst0.dd和osaxst1.dll模块,最后用xipport realloc P、write maps处理,得到如下结果:
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
点击xipport的build xip_out.bin,会生成一个xip_out.bin,这就是替换后的新XIP了,接着我们要导入xip_out.bin到os.nb.payload里。如图4所示,在xipport的“write xip_out.bin to:”两个框填00320000(XIP的起始地址)及OS.NB.payload(要导入的文件名),然后按一下write xip_out.bin就可以了。
SYS移植
SYS的移植其实很简单,不管从任何渠道得到的SYS文件,只需要保留原SYS文件夹中的.VM和.ROM文件夹即可,其余部分可以完全替换。
PRB模式下的ROM移植
前文已反复多次提到,在PRB模式下可自动移植并对模块文件进行重新排列,那么在PRB模式下进行ROM移植将会是一件非常简单的事情,这也是为什么众多的ROM爱好者喜欢用PRB生成ROM的原因之一。在PRB模式下,仅需替换掉MSXIPKernel内的所有文件,即可完成ROM移植。
制作OEMOEM Package是ROM模板的关键部分,通过选择不同的OEM Package可以定制出不同的ROM,接下来我们将介绍如何将软件的cab安装包制成OEM Package。
一个完整的OEM Package应包括如下内容:软件自身所需文件、快捷方式(非必要,视软件而定)、dsm文件(不可缺)、rgu(注册表文件,非必要,视软件而定)、initflashfiles.txt(主要用于指定刷机文件的存放位置,非必要,视软件而定)、option.xml(用于系统加载该OEM Package以及显示相关内容,不可缺)。下面我们以PHMRegistry Editor V0.70为例,来介绍如何将该软件的cab安装包regedit.Mrln_ARM.CAB转换成OEM Package。值得一提的是,PHM Registry Editor是一款免费的PPC注册表编辑软件,从网上下载该软件的cab安装包(选PocktPC 2002/2003,ARM/PXA)。
在将Cab转换成OEM之前,必须获取GUID(UUID)码以及解压cab包的软件。首先,GUID是Globally Unique IDentifier的缩写,每个OEM Package都有一串唯一的GUID码用于系统识别,玩家可以在特定网站(网址为http://www.famkruithof.net/uuid/uuidgen)来获取所需的GUID码。具体方法为,登录网站并在“Get”按钮旁选“Version1:Time/Nodebased”或者“Version4:Random”,然后点击“Get”按钮则会自动生成GUID(图5),将该串GUID码(本文为2e7230bd-1d2e-4c59-8643-85fee5d5f86b)记下。接着是解压cab包的软件。Ocp Software公司出品的WinceManager或CabWUZ均可以用于解压cab包。在下面的例子中,我们将通过CabWUZ软件把regedit.Mrln_ARM.CAB转换成OEM Package。
一个命名为“2e7230bd-1d2e-4c59-8643-85fee5d5f86b.dsm”(即GUID码.dsm),另一个命名为“2e7230bd-1d2e-4c59-8643-85fee5d5f86b.rgu”(即GUID码.rgu)。Step 7:用记事本打开.rgu文件,然后另存为Unicode格式。这点很重要,否则在BuildOS执行时会出错。
Step 8:若用WinceManager替代cabWUZ软件打开regedit.Mrln_ARM.CAB文件,则通过Export to reg功能直接将注册表信息导出。
Step 9: 从Files目录可以看出,regedit.exe是个可执行文件,因此需要为它建立一个快捷方式,使之可以方便地被调用。由于所有OEM Package的文件都会被放置在Windows目录下,所以regedit.exe的路径是“Windows
egedit.exe”。在PHM Registry Editor目录下,新建一个TXT文件,然后输入“#"Windows
egedit.exe"”并存盘退出,将该TXT文件重命名为“PHM RegEdit.lnk”。
Step 10:在PHM Registry Editor目录下,新建一个TXT文档并重命名为“initflashfiles.txt”,输入以下内容:
;Start PHM RegEdit
;===========================================
Directory("WindowsStart MenuPrograms"):-File("PHM RegEdit.lnk","WindowsPHM
RegEdit.lnk")
;===========================================
;End PHM RegEdit
这段代码的意思是将Windows目录下的PHM RegEdit.lnk复制到“WindowsStartMenuPrograms”目录下。输入完成后将initflashfiles.txt保存为unicode格式。Step 11:BuildOS.exe是通过option.xml来加载OEM Package的,如果没有option.xml,则该OEM Package不会被加载。同样地,新建一个TXT文档并重命名为“option.xml”,输入以下内容:
<?xml version="1.0″ encoding="UTF-16″ standalone="yes"?>
Step 12:至此PHM Registry Editor的OEM Package已经全部建好。除了软件本身的9个文件外,加上dsm、rgu、initflashfile、shortcut以及option.xml,总共14个文件。如果软件本身不带注册表信息,如绿色软件,可以不用建rgu文件。同样地,快捷方式和iniflashfiles都是可选项。
Step 13:将PHM Registry Editor文件夹复制到“My_ROM_KitchenOEM”目录下,总算大功告成。
写在最后
虽然ROM定制这种玩法经历了较长时间的发展,但不少工具的操作依然比较复杂,甚至连图形界面也没有。正因为如此,对于新手而言往往很难上手,建议大家刚开始定制ROM时找有经验的老手协助,或在专业论坛上向他人多多请教。俗话说“有志者事竟成”,大家不妨放手尝试一下制作自己的个性ROM,祝大家早日做出自己喜欢的ROM。
关注读览天下微信,
100万篇深度好文,
等你来看……