9053|26

90

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

CE6下应用使用驱动回传过来的内存地址问题! [复制链接]

软硬件环境:WinCE6 + Pxa310/300

问题:
一个测试overlay2的小应用,在CE5下面使用没有问题,但是CE6下面使用的时候会出现异常。具体是这样的,应用中通过如下方式获得显示驱动回传过来的地址指针,
ExtEscape(m_hdc,GET_OVERLAY2_ADDRESS,0,NULL,sizeof(XLLP_OVERLAY_T),(char *)pXllpOverlay);  //get address

然后操作这个指针pXllpOverlay回传过来的内存地址,就可以在overlay2上显示颜色和图像了。

现在在CE6下面直接操作这个地址就出现了异常,知道CE6在安全性方面有提高,在网上查了一下,说是驱动如果要使用应用传下来的内存地址的时候需要使用这个函数
CeOpenCallerBuffer()
进行重新映射。但是没说应用如何使用驱动回传过来的地址指针。

我在应用里面也试着调用CeOpenCallerBuffer重新map驱动回传过来的地址,从打印的地址消息来看,地址确实已经重新map了,但是使用的时候还是会出现异常。

请高人指教!!谢谢!

最新回复

留个记录  详情 回复 发表于 2010-6-30 20:02
点赞 关注

回复
举报

