解决V-KLAY打补丁时因为彼此覆盖使升级失败的问题

VKP补丁虽然可以对小八的功能进行补充,但是如果补丁打多了就有可能因为彼此不兼容或者是版本不对而产生覆盖,使升级不成功 。即使有的暂时正常使用,但如果在特定条件下使用到被非法覆盖的部分是就会产生问题,使机器不稳定 。下面是我的一点解决办法,主要解决的是本来在ROM中应该是空的地方却有了代码的问题(也就是补丁中xxxxxx:FFFFFFFFFFFF->xxxxxxxxxxxx的部分),其表现为V-KLAY提示读取的数据跟补丁里原始数据不符,如果这时选择强行刷新,就会覆盖原来的代码,成为手机的不稳定因素 。我的解决的方法是换到别的空白单元写代码 。
下面是一个例子,手机的FLASH版本是“6688-V55 25旋转菜单中文版”,要打得补丁是“来电同时显示姓名和电话号码 ”,首先看一下原补丁的代码:
=======================================
361E2F:D6B21C BF0005〈==原来的程序里要修改的代码
1F0500:FFFFFFFFFFFFFFFF DAD6B21CE6FC1000 《=添加到空单元的代码
1F0508:FFFFFFFFFFFFFFFF E6FF412CD7400C00
1F0510:FFFFFFFFFFFFFFFF F3F23D2C5C112D12
1F0518:FFFFFFFFFFFFFFFF CC00D7400C00A98F
1F0520:FFFFFFFFFFFFFFFF F13269312D027C44
1F0528:FFFFFFFFFFFFFFFF 08F166F40F00F0E4
1F0530:FFFFFFFFFFFFFFFF 46FE0F002D03BB04
1F0538:FFFFFFFFFFFFFFFF 29213DEFDB00FFFF
1F0540:FFFFFFFFFFFFFFFF 88C0881088F006FE
1F0548:FFFFFFFFFFFFFFFF 0D02E00DDAB304DF
1F0550:FFFFFFFFFFFFFFFF 98F0981098C008C6
1F0558:FFFF CB00
=============================================
如果这时候你读取补丁再“Apply patch” V-KLAY就会警告读取的内容与补丁数据不符合,如果强行就会埋下隐患 。所以这里取消升级
下面就看一看flash里面是什么样子,用W32dasm打开6688v55 25 bin文件,找到地址361E2F,如下
:00361E2E DAD6
:00361E30 B21C
从2F开始的单元为D6B21C与补丁文件相符,再找地址1F0500,如下
:001F04FE 05002C0805
:001F0503 002C09
......从1F0500开始已经有代码了,不是FFFFF...的空单元了,所以才会报错 。
那么下面我们就开始动手做了 。首先在W32dasm显示的flash内容中就近(001F0500附近)找到足够大小的空单元,容纳1F0500到1F0558的内容,发现往上到001F0354附近有大片的空白单元(内容为FFFFFFFFFFFFFFFFF......) 。
经计算1F0559-1F0500为59(16进制)个字节,从001F0354开始就已经有足够的空间容纳新添的代码了,于是就从001F0354开始写代码(注意选开始地址数值要选择双数) 。打开一个新的文本文件,按原补丁数据不变,仅将地址值改为新的对应值,如下:
1F0354:FFFFFFFFFFFFFFFF DAD6B21CE6FC1000
1F035c:FFFFFFFFFFFFFFFF E6FF412CD7400C00
1F0364:FFFFFFFFFFFFFFFF F3F23D2C5C112D12
1F036c:FFFFFFFFFFFFFFFF CC00D7400C00A98F
1F0374:FFFFFFFFFFFFFFFF F13269312D027C44
1F037c:FFFFFFFFFFFFFFFF 08F166F40F00F0E4
1F0384:FFFFFFFFFFFFFFFF 46FE0F002D03BB04
1F038c:FFFFFFFFFFFFFFFF 29213DEFDB00FFFF
1F0394:FFFFFFFFFFFFFFFF 88C0881088F006FE
1F039c:FFFFFFFFFFFFFFFF 0D02E00DDAB304DF
1F03A4:FFFFFFFFFFFFFFFF 98F0981098C008C6
1F03Ac:FFFF CB00
现在新代码就改好了,可是还没有完,补丁里面361E2F:D6B21C BF0005 中的BF0005也要作相应的变动 。要怎么变呢?看看原来补丁里面就知道了0005其实就是原来地址1F0500里的0500,为什么要写成0005而不是实际的0500呢?因为机器里面数值存储是先存低位再存高位 。于是就把BF0005改称BF5403,这是我们的新地址,同样要先低位后高位,至于BF是什么用的就先不管他了,猜想也是跳转或条件处理什么的 。当然如果代码中还有其他的新地址相关的也要统统改过来 。看看汇编代码,不认识也可以猜出来 。这样,我们的新补丁就做好了,像这样:

推荐阅读