阅读:1269回复:5
这样share一个usermode下建立的buffer行不行?50分
我现在usermode application下建立一个userBuffer,把这个usermode下的address的值传递给我的驱动程序,在kernelmode下以这个值作为virtualAddress建立一个mdl,然后锁住,不释放这个mdl,返回我的application。
在此之后,我在kernelmode下往这个mdl里写数据,在application里用userBuffer就能读到了,或者在application里写,kernel里也能读到,从而实现了一块内存的共享了是吗? 下面是我的大致实现,各位看看能行吗? <user application code>: #include <stdio.h> #include <windows.h> #include <string.h> UCHAR userBuffer[256]; DWORD status; DWORD returnBytes; UCHAR transferBuffer[50]; void main() { int i; PVOID pUserBuffer = &userBuffer; //put the address value to transferBuffer and send it to driver memcpy(transferBuffer,&pUserBuffer,sizeof(PVOID)); ...... ...... DeviceIOControl(trasnsferBuffer,50,NULL,0,returnBytes); } <kernel mode code>: PVOID userAddress; RtlMemcopy(&userAddress,TRANSFERBUFFER,sizeof(PVOID)); //TRANSFERBUFFER is the counterpart of //transferBuffer in usermode application above PMDL mdl = IoAllocateMdl(userAddress,256,FALSE,TRUE,NULL); MmProbeAndLockPages(mdl); PVOID kernelAddress = MmProbeAndLockPages(mdl,KERNELMODE); 这样做可以共享内存于user和kernel之间了吗? |
|
沙发#
发布于:2005-01-21 20:46
基本思路是对的,具体没有测试
但通常是在驱动中分配,app中map,具体代码看 2000ddk中的src下general的portio,它讲了端口和内存操作的具体实现。 我现在usermode application下建立一个userBuffer,把这个usermode下的address的值传递给我的驱动程序,在kernelmode下以这个值作为virtualAddress建立一个mdl,然后锁住,不释放这个mdl,返回我的application。 |
|
|
板凳#
发布于:2005-01-22 10:50
我现在usermode application下建立一个userBuffer,把这个usermode下的address的值传递给我的驱动程序,在kernelmode下以这个值作为virtualAddress建立一个mdl,然后锁住,不释放这个mdl,返回我的application。 我觉得有些问题,如果你向内核驱动传递userAddress时,发生进程调度,将别的用户模式进程换入,userAddress很可能成为无效地址,调用MmProbeAndLockPages时就失败了。即便userAddress在新换入的进程中有效,可能对应的物理地址也不同。 |
|
|
地板#
发布于:2005-01-22 11:08
[quote我觉得有些问题,如果你向内核驱动传递userAddress时,发生进程调度,将别的用户模式进程换入,userAddress很可能成为无效地址,调用MmProbeAndLockPages时就失败了。即便userAddress在新换入的进程中有效,可能对应的物理地址也不同。 [/quote]
哦,如果传入driver后进程切换了,那么那个地址指向的物理地址就不是我想传给它的了,可是怎么办呢.,我要拿到一个buffer使app和driver共享,并且要求在app下只拿到一次那个buffer后就一直可以用的 |
|
地下室#
发布于:2005-01-22 15:14
[quote我觉得有些问题,如果你向内核驱动传递userAddress时,发生进程调度,将别的用户模式进程换入,userAddress很可能成为无效地址,调用MmProbeAndLockPages时就失败了。即便userAddress在新换入的进程中有效,可能对应的物理地址也不同。 哦,如果传入driver后进程切换了,那么那个地址指向的物理地址就不是我想传给它的了,可是怎么办呢.,我要拿到一个buffer使app和driver共享,并且要求在app下只拿到一次那个buffer后就一直可以用的 [/quote] 这点不需要担心,因为你使用DeviceIOControl是同步方式,肯定在同一环境,不会切换到其它进程,及时被切换,当调度回来后也是一致的。 |
|
|
5楼#
发布于:2005-01-23 11:23
[quote][quote我觉得有些问题,如果你向内核驱动传递userAddress时,发生进程调度,将别的用户模式进程换入,userAddress很可能成为无效地址,调用MmProbeAndLockPages时就失败了。即便userAddress在新换入的进程中有效,可能对应的物理地址也不同。 哦,如果传入driver后进程切换了,那么那个地址指向的物理地址就不是我想传给它的了,可是怎么办呢.,我要拿到一个buffer使app和driver共享,并且要求在app下只拿到一次那个buffer后就一直可以用的 [/quote] 这点不需要担心,因为你使用DeviceIOControl是同步方式,肯定在同一环境,不会切换到其它进程,及时被切换,当调度回来后也是一致的。 [/quote] 同步只表明DeviceIOControl等待核心驱动返回,但并不表明你的用户进程不会被切换出去,如果正好被切换出去,一旦你的核心驱动要访问这块内存,就错了。我建议先在核心驱动中创建buffer,锁住后在交给用户进程,以前这个问题讨论过。 |
|
|