阅读:1237回复:8
(有代码)这样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之间了吗? |
|
最新喜欢:cyliu |
沙发#
发布于:2005-01-21 20:12
一般都是在驱动里申请内存,应用程序里我到没试过,
那你试试能行吗? |
|
|
板凳#
发布于:2005-01-21 20:43
基本思路是对的
但更常用的是在驱动中分配,然后在app中来Map驱动中的内存 我现在usermode application下建立一个userBuffer,把这个usermode下的address的值传递给我的驱动程序,在kernelmode下以这个值作为virtualAddress建立一个mdl,然后锁住,不释放这个mdl,返回我的application。 |
|
|
地板#
发布于:2005-01-22 09:52
[quote]基本思路是对的
但更常用的是在驱动中分配,然后在app中来Map驱动中的内存 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ [quote] 请问在app中如何能map我在驱动里分配的内存啊? |
|
地下室#
发布于:2005-01-22 10:35
[quote]基本思路是对的 是在驱动里把内存map为用户地址空间的内存,再传地址给应用程序,就能用了 |
|
|
5楼#
发布于:2005-01-22 10:38
可以使用这个函数
MmMapLockedPagesSpecifyCache |
|
|
6楼#
发布于:2005-01-22 10:52
可以使用这个函数 map 出来的地址值是不是做为DeviceIOControl的outBuffer的内容,然后在app里拼成一个pvoid指针指向driver里分配的内存来进行读写操作呢? 是不是这个地址在我的app里一直有效,只要拿到一次就可以一直用了呢? |
|
7楼#
发布于:2005-01-22 11:03
我现在usermode application下建立一个userBuffer,把这个usermode下的address的值传递给我的驱动程序,在kernelmode下以这个值作为virtualAddress建立一个mdl,然后锁住,不释放这个mdl,返回我的application。 我觉得有些问题,如果你向内核驱动传递userAddress时,发生进程调度,将别的用户模式进程换入,userAddress很可能成为无效地址,调用MmProbeAndLockPages时就失败了。即便userAddress在新换入的进程中有效,可能对应的物理地址也不同。 |
|
|
8楼#
发布于:2005-01-22 15:17
map 出来的地址值是不是做为DeviceIOControl的outBuffer的内容,然后在app里拼成一个pvoid指针指向driver里分配的内存来进行读写操作呢? 如果在驱动中分配内存看看src\\gnernal\\portio中的驱动,哪个就是在驱动中分配的 你这需要分配一次、map一次就可以多次使用了。 |
|
|