chrys
驱动小牛
驱动小牛
  • 注册日期2002-05-30
  • 最后登录2008-07-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:5795回复: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]
zhangc98
驱动牛犊
驱动牛犊
  • 注册日期2002-03-30
  • 最后登录2004-10-21
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-07-31 15:57
你好,能不能够把那份资料给我发一份呢?
谢谢:)

mailto: zhangchong@tsinghua.org.cn
目前:新手上路; 目标:高级站友; 理想:开国大佬; 方法:自己的努力+大家的关照!
Tom.Cat
禁止发言
禁止发言
  • 注册日期2001-10-10
  • 最后登录2019-07-29
  • 粉丝1
  • 关注0
  • 积分-53792分
  • 威望197411点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
  • 社区居民
板凳#
发布于:2002-07-31 16:05
用户被禁言,该主题自动屏蔽!
chrys
驱动小牛
驱动小牛
  • 注册日期2002-05-30
  • 最后登录2008-07-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地板#
发布于:2002-08-01 09:03
你好,能不能够把那份资料给我发一份呢?
谢谢:)

mailto: zhangchong@tsinghua.org.cn
 

你的邮箱可能有问题吧,这份资料有7mb,我的邮箱是公司的,用lotus登录,像在本地操作一样,所以可以收发任意大小的附件,我看你是不是找个好点的邮箱,我再给你发。我的email是:xhwaiyy@cmmail.com或xiehw@zhongjie.com.cn(公司的)
天才来自勤奋 知识要靠学习 [url= http://ndxz.126.com]――欢迎来我家做客――[/url]
xiaoyan_yang121
驱动牛犊
驱动牛犊
  • 注册日期2002-06-25
  • 最后登录2005-06-13
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2002-08-01 12:16
chrys:你好!
 我现在也正在进行devicectrol()通信这一块的编程,而且有许多这方面的困惑,你能否也给我发一份这个质料?
我的e-mail: liyongqi0116@263.net
非常感谢!

chrys
驱动小牛
驱动小牛
  • 注册日期2002-05-30
  • 最后登录2008-07-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2002-08-01 14:09
chrys:你好!
 我现在也正在进行devicectrol()通信这一块的编程,而且有许多这方面的困惑,你能否也给我发一份这个质料?
我的e-mail: liyongqi0116@263.net
非常感谢!

 

已经给你发过来了。
天才来自勤奋 知识要靠学习 [url= http://ndxz.126.com]――欢迎来我家做客――[/url]
chrys
驱动小牛
驱动小牛
  • 注册日期2002-05-30
  • 最后登录2008-07-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2002-08-01 14:28
xiaoyan_yang1216 你好:
    我已经给你发了3次了,可这个附件太大了,发出的邮件总是被退了回来,我已经把它分成4份了,我又发了一次,如果还是发送不了,我再想别的办法。
天才来自勤奋 知识要靠学习 [url= http://ndxz.126.com]――欢迎来我家做客――[/url]
yytv
驱动牛犊
驱动牛犊
  • 注册日期2002-03-05
  • 最后登录2009-06-04
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2002-08-01 17:18
能给我发一份吗?
zpeng@wtwh.com.cn
谢谢了
wangxdong
驱动小牛
驱动小牛
  • 注册日期2002-07-08
  • 最后登录2003-01-10
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2002-08-02 09:48
大家可以在本论坛的http://www.driverdevelop.com/dlit.php?id=70 下载,不要再麻烦chrys老兄了,因为一般的免费邮箱都只有5m,根本放不下7m的附件,即使分成几部分,也要先收完一部分删掉后才能发另一部分,太麻烦了,下载就是要扣25分可用分,可以在论坛上多多灌水 :cool: 然后把参与分换成可用分。我现在正在努力攒到500分,只为了下载高级会员区的一个xpddk,希望那个链接是真的,呵呵,否则我就欲哭无泪了。 :P
请多多指教!
fireproxy
驱动牛犊
驱动牛犊
  • 注册日期2002-08-02
  • 最后登录2002-08-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
9楼#
发布于:2002-08-02 11:00
发给我一份吧?我的邮箱放得下cjg@irc-mp.com
chrys
驱动小牛
驱动小牛
  • 注册日期2002-05-30
  • 最后登录2008-07-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
10楼#
发布于:2002-08-02 13:39
本来我是打算把这份ddk资料放到我的网站供大家下载的,但是毕竟这份资料来自于驱动开发网,下载该资料又需要25分的可用分,那我不是在挖墙角,和驱动开发网唱对台戏,所以觉得还是不妥,所以我不能那样做,请大家原谅。
天才来自勤奋 知识要靠学习 [url= http://ndxz.126.com]――欢迎来我家做客――[/url]
chrys
驱动小牛
驱动小牛
  • 注册日期2002-05-30
  • 最后登录2008-07-09
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
11楼#
发布于:2002-08-02 13:43
发给我一份吧?我的邮箱放得下cjg@irc-mp.com

已经给你发过来了,一共5封邮件。
天才来自勤奋 知识要靠学习 [url= http://ndxz.126.com]――欢迎来我家做客――[/url]
bxn77
驱动牛犊
驱动牛犊
  • 注册日期2003-02-19
  • 最后登录2003-03-13
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2003-03-06 19:14
给我发一份啊,好吗
bxn77@163.com
mailme
驱动老牛
驱动老牛
  • 注册日期2001-05-21
  • 最后登录2010-02-25
  • 粉丝0
  • 关注0
  • 积分26分
  • 威望3点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2003-03-06 21:43
我上一个驱动也要用到DeviceIoControl,呵呵,我可没有你那么好的朋友来教我,硬是把oney的书来来回回看了好几遍,最后总算搞明白了,各种艰辛难以细表,连我的爱机都跟着受累--都不记得崩了几回了,呵呵
早起早睡 精神百倍
domore
驱动中牛
驱动中牛
  • 注册日期2002-04-06
  • 最后登录2008-04-05
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
14楼#
发布于: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
HJZ
HJZ
驱动牛犊
驱动牛犊
  • 注册日期2002-01-14
  • 最后登录2005-01-31
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2003-08-04 11:10
谢谢,又得经验拉。
hawkdtw
驱动牛犊
驱动牛犊
  • 注册日期2003-02-25
  • 最后登录2008-06-13
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望1点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2004-01-11 17:09
关于DeviceIoControl我看武安河的书了,也看了DS所带的例子PCIWDM,经过试验还是不太懂,能给我发一份吗?
鹰――凶猛,孤独 能力高的人视野是开阔的,但是孤独的
dingyf20
驱动牛犊
驱动牛犊
  • 注册日期2003-07-27
  • 最后登录2016-01-09
  • 粉丝0
  • 关注0
  • 积分5分
  • 威望1点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2004-04-20 00:26
哥哥,我也和楼上的仁兄一样,正郁闷的要命,

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

dingyf20@sina.com
zsh_7769
驱动小牛
驱动小牛
  • 注册日期2004-04-15
  • 最后登录2005-12-06
  • 粉丝0
  • 关注0
  • 积分0分
  • 威望0点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2004-04-29 17:35
老大,我也想要一份,能发给我吗?谢谢!
zsh_7769@163.com
bingjie
驱动小牛
驱动小牛
  • 注册日期2001-08-15
  • 最后登录2007-11-29
  • 粉丝0
  • 关注0
  • 积分36分
  • 威望5点
  • 贡献值0点
  • 好评度3点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2004-04-29 17:41

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

呵呵,我一直用的是NEITHER方式传输数据,没感觉有什么不妥,这样可以减少2次内存拷贝,降低CPU占有率,挺好啊。
上一页
游客

返回顶部