阅读:2633回复:24
驱动程序和应用程序的通讯问题。。。。。
在应用程序分配的数据空间到驱动程序不能使用,已用就死机。
use.... *p= new char[1024]; 将p传到sys中 在sys中使用p死机 请指点,谢谢。。。。 给分。。。。!!!!! |
|
沙发#
发布于:2002-06-22 08:50
应用程序分配的空间不能在驱动程序中直接使用,我估计,你是用DeviceIoControl将p传到驱动程序的。我下面的这篇文章详细地介绍了如何在应用程序和驱动程序之间共享内存。
|
|
|
板凳#
发布于:2002-06-22 10:54
不应该啊,能不能是p的类型搞错了! p= new char [1024] ? |
|
地板#
发布于:2002-06-23 10:53
你是怎么将缓冲区传到sys的
在sys中又是怎么用的 |
|
|
地下室#
发布于:2002-06-23 13:48
详细点?
|
|
5楼#
发布于:2002-07-02 14:51
用DeviceIoControl将p传到驱动程序
sys中用s_p=p; |
|
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 |
|
|
7楼#
发布于:2002-07-02 16:14
用DeviceIoControl将p传到驱动程序 faint |
|
|
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。 我这儿运行正常 |
|
9楼#
发布于:2002-07-02 18:05
用DeviceIoControl将p传到驱动程序
sys中用s_p=p; char mchar=*s_p;(出错) |
|
10楼#
发布于:2002-07-02 18:30
用DeviceIoControl将p传到驱动程序
---------------------------------------------------------------------------- copy this |
|
11楼#
发布于:2002-07-02 19:13
谢谢各位。
我是想直接使用用户空间,不知道怎样处理。 |
|
12楼#
发布于:2002-07-02 19:25
谢谢各位。 唉,上面就是在直接访问用户空间 |
|
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); 运行????? 我这儿运行死机 |
|
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); ----- 传递指针的指针到驱动吗? |
|
15楼#
发布于:2002-07-04 09:26
ULONG *addr=new ULONG[1024]; 估计是笔误。 *addr = 1; |
|
16楼#
发布于:2002-07-04 09:46
for(int i=0;i<1024;i++) addr=1; |
|
17楼#
发布于:2002-07-04 09:49
[quote] for(int i=0;i<1024;i++) addr=1; [/quote] 站长,这是什么bug? 我写的“addr”只显示出addr???? 两次都是这样????? |
|
18楼#
发布于:2002-07-04 09:51
[quote][quote] for(int i=0;i<1024;i++) addr=1; [/quote] 站长,这是什么bug? 我写的“addr”只显示出addr???? 两次都是这样????? [/quote] 又是这样??!! 写汉字好了: 是addr加中括号、加i、加中括号。 |
|
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。 我这儿运行正常 |
|
上一页
下一页