stoneabc
驱动牛犊
驱动牛犊
  • 注册日期2004-12-06
  • 最后登录2007-11-28
  • 粉丝0
  • 关注0
  • 积分40分
  • 威望5点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
阅读:1269回复:5

这样share一个usermode下建立的buffer行不行?50分

楼主#
更多 发布于:2005-01-21 17:17
我现在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之间了吗?
AllenZh
驱动老牛
驱动老牛
  • 注册日期2001-08-19
  • 最后登录2015-11-27
  • 粉丝19
  • 关注10
  • 积分1316分
  • 威望2387点
  • 贡献值7点
  • 好评度321点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2005-01-21 20:46
基本思路是对的,具体没有测试
但通常是在驱动中分配,app中map,具体代码看
2000ddk中的src下general的portio,它讲了端口和内存操作的具体实现。
我现在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之间了吗?
1,承接Windows下驱动/应用开发 2,本人原创虚拟鼠标/键盘,触摸屏,虚拟显卡,Mirror驱动,XP无盘的SCSI虚拟磁盘驱动等 3,windows下有尝技术服务(包括BUG调试,员工培训等) 欢迎深圳和海外企业联系.msn:mfczmh@sina.com
bmyyyud
驱动老牛
驱动老牛
  • 注册日期2002-02-22
  • 最后登录2010-01-21
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望130点
  • 贡献值0点
  • 好评度106点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-01-22 10: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之间了吗?

我觉得有些问题,如果你向内核驱动传递userAddress时,发生进程调度,将别的用户模式进程换入,userAddress很可能成为无效地址,调用MmProbeAndLockPages时就失败了。即便userAddress在新换入的进程中有效,可能对应的物理地址也不同。
滚滚长江东逝水 浪花淘尽英雄 是非成败转头空 青山依旧在 几度夕阳红 白发渔樵江渚上 惯看秋月春风 一壶浊酒喜相逢 古今多少事 尽付笑谈中
stoneabc
驱动牛犊
驱动牛犊
  • 注册日期2004-12-06
  • 最后登录2007-11-28
  • 粉丝0
  • 关注0
  • 积分40分
  • 威望5点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
地板#
发布于:2005-01-22 11:08
[quote我觉得有些问题,如果你向内核驱动传递userAddress时,发生进程调度,将别的用户模式进程换入,userAddress很可能成为无效地址,调用MmProbeAndLockPages时就失败了。即便userAddress在新换入的进程中有效,可能对应的物理地址也不同。 [/quote]

哦,如果传入driver后进程切换了,那么那个地址指向的物理地址就不是我想传给它的了,可是怎么办呢.,我要拿到一个buffer使app和driver共享,并且要求在app下只拿到一次那个buffer后就一直可以用的
AllenZh
驱动老牛
驱动老牛
  • 注册日期2001-08-19
  • 最后登录2015-11-27
  • 粉丝19
  • 关注10
  • 积分1316分
  • 威望2387点
  • 贡献值7点
  • 好评度321点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2005-01-22 15:14
[quote我觉得有些问题,如果你向内核驱动传递userAddress时,发生进程调度,将别的用户模式进程换入,userAddress很可能成为无效地址,调用MmProbeAndLockPages时就失败了。即便userAddress在新换入的进程中有效,可能对应的物理地址也不同。


哦,如果传入driver后进程切换了,那么那个地址指向的物理地址就不是我想传给它的了,可是怎么办呢.,我要拿到一个buffer使app和driver共享,并且要求在app下只拿到一次那个buffer后就一直可以用的 [/quote]
这点不需要担心,因为你使用DeviceIOControl是同步方式,肯定在同一环境,不会切换到其它进程,及时被切换,当调度回来后也是一致的。
1,承接Windows下驱动/应用开发 2,本人原创虚拟鼠标/键盘,触摸屏,虚拟显卡,Mirror驱动,XP无盘的SCSI虚拟磁盘驱动等 3,windows下有尝技术服务(包括BUG调试,员工培训等) 欢迎深圳和海外企业联系.msn:mfczmh@sina.com
bmyyyud
驱动老牛
驱动老牛
  • 注册日期2002-02-22
  • 最后登录2010-01-21
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望130点
  • 贡献值0点
  • 好评度106点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2005-01-23 11:23
[quote][quote我觉得有些问题,如果你向内核驱动传递userAddress时,发生进程调度,将别的用户模式进程换入,userAddress很可能成为无效地址,调用MmProbeAndLockPages时就失败了。即便userAddress在新换入的进程中有效,可能对应的物理地址也不同。


哦,如果传入driver后进程切换了,那么那个地址指向的物理地址就不是我想传给它的了,可是怎么办呢.,我要拿到一个buffer使app和driver共享,并且要求在app下只拿到一次那个buffer后就一直可以用的 [/quote]
这点不需要担心,因为你使用DeviceIOControl是同步方式,肯定在同一环境,不会切换到其它进程,及时被切换,当调度回来后也是一致的。 [/quote]
同步只表明DeviceIOControl等待核心驱动返回,但并不表明你的用户进程不会被切换出去,如果正好被切换出去,一旦你的核心驱动要访问这块内存,就错了。我建议先在核心驱动中创建buffer,锁住后在交给用户进程,以前这个问题讨论过。
滚滚长江东逝水 浪花淘尽英雄 是非成败转头空 青山依旧在 几度夕阳红 白发渔樵江渚上 惯看秋月春风 一壶浊酒喜相逢 古今多少事 尽付笑谈中
游客

返回顶部