通常一个WM系统的ROM由SPL(装载系统、CID检测等)、IPL、OS(操作系统)、Splash(开机画面)、RADIO(无线部分)、ExtROM等多个部分组成。在这里笔者以多普达S505的ROM为例,简单分析其结构。看过本节之后,相信大家都能把自己购买的新手机的配置文件添加到NBHUtil、htcrt、NBHextract等解包工具中。
下载的EXE文件可以用WINRAR打开并且解压出来,其中RUU_signed.nbh是ROM,其余文件是刷机软件。先解压RUU_signed.nbh到一个新文件夹中。如图1所示,打开NBH Utility软件,点击Extract NBH选项,在NBH To Extract一栏选上刚解压的RUU_signed.nbh,点击“Go!”按钮。再点击图1的③处,可得到0_SPL.nb、1_Splash.nb、2_SubSplash.nb、3_Unknown-785.nb、4_OS.nb、5_Unknown-2560.nb等文件。
图1
用WINHEX打开RUU_signed.nbh.payload文件,如图2所示,1FF之前交代了机型定义、文件版本以及组成NBH有几个模块、各自的起始位置、文件大小等。
图2
如今我们需要在NBHUtil.xml文件中添加S505,具体配置如下:
<device name="HTC S505" chunksize="64">
<ModelID>VOGU21000</ModelID>
<CID>DOPOD701</CID>
<Ver>1.73.706.2</Ver>
<Lang>CHS</Lang>
<Item value="0x200">SPL</Item>
<Item value="0x600">Splash</Item>
<Item value="0x601">SubSplash</Item>
<Item value="0x311">Unknown-785</Item>
<Item value="0x400">OS</Item>
<Item value="0xA00">Unknown-2560</Item>
</device>
OS.nb.payload有点类似于一个已经安装操作系统的磁盘镜像。要弄清OS.nb.payload,笔者认为有两个关键标记一定要记住,一个是E9FDFF00(OS跳转标记),另外一个是MSFLSH50。为什么说这两个地方要记住呢?因为MSFLSH50的偏移地址就是扇区大小,这分为两种情况:一种是MS标准的OS.NB。在一个MS标准的OS.NB里面,扇区大小只有2种可能,要么是200,要么是800,就是说MSFLSH50只可能出现在200或者800的偏移位置。另一种是非MS标准的OS.NB。其实也是在标准的OS.NB上进行插值处理,通常是插入0x8或者0x8的倍数的冗余数据,目的是对数据进行冗余性的编码来防止数据的丢失、错误。如此一来,往往会造成MSFLSH50没有出现在200或者800的偏移位置上,这就需要使用NBSpilt了。
要修改OS.nb.payload,必须先了解其主要结构。该文件通常由4个部分(ULDR、XIP、IMGFS和FAT)组成。
1.ULDR(Update Loader)。ULDR只是在更新时需要使用(包括ULDR的自我更新),有图形界面,显示驱动是uldrui.dll,分区为PART_BOOTSECTION(0x20)格式。在结构上,ULDR是一个独立的分区. 是ImageUpdate重要一环。ULDR只包含小尺寸的必要代码,可以读写系统分区和用户分区实现动态更新。IPL根据用户按键或者UpdateBin.exe设置,有选择的进入ULDR。
2.XIP(eXecute In Place)是WinCE的核心部分。在微软的定义中,这块区域以非压缩格式存放,不需加载,由Bootloader直接调用执行。但因为现在都是NAND ROM,所以XIP模块依然需要调入RAM的PAGEPOOL执行。
3.IMGFS好比是操作系统的镜像快照,XIP启动后就可以访问IMGFS文件系统上的所有文件了。IMGFS可以是XPR或LZX压缩格式(取决于XIP里面的cecompr.dll),系统访问上面的文件会自动解压到RAM。因为普通PE文件调入RAM执行要进行地址重定位,为了提高效率,IMGFS中的文件可以是重定位好的模块形式,这些程序运行就不用再重定位了,直接调入RAM中保留的PagePool(缓冲池)执行。
4、FAT操作系统引导记录区。有些机型没有FAT部分,若遇到这种情况的话,那么ULDR部分可以在定制时完全删除。
OS.nb.payload的0x1BE至0x1FD部分是DPT部分,定义了刚才4部分的起始位置、大小等内容。