chrys
驱动小牛
驱动小牛
  • 注册日期2002-05-30
  • 最后登录2008-07-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:5910回复:29

DeviceControl()通信实现心得

楼主#
更多 发布于:2002-07-23 16:33
在这里首先我要感谢好朋友――王晓东,他发给我一份ddk编程资料,让我明白了devicectrol()通信的问题。我现在将我的心得写下来给所有和我一样曾经有过这样迷惑的人。

首先我们都知道,缓冲方式有三种:BUFFERED模式、DIRECT模式、NEITHER模式。

METHOD_BUFFERED方式:
应用程序中的输入输出缓冲在驱动程序中用一个指针访问,即IRP中的AssociatedIrp.SystemBuffer指针,当应用程序的数据传入到驱动时,驱动先从AssociatedIrp.SystemBuffer中取得应用程序的数据,在irp完成之前,驱动将要传给应用程序的数据考入AssociatedIrp.SystemBuffer中并设置IoStatus.Information为要传给应用程序的数据长度即可。

METHOD_IN_DIRECT和METHOD_OUT_DIRECT模式:
他们都以相同方式处理。仅有的不同是它们访问用户模式缓冲区时所需的访问权限;METHOD_IN_DIRECT需要读权限;METHOD_OUT_DIRECT既需要读权限又需要写权限,驱动程序以AssociatedIrp.SystemBuffer访问输入缓冲区,以MDL访问输出缓冲区,MDL缓冲地址可以用MmGetSystemAddressForMdl(Irp->MdlAddress)获得。

NEITHER模式:
使用NEITHER模式时,I/O管理器不翻译用户模式的虚拟地址。你得到输入缓冲区的用户模式虚拟地址(在堆栈单元的Type3InputBuffer参数中),和输出缓冲区的用户模式虚拟地址(在IRP的UserBuffer域)。除非你知道你与用户模式调用者运行在同一个进程上下文中,否则这些地址是无用的。如果你恰好知道你正运行在这样的进程上下文中,你可以直接使用这些指针。一般情况下,驱动程序不会要用这种方式,因为很少有通用设备要求过高的处理速度,以至于开发者不得不直接操作应用程序的缓冲区来获得高性能。

最新喜欢:

