modernhill
驱动小牛
驱动小牛
  • 注册日期2004-05-12
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分98分
  • 威望278点
  • 贡献值0点
  • 好评度172点
  • 原创分0分
  • 专家分0分
阅读:2166回复:3

CE6 应用程序与驱动内嵌指针传递 在驱动线程中导致异常

楼主#
更多 发布于:2009-06-10 19:05
CE6的IIC驱动中的一个问题:

在应用程序中通过DeviceIoControl传指针给驱动程序,其中包含内嵌指针,驱动程序和驱动程序线程(加载时开启)通过一个全局变量进行参数的传递,但是在驱动程序线程的操作过程中有的时候通过这个全局变量读到的数据会变掉(难道虚拟地址到物理地址的映射改变?),而且有的时候会引起异常, 查了一些资料,说是这种情况属于异步访问,要用到CeOpenCallerBuffer和CeAllocAsynchronousBuffer来处理内嵌指针,但是不知道怎么处理,也不清楚为什么,哪位兄弟可以指点一下?



fishly_0
驱动小牛
驱动小牛
  • 注册日期2005-09-10
  • 最后登录2016-01-09
  • 粉丝1
  • 关注0
  • 积分51分
  • 威望466点
  • 贡献值0点
  • 好评度86点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2009-06-10 19:33
ce6还没有怎么研究过,不过你这种我感觉是指针地址的问题。应用程序地址空间的指针是不能直接给驱动层使用的。其实说到底就是地址空间的问题了。
modernhill
驱动小牛
驱动小牛
  • 注册日期2004-05-12
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分98分
  • 威望278点
  • 贡献值0点
  • 好评度172点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2009-06-12 16:35
我觉得应该也是指针的问题,但是需要怎么改呢?楼上的兄弟可以提个方向吗?
modernhill
驱动小牛
驱动小牛
  • 注册日期2004-05-12
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分98分
  • 威望278点
  • 贡献值0点
  • 好评度172点
  • 原创分0分
  • 专家分0分
地板#
发布于:2009-06-15 14:10
已经解决,希望对遇到此问题的兄弟有所帮助:
在驱动的IoControl函数中对内嵌指针加入CeOpenCallerBuffer和CeAllocAsynchronousBuffer对应用程序传下来的BUFFER进行重新映射,对一般指针(不是内嵌指针),操作系统会自动进行映射,不需要在驱动中再加处理。另外,微软提供了MarshalledBuffer_t类,用起来更方便一些,呵呵
游客

返回顶部