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

摘要:
例如,可以在层程序和驱动程序之间共享事件以完成同步。应用程序可以创建事件,然后将其句柄发送给驱动程序。驱动程序可以参考和其他操作,主要讨论驱动程序和应用程序之间的共享。但是,进程之间必须引用相同的dll文件。它也可以通过使用文件映射来实现。我将在这里介绍一种实现内存共享//重新设计MDL结构的非常简单的方法。2.在驱动程序中,我们写入共享内存。

http://blog.csdn.net/whf727/article/details/2592267

  随手写点自己碰到的问题。在写内核模式的驱动程序时,经常需要做的就是驱动程序和应用程序之间的通信。如应层程序和驱动程序之间共享事件来完成同步,事件可以有应用程序来创建然后将其句柄下发到驱动程序中,驱动程序进行引用等操作,就可以实现共享事件了。这里就不说这个了,主要说说驱动和应用程序之间的共享。  

  共享的方式有很多,我们在应用层编程时,也经常需要进程之间共享内存。可以用过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;    

免责声明:文章转载自《驱动程序与应用程序之间共享内存》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇ColorMatrixFilter色彩矩阵滤镜;Java中将字符串用空格分割成字符串数组的split方法下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

android共享内存

在android下不能通过shm_open使用共享内存。 网上有好多关于android下使用Ashmem实现共享内存的,但经过尝试该方法可以mmap出内存,但是和另一个进程没有实现共享。 具体的使用方法: 1)fd = open("/dev/ashmem", O_RDWR); 2)ioctl(fd, ASHMEM_SET_NAME, region_name...

Python进程池Pool

''' 进程池,启动一个进程就要克隆一份数据,假设父进程1G,那么启动进程开销很大 避免启动太多造成系统瘫痪,就有进程池,即同一时间允许的进程数量 ps:线程没有池,因为线程启动开销小,线程有类似信号量来控制 ''' ''' windows上必须加语句: if __name__ == '__main__': freeze_suppo...

试试SQLServer 2014的内存优化表

试试SQLServer 2014的内存优化表 SQL Server2014存储引擎:行存储引擎,列存储引擎,内存引擎 SQL Server 2014中的内存引擎(代号为Hekaton)将OLTP提升到了新的高度。 现在,存储引擎已整合进当前的数据库管理系统,而使用先进内存技术来支持大规模OLTP工作负载。 就算如此,要利用此新功能,数据库必须包含“内存优化...

rocketmq 修改broker和namesrv默认设置的堆内存大小

broker的堆内存的启动脚本在     C:UsersAdministratorDesktop ocketmq-all-4.7.1-source-releasedistributionin文件夹下面  可以看到 其堆内存为8g 可以根据实际情况对其进行调整 JAVA_OPT="${JAVA_OPT} -server -Xms1g -Xmx1g -Xmn...

ASP.NET Core 的Windows和IIS宿主(自动翻译记录)

https://docs.microsoft.com/en-us/aspnet/core/publishing/iis?tabs=aspnetcore2x 支持的操作系统 以下操作系统的支持: Windows 7和更新 Windows Server 2008 R2和新† †概念,本文档中描述的IIS配置也适用于托管ASP.NET核心应用纳米服务器IIS...

Linux多进程开发IV

1.共享内存。允许两个或多个进程共享物理内存的同一块区域(段)。 共享内存是进程用户空间的一部分,因此这种IPC机制需要更少的内核处理。一个进程将数据复制到共享内存中,那么这部分数据就会对其他所有共享同一个段的进程可用。 与管道等要求发送进程将数据从用户空间的缓冲区复制到内核内存和接收进程将数据从内核内存复制进用户空间的缓冲区的做法相比,这种IPC技术...