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

(有代码)这样share一个usermode下建立的buffer行不行?我给50分

楼主#
更多 发布于:2005-01-21 17:19
我现在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之间了吗?

最新喜欢:

cyliucyliu
snowStart
驱动老牛
驱动老牛
  • 注册日期2004-04-06
  • 最后登录2011-06-02
  • 粉丝0
  • 关注0
  • 积分95分
  • 威望19点
  • 贡献值177点
  • 好评度1点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2005-01-21 20:12
一般都是在驱动里申请内存,应用程序里我到没试过,

那你试试能行吗?
学习,关注,交流中... [email=fengyu@163.com]Email:snowstarth@163.com[/email] [url]http://bbs.zndev.com/?a=snowStart[/url]
AllenZh
驱动老牛
驱动老牛
  • 注册日期2001-08-19
  • 最后登录2015-11-27
  • 粉丝19
  • 关注10
  • 积分1316分
  • 威望2387点
  • 贡献值7点
  • 好评度321点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2005-01-21 20:43
基本思路是对的
但更常用的是在驱动中分配,然后在app中来Map驱动中的内存
我现在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
stoneabc
驱动牛犊
驱动牛犊
  • 注册日期2004-12-06
  • 最后登录2007-11-28
  • 粉丝0
  • 关注0
  • 积分40分
  • 威望5点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
地板#
发布于:2005-01-22 09:52
[quote]基本思路是对的
但更常用的是在驱动中分配,然后在app中来Map驱动中的内存
                          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[quote]
请问在app中如何能map我在驱动里分配的内存啊?

snowStart
驱动老牛
驱动老牛
  • 注册日期2004-04-06
  • 最后登录2011-06-02
  • 粉丝0
  • 关注0
  • 积分95分
  • 威望19点
  • 贡献值177点
  • 好评度1点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2005-01-22 10:35
[quote]基本思路是对的
但更常用的是在驱动中分配,然后在app中来Map驱动中的内存
                          ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
[quote]
请问在app中如何能map我在驱动里分配的内存啊?

 


是在驱动里把内存map为用户地址空间的内存,再传地址给应用程序,就能用了
学习,关注,交流中... [email=fengyu@163.com]Email:snowstarth@163.com[/email] [url]http://bbs.zndev.com/?a=snowStart[/url]
snowStart
驱动老牛
驱动老牛
  • 注册日期2004-04-06
  • 最后登录2011-06-02
  • 粉丝0
  • 关注0
  • 积分95分
  • 威望19点
  • 贡献值177点
  • 好评度1点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2005-01-22 10:38
可以使用这个函数
MmMapLockedPagesSpecifyCache
学习,关注,交流中... [email=fengyu@163.com]Email:snowstarth@163.com[/email] [url]http://bbs.zndev.com/?a=snowStart[/url]
stoneabc
驱动牛犊
驱动牛犊
  • 注册日期2004-12-06
  • 最后登录2007-11-28
  • 粉丝0
  • 关注0
  • 积分40分
  • 威望5点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2005-01-22 10:52
可以使用这个函数
MmMapLockedPagesSpecifyCache


map 出来的地址值是不是做为DeviceIOControl的outBuffer的内容,然后在app里拼成一个pvoid指针指向driver里分配的内存来进行读写操作呢?
是不是这个地址在我的app里一直有效,只要拿到一次就可以一直用了呢?
bmyyyud
驱动老牛
驱动老牛
  • 注册日期2002-02-22
  • 最后登录2010-01-21
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望130点
  • 贡献值0点
  • 好评度106点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2005-01-22 11:03
我现在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在新换入的进程中有效,可能对应的物理地址也不同。
滚滚长江东逝水 浪花淘尽英雄 是非成败转头空 青山依旧在 几度夕阳红 白发渔樵江渚上 惯看秋月春风 一壶浊酒喜相逢 古今多少事 尽付笑谈中
AllenZh
驱动老牛
驱动老牛
  • 注册日期2001-08-19
  • 最后登录2015-11-27
  • 粉丝19
  • 关注10
  • 积分1316分
  • 威望2387点
  • 贡献值7点
  • 好评度321点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2005-01-22 15:17
map 出来的地址值是不是做为DeviceIOControl的outBuffer的内容,然后在app里拼成一个pvoid指针指向driver里分配的内存来进行读写操作呢?
是不是这个地址在我的app里一直有效,只要拿到一次就可以一直用了呢?

如果在驱动中分配内存看看src\\gnernal\\portio中的驱动,哪个就是在驱动中分配的
你这需要分配一次、map一次就可以多次使用了。
1,承接Windows下驱动/应用开发 2,本人原创虚拟鼠标/键盘,触摸屏,虚拟显卡,Mirror驱动,XP无盘的SCSI虚拟磁盘驱动等 3,windows下有尝技术服务(包括BUG调试,员工培训等) 欢迎深圳和海外企业联系.msn:mfczmh@sina.com
游客

返回顶部