79

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
WinCE6.0中应用程序直接访问物理空间的方法跟WinCE5.0下的不一样了。
目前我采用的解决方法是通过VirtualCopyEx做这个事情,在应用程序中申请一段内存空间,通过驱动程序将该空间映射到特定的物理空间上。通过这种方法就可以直接写显存了。
具体方法请参考
[url=http://www.cnblogs.com/we-hjb/archive/2010/02/25/1673815.html][/url]
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
H大侠在啊,非常感谢给出提示,我试试先!
 
 
 

回复

88

帖子

0

TA的资源

一粒金砂(初级)

4
 
这个帖关注一下,以后用得到!
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

5
 
关注,这个问题我也遇到过
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

6
 
H大侠的这个方法是可行的,但是对于我这个问题可能还不行,因为我无法明确的知道我要操作的物理地址空间,overlay2是通过
ExtEscape(m_hdc,GET_OVERLAY2_ADDRESS,0,NULL,sizeof(XLLP_OVERLAY_T),(char *)pXllpOverlay);
拿到驱动回传过来的一个显存的虚拟地址,然后直接操作这个地址来显示图像的。

但是这个显存的虚拟地址是动态分配的,我怎么样去反向的得到它的物理地址呢?

还请各位大侠赐教!!!
 
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

7
 
如果所占内存并不大的话,楼主可以考虑在内存中保留一段空间做该特定的用途。
驱动中使用内存映射的方法往里填,应用中也可以通过前面所说的方法取。
楼主可以考虑一下。
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(中级)

8
 
H大侠,我已经在驱动里面将overlay2的地址固定了,现在能够准确的知道我需要使用的物理地址空间。

但是现在出现了一个link问题了:
你通过KernelIoControl来进行虚实地址的转换,那么这个转换肯定是在OAL里面完成了,就是说这个IoCTL的case肯定是在OAL的代码里面添加的,但是这个函数VirtualCopyEx()是在coredll.lib里面的,这样的话OAL必须link这个coredll.lib,但是OAL实际上不能够link coredll.lib啊。把coredll.lib添加到OAL的source文件之后,link出错。

BUILD: [01:0000000138:ERRORE] nkstub.lib(nkstub.obj) : error LNK2005: NKDbgPrintfW already defined in coredll.lib(COREDLL.dll)

请问H大侠,你是如何做到的呢?
请指教,谢谢!!
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

9
 
H大侠帮忙解一下惑啊!!

没有其他人在做pxa310+wince6的吗?给点参考意见,感激不尽啊!!!
 
 
 

回复

63

帖子

0

TA的资源

一粒金砂(初级)

10
 
KernelIoControl和VirtualCopyEx 应该放在驱动中吧。驱动连接COREDLL.dll应该没有啥问题吧。
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

11
 
引用 1 楼 sunrain_hjb 的回复:
WinCE6.0中应用程序直接访问物理空间的方法跟WinCE5.0下的不一样了。
目前我采用的解决方法是通过VirtualCopyEx做这个事情,在应用程序中申请一段内存空间,通过驱动程序将该空间映射到特定的物理空间上。通过这种方法就可以直接写显存了。
具体方法请参考
http://www.cnblogs.com/we-hjb/archive/2010/02/25/1673815.html


应用程序中申请的空间是在驱动里进行映射的,为了使用方面,移植一个OALIOCTL驱动。
这样在应用程序中可以直接调用KernelIoControl,进行内存映射。

也就是说VirtualCopyEx是在驱动中调用的,
KernelIoControl是在应用中调用的,
这个工作与OAL基本无关。
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

12
 
KernelIoControl的case是在OAL中实现的吧,也就是说VirtualCopyEx是在OAL中实现的,如果是在驱动里面实现的话,应该使用DeviceIoControl吧?

 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

13
 
[url=http://www.cnblogs.com/we-hjb/archive/2010/02/25/1673815.html][/url]

呵呵,楼主说的没有错,一般是在OAL中实现的,但实际上并不都是在OAL中实现,中间有一个叫做OALIOCTL的驱动的。我建议放在这个里面去做。
你可以再看一下上面那篇BLOG。
 
 
 

回复

62

帖子

0

TA的资源

一粒金砂(初级)

14
 
H大侠:
“更为方便的方法是移植一个OALIOCTL,并在IOControl()中添加一个case。。。”

这个能详细说明一下吗?

我把public下面的OALIOCTL这个lib挪到BSP的drivers下面了,并生成了一个dll,然后用builtin的方式加载了这dll,在应用那边调用KernelIoControl的时候出错,error code是整数50,
50             The network request is not supported.          ERROR_NOT_SUPPORTED

从error code来看,这个操作不支持啊。

请大侠指教是如何移植的OALIOCTL,谢谢!!!
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

15
 
需要在OALIOCTL添加相应的case,否则就会出现你所说的情况。
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

16
 
引用 14 楼 sunrain_hjb 的回复:

需要在OALIOCTL添加相应的case,否则就会出现你所说的情况。


这个case我已经添加了。

我是把WINCE600\PUBLIC\COMMON\OAK\OALIOCTL下的东西移植到了BSP的drivers下面,编译生成了DLL,然后用builtin的方式加载了,请问是这样的吗?

如果是这样的话,这个OALIOCTL还是一个驱动啊,用KernelIoControl怎么会走到驱动里面去呢??

小弟愚钝,请H大侠指教!

另外,
6     if(dwPhyBaseAddress&0xFFF)
7     {
8         return NULL;
9     }
10     vced.dwPhysAddr = dwPhyBaseAddress>>8;

对于这个物理地址为什么要做这样的处理呢????右移之后传下去系统识别不了啊。

 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

17
 
这个驱动好像不需要放在builtin里吧。
其实编译系统时本身就有这个,只是用我们修改好的代替而已。

至于物理地址的映射方法请参考,CE有这样的要求。

PAGE_PHYSICAL
Used to map a physical memory region. When using this flag, divide the physical address, that is, lpvSrc, by 256. Memory mapped with PAGE_PHYSICAL is not freed until the device is rebooted. Calling the VirtualFree function does not free this mapped physical memory. This flag is used with dedicated hardware buffers, so it cannot be freed after being mapped.
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

18
 
[url=http://download.eeworld.net/source/2171791][/url]

楼主下载这个试试看吧,我在模拟器上测试时用的源代码。
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

19
 
也不会这个东西,学习了。
 
 
 

回复

87

帖子

0

TA的资源

一粒金砂(初级)

20
 
无满意答案结贴,给分!
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
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
快速回复 返回顶部 返回列表