20楼#
发布于:2002-07-04 23:46
最上层驱动分派例程中:
addr=((PULONG)Irp->AssociatedIrp.SystemBuffer)[0](*这有中括号里面是0*); Irp->AssociatedIrp.SystemBuffer 是 PVOID 驱动的addr=*addr应用层。。。? |
|
21楼#
发布于:2002-07-05 07:16
最上层驱动分派例程中: 整个过程就是应用把分配的内存的地址的值传给驱动(我这儿是0x8744F8),驱动依次访问每个单元。 |
|
22楼#
发布于:2002-07-05 10:08
引用:
-------------------------------------------------------------------------------- 整个过程就是应用把分配的内存的地址的值传给驱动(我这儿是0x8744F8),驱动依次访问每个单元 --------------------------------------------------------------------------------- 我用的是 KernelDriver ,还是死机。 char puser[1024]; char *psys psys=Irp.SystemBuffer()[0]; i=*psys 死机; |
|
23楼#
发布于:2002-07-05 11:05
用DeviceIoControl将p传到驱动程序 DeviceIoControl可以传入一个应用程序分配的内存以传入数据给驱动程序或让驱动程序返回数据,但是,驱动程序如何操作这块内存要看你声明命令码(即IOCTL_XXX)使用的I/O方式(是BUFFERED_IO,还是DIRECT_IN, DIRECT_OUT),I/O方式不同,解析内存的方式不同,而且这个方式不受创建设备对象时初始化的I/O方式影响。 当为BUFFERED_IO时,应用程序传入的内存被I/O Manager拷贝到pIrp->AssociatedIrp.SystemBuffer中,而当使用DIRECT_IO时,驱动程序就需要一个MDL来描述应用程序的内存。这里我不知道你声明IOCTL命令码时使用的是什么内存方式,解析方式又是否一至,请查明。
如果你声明内存I/O方式为METHOD_BUFFERED,则这一句是正确的,如果不是,则是错误的。
DeviceIoControl函数中可以同时指定输入缓冲和输出缓冲,但建议你不要同时使用,I/O 管理器对两种缓冲的处理方法可能存在不同。
我不知道你在这里为什么要在输入缓冲参数中传入addr的地址(你的意思应该是一个指针),但应用程序和驱动程序不用一个内存空间,这样绝对是不合理的。你可以这样: DeviceIoControl( hDevice, IOCTL_WDM1_GET_BUFFER, addr, 1024*sizeof(ULONG), .....); 这个函数中的输入/输出缓冲区的大小都是以字节为单位的。 这样,你就可以在驱动程序中正确无误地使用addr中的内容。
不死机才奇怪。 如果你需要在应用程序和驱动程序中共享内存,根本不是用DeviceIoControl的上面的机制,我上面给你的一篇文档详细地阐述了如何实现,仔细看看吧。 祝你好运。 |
|
|
24楼#
发布于:2002-07-05 12:50
如果你需要在应用程序和驱动程序中共享内存,根本不是用DeviceIoControl的上面的机制,我上面给你的一篇文档详细地阐述了如何实现,仔细看看吧。
祝你好运。 ----------------------------------------------------------------------------- 本来这就是为了说明一个原理,有关2000系统的内存映射机制,只是告诉他知道一个有效用户地址驱动在什么条件下可以直接访问(而非驱动不可访问用户空间)。用DeviceIoControl只是为了最简单地告诉驱动该去直接访问的用户地址,与缓冲策略毫无关系,任何方法让驱动知道用户4字节地址而已,hehe 我这儿运行死机 ------------------------------------------------------------------------------ 你明白我所说的条件是什么就绝不会死机,有些很特殊情况还不得不使用这种方法。言尽于此 |
|
上一页
下一页