xjcxc
驱动牛犊
驱动牛犊
  • 注册日期2002-03-27
  • 最后登录2006-08-28
  • 粉丝0
  • 关注0
  • 积分30分
  • 威望3点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
阅读:2633回复:24

驱动程序和应用程序的通讯问题。。。。。

楼主#
更多 发布于:2002-06-22 08:13
在应用程序分配的数据空间到驱动程序不能使用,已用就死机。
use....
*p= new char[1024];
将p传到sys中
在sys中使用p死机

请指点,谢谢。。。。

给分。。。。!!!!!
Tom_lyd
驱动大牛
驱动大牛
  • 注册日期2001-09-02
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-06-22 08:50
应用程序分配的空间不能在驱动程序中直接使用,我估计,你是用DeviceIoControl将p传到驱动程序的。我下面的这篇文章详细地介绍了如何在应用程序和驱动程序之间共享内存。
Tom_lyd
zealin2
驱动牛犊
驱动牛犊
  • 注册日期2002-06-18
  • 最后登录2003-08-05
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2002-06-22 10:54

不应该啊,能不能是p的类型搞错了!
p= new char [1024]
?
zydcat
驱动老牛
驱动老牛
  • 注册日期2001-12-06
  • 最后登录2006-04-12
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-06-23 10:53
你是怎么将缓冲区传到sys的

在sys中又是怎么用的
[color=red]肥虫虫[/color] [img]http://www.driverdevelop.com/forum/upload/bradley/2002-11-15_ig01.gif[/img]
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
地下室#
发布于:2002-06-23 13:48
详细点?
xjcxc
驱动牛犊
驱动牛犊
  • 注册日期2002-03-27
  • 最后登录2006-08-28
  • 粉丝0
  • 关注0
  • 积分30分
  • 威望3点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-07-02 14:51
用DeviceIoControl将p传到驱动程序
sys中用s_p=p;
seaquester
驱动大牛
驱动大牛
  • 注册日期2002-05-22
  • 最后登录2016-06-16
  • 粉丝0
  • 关注0
  • 积分500分
  • 威望115点
  • 贡献值0点
  • 好评度107点
  • 原创分0分
  • 专家分52分
6楼#
发布于:2002-07-02 15:49
用DeviceIoControl将p传到驱动程序
sys中用s_p=p;
----------------------------------
Tom_lyd兄说得对,这样肯定不行,其实这个问题在论坛已经讨论过多次了。

可以参考MSDN中的文章:
HOWTO: Share Memory Between User Mode and Kernel Mode
Q191840

SAMPLE: Section.exe on Sharing Memory Between Kernel & User Mode
Q194945

八风舞遥翩,九野弄清音。 鸣高常向月,善舞不迎人。
zydcat
驱动老牛
驱动老牛
  • 注册日期2001-12-06
  • 最后登录2006-04-12
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望2点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-07-02 16:14
用DeviceIoControl将p传到驱动程序
sys中用s_p=p;


faint
[color=red]肥虫虫[/color] [img]http://www.driverdevelop.com/forum/upload/bradley/2002-11-15_ig01.gif[/img]
pjf
pjf
驱动中牛
驱动中牛
  • 注册日期2001-07-08
  • 最后登录2006-10-23
  • 粉丝0
  • 关注0
  • 积分42分
  • 威望4点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2002-07-02 17:17
用DeviceIoControl将p传到驱动程序
----------------------------------
这样肯定不行
 

也不是那么绝对,驱动可以访问用户空间,但要有较强的条件:确保驱动运行在所要访问的进程环境中;若IRQL等于或高于DSPATCH_LEVEL,则要确保页存在。
以前VXD与应用共享内存的一种常见方法就是应用分配一块空间,将地址传给驱动,让驱动lock所需pages,lock的目的在于确保符合以上二条件。
2000驱动也可用此方法,只是大家都用更常见的共享做法:驱动分配,映射给应用。
其实最上层驱动的分派例程工作于PASSIVE_LEVEL,且运行在发出请求的进程环境中,可以说符合要求(应用LOCK一下比较好)。我写个例子:
最上层驱动分派例程中:
addr=((PULONG)Irp->AssociatedIrp.SystemBuffer)[0];
for(b=0;b<1024;b++)
a+=((PULONG)addr);
RtlCopyMemory(Irp->AssociatedIrp.SystemBuffer,&a,4);
BytesTxd=OutputLength;
应用中:
ULONG *addr=new ULONG[1024];
for(int i=0;i<1024;i++)
addr=1;
......
DeviceIoControl(hDevice,IOCTL_WDM1_GET_BUFFER,&addr,4,&res,4,&Bytes,0);

运行后得到从驱动传回的累加结果:1024。
我这儿运行正常
xjcxc
驱动牛犊
驱动牛犊
  • 注册日期2002-03-27
  • 最后登录2006-08-28
  • 粉丝0
  • 关注0
  • 积分30分
  • 威望3点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2002-07-02 18:05
用DeviceIoControl将p传到驱动程序
sys中用s_p=p;
char mchar=*s_p;(出错)
pjf
pjf
驱动中牛
驱动中牛
  • 注册日期2001-07-08
  • 最后登录2006-10-23
  • 粉丝0
  • 关注0
  • 积分42分
  • 威望4点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2002-07-02 18:30