leavepeaceleavep... Ice_BinIce_Bi...
天才来自勤奋 知识要靠学习 [url= http://ndxz.126.com]――欢迎来我家做客――[/url]
yeaiping
驱动牛犊
驱动牛犊
  • 注册日期2007-07-29
  • 最后登录2014-07-06
  • 粉丝3
  • 关注6
  • 积分86分
  • 威望629点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2008-06-05 09:13
楼主,能否给我邮箱发一份,谢谢。yeaiping@hotmail.com
授人以鱼不如授人以渔,反之,求鱼不如求渔
anchoret
驱动牛犊
驱动牛犊
  • 注册日期2005-12-23
  • 最后登录2013-08-13
  • 粉丝0
  • 关注0
  • 积分22分
  • 威望150点
  • 贡献值0点
  • 好评度16点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2008-05-08 14:11
thx a lot!
jmj_2008
驱动牛犊
驱动牛犊
  • 注册日期2008-04-17
  • 最后登录2008-04-22
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望3点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
地板#
发布于:2008-04-17 12:14
L楼主,我也想要一份,jmj_2008@126.com。谢谢啦
kaizitop
驱动牛犊
驱动牛犊
  • 注册日期2008-03-03
  • 最后登录2008-04-05
  • 粉丝3
  • 关注0
  • 积分90分
  • 威望10点
  • 贡献值0点
  • 好评度9点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2008-04-03 19:55
六年顶一帖,一帖顶到今天,真是牛帖◎
认认真真做事,踏踏实实做人! 说起来真容易,真做起来太难!
goldenfire
驱动牛犊
驱动牛犊
  • 注册日期2008-01-14
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分110分
  • 威望13点
  • 贡献值0点
  • 好评度12点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2008-02-27 15:08
现在发帖的人都到哪里去了? 怎么不上论坛了?
goldenfire
驱动牛犊
驱动牛犊
  • 注册日期2008-01-14
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分110分
  • 威望13点
  • 贡献值0点
  • 好评度12点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2008-02-27 15:07
6年前的帖子 强啊 。。。
lxf5909680
驱动牛犊
驱动牛犊
  • 注册日期2007-01-18
  • 最后登录2008-01-08
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望3点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2008-01-08 11:51
给发一份吧,谢谢
lxf5909680@126.com
hazywxin
驱动牛犊
驱动牛犊
  • 注册日期2003-10-29
  • 最后登录2010-07-26
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望20点
  • 贡献值0点
  • 好评度17点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2004-08-19 19:59
关于这个函数 武安河的书上讲的还可以,按照他的方法做肯定没问题,其实他的书上的内容基本都是DS帮助文件翻译过来的,很多地方一字不差!我觉得大家努努力,看看英文比看书要明白!
cool_alay
驱动牛犊
驱动牛犊
  • 注册日期2004-07-08
  • 最后登录2004-10-16
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2004-08-19 10:19
刚做驱动,应该有用
这就去下载了,呵呵~~~
qifeng8
驱动小牛
驱动小牛
  • 注册日期2003-08-26
  • 最后登录2013-01-31
  • 粉丝0
  • 关注0
  • 积分9分
  • 威望80点
  • 贡献值0点
  • 好评度21点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2004-08-17 10:47
我也想要,给我也发一份吧
qif@guoguang.com.cn
bingjie
驱动小牛
驱动小牛
  • 注册日期2001-08-15
  • 最后登录2007-11-29
  • 粉丝0
  • 关注0
  • 积分36分
  • 威望5点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2004-04-29 17:41

NEITHER模式:
使用NEITHER模式时,I/O管理器不翻译用户模式的虚拟地址。你得到输入缓冲区的用户模式虚拟地址(在堆栈单元的Type3InputBuffer参数中),和输出缓冲区的用户模式虚拟地址(在IRP的UserBuffer域)。除非你知道你与用户模式调用者运行在同一个进程上下文中,否则这些地址是无用的。如果你恰好知道你正运行在这样的进程上下文中,你可以直接使用这些指针。一般情况下,驱动程序不会要用这种方式,因为很少有通用设备要求过高的处理速度,以至于开发者不得不直接操作应用程序的缓冲区来获得高性能。
 

呵呵,我一直用的是NEITHER方式传输数据,没感觉有什么不妥,这样可以减少2次内存拷贝,降低CPU占有率,挺好啊。
zsh_7769
驱动小牛
驱动小牛
  • 注册日期2004-04-15
  • 最后登录2005-12-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2004-04-29 17:35
老大,我也想要一份,能发给我吗?谢谢!
zsh_7769@163.com
dingyf20
驱动牛犊
驱动牛犊
  • 注册日期2003-07-27
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2004-04-20 00:26
哥哥,我也和楼上的仁兄一样,正郁闷的要命,

能也给我一份吗?    感谢感谢!

dingyf20@sina.com
hawkdtw
驱动牛犊
驱动牛犊
  • 注册日期2003-02-25
  • 最后登录2008-06-13
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2004-01-11 17:09
关于DeviceIoControl我看武安河的书了,也看了DS所带的例子PCIWDM,经过试验还是不太懂,能给我发一份吗?
鹰――凶猛,孤独 能力高的人视野是开阔的,但是孤独的
HJZ
HJZ
驱动牛犊
驱动牛犊
  • 注册日期2002-01-14
  • 最后登录2005-01-31
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2003-08-04 11:10
谢谢,又得经验拉。
domore
驱动中牛
驱动中牛
  • 注册日期2002-04-06
  • 最后登录2008-04-05
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2003-03-07 10:29
 
大家可以在本论坛的http://www.driverdevelop.com/dlit.php?id=70 下载,不要再麻烦chrys老兄了,因为一般的免费邮箱都只有5m,根本放不下7m的附件,即使分成几部分,也要先收完一部分删掉后才能发另一部分,太麻烦了,下载就是要扣25分可用分,可以在论坛上多多灌水  然后把参与分换成可用分。我现在正在努力攒到500分,只为了下载高级会员区的一个xpddk,希望那个链接是真的,呵呵,否则我就欲哭无泪了。

我选择了到本站下载,当然花了25大分。
不过XPDDK在网上是找得到的,不用花500分,好不容易攒的。你可以到天网搜索一下。http://bingle.pku.edu.cn
mailme
驱动老牛
驱动老牛
  • 注册日期2001-05-21
  • 最后登录2010-02-25
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望3点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2003-03-06 21:43
我上一个驱动也要用到DeviceIoControl,呵呵,我可没有你那么好的朋友来教我,硬是把oney的书来来回回看了好几遍,最后总算搞明白了,各种艰辛难以细表,连我的爱机都跟着受累--都不记得崩了几回了,呵呵
早起早睡 精神百倍
bxn77
驱动牛犊
驱动牛犊
  • 注册日期2003-02-19
  • 最后登录2003-03-13
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2003-03-06 19:14
给我发一份啊,好吗
bxn77@163.com
chrys
驱动小牛
驱动小牛
  • 注册日期2002-05-30
  • 最后登录2008-07-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2002-08-02 13:43
发给我一份吧?我的邮箱放得下cjg@irc-mp.com

已经给你发过来了,一共5封邮件。
天才来自勤奋 知识要靠学习 [url= http://ndxz.126.com]――欢迎来我家做客――[/url]
上一页
游客

返回顶部