易语言教程_易语言源码_易语言写挂_易语言论坛_看流星社区

 找回密码
 注册
零基础辅助入门教学 原创 高清 专业课程售后(每日解答)
零基础辅助入门教学 原创 高清 专业课程售后(每日解答)
零基础辅助入门教学 原创 高清 专业课程售后(每日解答)
零基础辅助入门教学 原创 高清 专业课程售后(每日解答)
零基础辅助入门教学 原创 高清 专业课程售后(每日解答)
零基础辅助入门教学 原创 高清 专业课程售后(每日解答)
赞助广告位 请点击这里联系站长 QQ20209081
赞助广告位 请点击这里联系站长 QQ20209081
赞助广告位 请点击这里联系站长 QQ20209081
查看: 400|回复: 0

驱动程序与应用程序之间共享内存

[复制链接]
发表于 2017-4-5 16:00:32 | 显示全部楼层 |阅读模式
  随手写点自己碰到的问题。在写内核模式的驱动程序时,经常需要做的就是驱动程序和应用程序之间的通信。如应层程序和驱动程序之间共享事件来完成同步,事件可以有应用程序来创建然后将其句柄下发到驱动程序中,驱动程序进行引用等操作,就可以实现共享事件了。这里就不说这个了,主要说说驱动和应用程序之间的共享。

  共享的方式有很多,我们在应用层编程时,也经常需要进程之间共享内存。可以用过SendMessage,文件映射等。也可以用dll来进行共享。用dll进行共享,大家应该知道#pragma data()这个宏,在这个宏中声明的变量就可以共享了,是系统级全局变量,但是必须进程之间引用的是同一个dll文件。在驱动进行内存的共享,也可以通过使用文件映射的方式来实现。这个在后续中文章中描述。

  我在这里就说一种很简单的方式来实现内存的共享。可以分成一个步骤来实现。

  1.我们在驱动中首先分配一段内存空间:

  //当然这里也可以用其他的函数,但是一定要是Nonpaged即非分页内存。

  pShareMemory=ExAllocatePool(Nonpaged,BUFFER_SIZE);

  //具体参数忘记了,查ddk。分配一个MDL结构并初始化它。

  Mdl=IoAllocateMdl(pShareMemroy,....);

  //重新对MDL结构进行赋值等。

  MmBuildMdlForNonpagedPool();


  这样我们就完成了对共享内存分配等操作。

  2.在驱动中我们对共享内存的写操作。我们直接对gShareMemory内存进行操作就可以。可是使用memcpy等操作。就不详细说明了。


  3.在应用程序中获得共享内存地址。

  pchar pbuffer=NULL;//通过使用

  DeviceIoCtrl(hdev,IO_GET_SHAREMEM,NULL,0,&pbuffer,sizeof(pvoid),&dwret,NULL);

  //如果返回成功,那么pbuffer就得到了共享内存的地址,可以直接对其操作。


  4.驱动是怎么将共享内存地址给应用程序的。

  //将内存映射到用户层进程空间中。

  UserVirtualAddress=MmMapLockedPagesSpecifyCache(Mdl,Usermode....);

  //就这样驱动程序和应用程序实现的内存的共享。在OSROnline上有个实例,有兴趣可以看看。

  *((PVOID*)Irp->AssociaedIrp.SystemBuffer=UserVirtualAddress;
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|看流星社区  |网站地图

GMT+8, 2017-9-27 00:07 易语言论坛 易语言导航

Powered by 看流星社区 X3.2

©2011-2016 最好的辅助编程技术论坛

快速回复 返回顶部 返回列表