用DeviceIoControl将p传到驱动程序
----------------------------------------------------------------------------
copy this
xjcxc
驱动牛犊
驱动牛犊
  • 注册日期2002-03-27
  • 最后登录2006-08-28
  • 粉丝0
  • 关注0
  • 积分30分
  • 威望3点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2002-07-02 19:13
谢谢各位。
我是想直接使用用户空间,不知道怎样处理。
pjf
pjf
驱动中牛
驱动中牛
  • 注册日期2001-07-08
  • 最后登录2006-10-23
  • 粉丝0
  • 关注0
  • 积分42分
  • 威望4点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2002-07-02 19:25
谢谢各位。
我是想直接使用用户空间,不知道怎样处理。
 

唉,上面就是在直接访问用户空间
xjcxc
驱动牛犊
驱动牛犊
  • 注册日期2002-03-27
  • 最后登录2006-08-28
  • 粉丝0
  • 关注0
  • 积分30分
  • 威望3点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2002-07-03 22:19
最上层驱动分派例程中:
addr=((PULONG)Irp->AssociatedIrp.SystemBuffer);
-----
for(b=0;b<1024;b++)
a+=*addr;
---------
RtlCopyMemory(Irp->AssociatedIrp.SystemBuffer,&a,4);
BytesTxd=OutputLength;
应用中:
ULONG *addr=new ULONG[1024];
for(int i=0;i<1024;i++)
addr=1;
......
DeviceIoControl(hDevice,IOCTL_WDM1_GET_BUFFER,&addr,4,&res,4,&Bytes,0);

运行?????
我这儿运行死机
xjcxc
驱动牛犊
驱动牛犊
  • 注册日期2002-03-27
  • 最后登录2006-08-28
  • 粉丝0
  • 关注0
  • 积分30分
  • 威望3点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2002-07-03 22:26
ULONG *addr=new ULONG[1024];
       ----
for(int i=0;i<1024;i++)
addr=1;???????
......
DeviceIoControl(hDevice,IOCTL_WDM1_GET_BUFFER,&addr,4,&res,4,&Bytes,0);
                               -----
传递指针的指针到驱动吗?
arthurtu
驱动巨牛
驱动巨牛
  • 注册日期2001-11-08
  • 最后登录2020-12-19
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望161点
  • 贡献值0点
  • 好评度35点
  • 原创分0分
  • 专家分0分
  • 社区居民
15楼#
发布于:2002-07-04 09:26
ULONG *addr=new ULONG[1024];
       ----
for(int i=0;i<1024;i++)
addr=1;???????
......
DeviceIoControl(hDevice,IOCTL_WDM1_GET_BUFFER,&addr,4,&res,4,&Bytes,0);
                               -----
传递指针的指针到驱动吗?

估计是笔误。
*addr = 1;
pjf
pjf
驱动中牛
驱动中牛
  • 注册日期2001-07-08
  • 最后登录2006-10-23
  • 粉丝0
  • 关注0
  • 积分42分
  • 威望4点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2002-07-04 09:46

运行?????
我这儿运行死机
 


for(int i=0;i<1024;i++)
addr=1;
pjf
pjf
驱动中牛
驱动中牛
  • 注册日期2001-07-08
  • 最后登录2006-10-23
  • 粉丝0
  • 关注0
  • 积分42分
  • 威望4点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2002-07-04 09:49
[quote]
运行?????
我这儿运行死机
 


for(int i=0;i<1024;i++)
addr=1; [/quote]
站长,这是什么bug?
我写的“addr”只显示出addr????

两次都是这样?????
pjf
pjf
驱动中牛
驱动中牛
  • 注册日期2001-07-08
  • 最后登录2006-10-23
  • 粉丝0
  • 关注0
  • 积分42分
  • 威望4点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2002-07-04 09:51
[quote][quote]
运行?????
我这儿运行死机
 


for(int i=0;i<1024;i++)
addr=1; [/quote]
站长,这是什么bug?
我写的“addr”只显示出addr????

两次都是这样????? [/quote]

又是这样??!!
写汉字好了:
是addr加中括号、加i、加中括号。
pjf
pjf
驱动中牛
驱动中牛
  • 注册日期2001-07-08
  • 最后登录2006-10-23
  • 粉丝0
  • 关注0
  • 积分42分
  • 威望4点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2002-07-04 11:31

最上层驱动分派例程中:
addr=((PULONG)Irp->AssociatedIrp.SystemBuffer)[0](*这有中括号里面是0*);
for(b=0;b<1024;b++)
a+=((PULONG)addr)(*这有中括号里面是b*);
RtlCopyMemory(Irp->AssociatedIrp.SystemBuffer,&a,4);
BytesTxd=OutputLength;
应用中:
ULONG *addr=new ULONG[1024];//奇怪这给括号能显示
for(int i=0;i<1024;i++)
addr(*这有种括号里面是i*)=1;
......
DeviceIoControl(hDevice,IOCTL_WDM1_GET_BUFFER,&addr,4,&res,4,&Bytes,0);

运行后得到从驱动传回的累加结果:1024。
我这儿运行正常
上一页
游客

返回顶部