2892|7

72

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

请教一个EBoot下载地址问题 [复制链接]

在DownloadImage函数中,有如下的一段代码,我搞不明白这里为什么给地址赋的是接收长度,而不是地址呢?
            if (*(UINT32 *)(pCurDownloadFile->dwRegionStart + ROM_SIGNATURE_OFFSET) == ROM_SIGNATURE)
            {
                // Contain the kernel?
                if (IsKernelRegion(pCurDownloadFile->dwRegionStart, pCurDownloadFile->dwRegionLength))
                {
                    *pdwImageStart  = pCurDownloadFile->dwRegionStart;
                    *pdwImageLength = pCurDownloadFile->dwRegionLength;
                    *pdwLaunchAddr  = dwRecLen; //这里为什么给地址赋的是接收长度????
                }
            }

按道理*pdwLaunchAddr存的应该是OS的启动地址才对,这里为啥是接收长度呢?

最新回复

和WINCE的BIN文件格式有关  详情 回复 发表于 2008-2-28 21:20
点赞 关注

回复
举报

69

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
单纯这一段代码,看不出什么头绪。
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
在DownloadImage函数中,有如下的一段代码,我搞不明白这里为什么给地址赋的是接收长度,而不是地址呢?
                        if   (*(UINT32   *)(pCurDownloadFile-> dwRegionStart   +   ROM_SIGNATURE_OFFSET)   ==   ROM_SIGNATURE)
                        {
                                //   Contain   the   kernel?
                                if   (IsKernelRegion(pCurDownloadFile-> dwRegionStart,   pCurDownloadFile-> dwRegionLength))
                                {
                                        *pdwImageStart     =   pCurDownloadFile-> dwRegionStart;
                                        *pdwImageLength   =   pCurDownloadFile-> dwRegionLength;
                                        *pdwLaunchAddr     =   dwRecLen;   //这里为什么给地址赋的是接收长度????
                                }
                        }

按道理*pdwLaunchAddr存的应该是OS的启动地址才对,这里为啥是接收长度呢?



不知道写的什么?
哪儿来的?
 
 
 

回复

95

帖子

0

TA的资源

一粒金砂(初级)

4
 
分析程序都是重头开始的,单独分析一段你觉得有意义吗,EBOOT是个很大的程序,其中单独的一个变量随时可能变化,而且你怎么知道那个是接受长度呢,就算是,有什么不可以吗,
 
 
 

回复

82

帖子

0

TA的资源

一粒金砂(初级)

5
 
不好意思,是微软写的代码中...\Wince500\public\common\oak\drivers\ethdbg\blcommon\blcommon.c文件下的一个函数叫DownloadImage
 
 
 

回复

92

帖子

0

TA的资源

一粒金砂(初级)

6
 
估计是要看过EBoot代码的人才会明白,希望有人帮忙,谢谢啦
 
 
 

回复

47

帖子

0

TA的资源

一粒金砂(初级)

7
 
我的4.2的版本中找到类似的一段代码,你注意看看注释部份,也许会给你些启发。
                // read records (start with address, length, and checksum)
                while (OEMReadData (sizeof (DWORD), (LPBYTE) &dwRecAddr)
                        && OEMReadData (sizeof (DWORD), (LPBYTE) &dwRecLen)
                        && OEMReadData (sizeof (DWORD), (LPBYTE) &dwRecChk)) {
       
                        // check for last record
                        if (!dwRecAddr && !dwRecChk) {
       
                                // if this is the kernel region, update launch address
                                if (IsKernelRegion(dwImageStart, dwImageLength)) {
                                        *pdwImageStart  = dwImageStart;
                                        *pdwImageLength = dwImageLength;
                                        *pdwLaunchAddr  = dwRecLen;
                                }
       
...

我理解是这样的(仅供参考):先接收地址、长度、与校验位。检查如果if (!dwRecAddr && !dwRecChk),那么表明是最后一个记录块,而这时的dwRecLen即为LanuchAddr地址。如果不成立,也就是说当前得到的记录不是最后一个记录块,紧跟在后面的代码是正常接收数据的功能。
你可以找个4.2版本的该函数看看。
 
 
 

回复

64

帖子

0

TA的资源

一粒金砂(初级)

8
 
和WINCE的BIN文件格式有关
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表