首页
社区
课程
招聘
[原创][成果3.5]驱动和应用层的三种通信方式
发表于: 2008-1-4 11:57 79210

[原创][成果3.5]驱动和应用层的三种通信方式

2008-1-4 11:57
79210
收藏
免费 7
支持
分享
最新回复 (67)
雪    币: 116
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
26
http://blog.chinaunix.net/u/25096/showart_456024.html怎么是
========================================================
lpOutBuffer

由用户层指定,用于接收驱动层返回数据的缓冲区。在驱动层,依传输类型的不同,输出缓冲区的位置亦不同,见下表。

传输类型         位置
METHOD_IN_DIRECT         irp->MdlAddress
METHOD_OUT_DIRECT         irp->MdlAddress
//下面两个是反的×××××××××××××××××
METHOD_BUFFERED         irp->UserBuffer   
METHOD_NEITHER         irp->AssociatedIrp.SystemBuffer
2008-12-23 12:48
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
27
非常感谢楼主分享,最近正在搞相关的研究
2008-12-27 10:04
0
雪    币: 30
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
28
感谢楼主分享
2010-2-6 00:46
0
雪    币: 2586
活跃值: (920)
能力值: ( LV12,RANK:1010 )
在线值:
发帖
回帖
粉丝
29
感谢楼主。。。。
2010-2-6 10:51
0
雪    币: 35
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
30
恩,我刚刚开始学习啊,还看不太懂啊
2010-2-6 19:29
0
雪    币: 101
活跃值: (139)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
31
感谢搂主,正在学习驱动,很有帮助
2010-2-15 13:13
0
雪    币: 38
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
32
加紧学习中  因为看不懂
2010-2-17 15:34
0
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
33
分享了!谢谢!
2010-3-25 16:05
0
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
34
嗯。楼主看来是做了实验了,写出点心得。不错。
不过,建议你既然Driver部分是C语言写的,应用程序部分也用C语言好了。
你这样应用程序用Pascal(?),感觉那个驱动部分不是你写的。

另外,三种ioctl的方式,楼主你有没有试过它们的效率??我平时只用METHOD_BUFFERED方式,所以你有什么效率的结论,请分享给大家。多谢。
2010-3-28 00:51
0
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
35
自己做了些实验,获得的经验大概如下

如果是传递一两个控制参数,那么用 (METHOD_NEITHER) 效率最高,也最方便
如果是传递大量的数据,比如网络抓包后将数据包全部传递给Application,那么肯定要用 (METHOD_BUFFERED)方法了。
2010-3-29 19:10
0
雪    币: 208
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
36
不错,感谢楼主
2010-3-29 21:44
0
雪    币: 28
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
37
谢谢楼主,讲的很好
2010-4-23 16:37
0
雪    币: 265
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
yvi
38
对我很有帮助,多谢楼主了。如果应用层能用C写更好,我电脑里没有DE
2010-7-19 21:24
0
雪    币: 225
活跃值: (43)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
39
mark 即马克
2010-9-27 22:35
0
雪    币: 36
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
40
感谢楼主分享,ring0和ring3层的通信我找了好久才找到
2010-10-27 15:37
0
雪    币: 224
活跃值: (58)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
41
学习了。嘎嘎
2010-10-27 16:01
0
雪    币: 1243
活跃值: (347)
能力值: ( LV5,RANK:60 )
在线值:
发帖
回帖
粉丝
42
且不应使用 UserBuffer 中存储的地址。

这个为什么不行?网上就会瞎扯.说userbuffer是可以ring3程序指定的..指定个锤子啊.我找了N多代码.结果IRP里userbuffer都不是我指定的值.LZ能说明么?
2010-10-30 21:09
0
雪    币: 270
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
43
不错,呵呵
其实大多数情况下用的都是buffer IO的方式,关于三种方式在数据传输量和限制其实在DDK帮助文档里面有些说明了,虽然不是很详细....   也可以参考DDK安装目录下的general\ioctl
2011-6-12 17:03
0
雪    币: 28
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
44
跪谢楼主分享~!
2011-6-23 14:12
0
雪    币: 384
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
45
METHOD_BUFFERED模式,输入和输出缓冲区都是irp->AssociatedIrp.SystemBuffer
pInputBuffer = Irp->AssociatedIrp.SystemBuffer;
pOutputBuffer = Irp->AssociatedIrp.SystemBuffer;

if(pInputBuffer && pOutputBuffer)
{              
DbgPrint("COMM_BufferedIo UserModeMessage = '%s'", pInputBuffer);
RtlCopyMemory(pOutputBuffer, pInputBuffer, outputLength);
这种用法,感觉很怪。
2011-8-13 18:56
0
雪    币: 128
活跃值: (111)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
46
对啊,为什么呢?

用户传入的缓冲区应该是两个吧,这里怎么是同一个呢?期待高手能解答下!
2011-9-8 10:25
0
雪    币: 346
活跃值: (1963)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
47
WriteFile,ReadFile如何指定传输方式?或者他们默认了那种传输方式?
2012-4-21 10:52
0
雪    币: 66
活跃值: (49)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
48
谢谢分享学习了
2012-11-6 18:08
0
雪    币: 796
活跃值: (370)
能力值: ( LV9,RANK:380 )
在线值:
发帖
回帖
粉丝
49
驱动跟ring3通信,有N多方法,,,,hook大法,内核管道,DeviceIoControl等等。。
2012-11-6 18:32
0
雪    币: 111
活跃值: (113)
能力值: ( LV5,RANK:70 )
在线值:
发帖
回帖
粉丝
50
回来学习学习~~~
2012-11-16 21:41
0
游客
登录 | 注册 方可回帖
返回
//