zoukankan      html  css  js  c++  java
  • 驱动程序与应用程序之间共享内存

    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;    
  • 相关阅读:
    HDU 1501 Zipper(DFS)
    HDU 2181 哈密顿绕行世界问题(DFS)
    HDU 1254 推箱子(BFS)
    HDU 1045 Fire Net (DFS)
    HDU 2212 DFS
    HDU 1241Oil Deposits (DFS)
    HDU 1312 Red and Black (DFS)
    HDU 1010 Tempter of the Bone(DFS+奇偶剪枝)
    HDU 1022 Train Problem I(栈)
    HDU 1008 u Calculate e
  • 原文地址:https://www.cnblogs.com/spinsoft/p/2860810.html
Copyright © 2011-2022 走看看