找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 30615|回复: 58

【紫水晶首发】VB小子玩转驱动程序(3):驱动通信

 火... [复制链接]

38

主题

199

回帖

2

精华

钻石会员

积分
3408
发表于 2010-1-21 13:34:23 | 显示全部楼层 |阅读模式
本帖最后由 HoviDelphic 于 2010-7-11 19:33 编辑

VB小子玩转驱动程序:驱动通信

作者:胡文亮

注1:本文只适合并针对初级的VB编程爱好者阅读,请所谓的“大牛”飘过。

注2:本文可能会有技术性错误,但是我尽可能保证本文的正确性。

注3:欢迎各位转载,转载最好注明出处和作者。


上堂课我们实现了在驱动里打印“Hello,World!”,但是不是输出到我们的程序里。所以,我们还要学习把数据输出到VB程序里的办法。这个过程叫做“驱动通信”。


驱动通信的办法很多,标准方法是从VB里发送一个控制代码(IOCTL)以及相关信息到驱动,执行完相应IOCTL的代码后,再从驱动里返回信息到VB。在驱动里,我们这么定义IOCTL

#define IOCTL_ULR3IN CTL_CODE(FILE_DEVICE_UNKNOWN, 0x800,METHOD_BUFFERED, FILE_ANY_ACCESS)

其中,“IOCTL_ULR3IN”是代表控制代码的常量,“0x800”是控制代码,他们可以随意修改。而在驱动的的DispatchIoctl函数中,可以用一个switch语句对控制代码进行选择:

switch(uIoControlCode)

{


case IOCTL_ULR3IN:


{


memcpy(&ulR3IN,pIoBuffer,sizeof(ulR3IN));


status = STATUS_SUCCESS;


break;


}


case IOCTL_USR3IN:


{


usR3IN=*(PCWSTR *)pIoBuffer;


status = STATUS_SUCCESS;


break;


}


case else


{


break;


}

在上面的代码中,“pIoBuffer”就是从VB中传给驱动的数据。pIoBuffer是一个指针,里面的数据可以是任何类型(数字、字符串、结构体、数组)。其中,第一个case的代码是把VB传入的数据赋给一个整形变量,第二个case是把VB传入的数据赋给一个字符串。我们在VB里这么写就能传递数据了:

With DrvController

.IoControl .CTL_CODE_GEN(控制代码), VarPtr(变量),4, 0, 0

End With


从驱动里返回数据到VB也很简单,就是把memcpy中两个参数的位置互换一下就可以了:

memcpy(pIoBuffer,&ulR3OUT,sizeof(ULONG));

VB里这么写就能接收了:

With DrvController

.IoControl .CTL_CODE_GEN(控制代码), 0, 0, VarPtr(ret), 4

End With

执行完这段代码后,驱动返回的数据就存到了变量ret中。

如果附件无法下载,请点击这里

38

主题

199

回帖

2

精华

钻石会员

积分
3408
 楼主| 发表于 2010-1-21 13:35:45 | 显示全部楼层
驱动里的数据结构很复杂,我这里只讲最简单的整数和字符串的传递。不然的话就违背了我“通俗易懂”的原则。源码在我的驱动模板里已经有了,大家自己仔细琢磨琢磨。
如果附件无法下载,请点击这里

5

主题

47

回帖

0

精华

铜牌会员

积分
210
发表于 2010-1-21 13:38:10 | 显示全部楼层

38

主题

199

回帖

2

精华

钻石会员

积分
3408
 楼主| 发表于 2010-1-21 13:39:56 | 显示全部楼层
你用什么方法绕过了主题购买而直接看到了主题?
是不是dz论坛的漏洞?
如果附件无法下载,请点击这里

5

主题

47

回帖

0

精华

铜牌会员

积分
210
发表于 2010-1-21 13:42:15 | 显示全部楼层
我没下载啊。我连第一课都没看.
没心情..

38

主题

199

回帖

2

精华

钻石会员

积分
3408
 楼主| 发表于 2010-1-21 13:44:31 | 显示全部楼层
哦,明白了
某个地方我理解错误了,我还以为不购买主题就不能回帖。
如果附件无法下载,请点击这里

5

主题

47

回帖

0

精华

铜牌会员

积分
210
发表于 2010-1-21 13:48:36 | 显示全部楼层
哎...




初一的时候she firends tell me"Lxy said she like you"
but,,我竟然没反应..:dizzy:

38

主题

199

回帖

2

精华

钻石会员

积分
3408
 楼主| 发表于 2010-1-21 14:17:51 | 显示全部楼层
lgc你是男的还是女的啊?
怎么你的头像这么像个女的?
如果附件无法下载,请点击这里

90

主题

473

回帖

2

精华

钻石会员

积分
3261
发表于 2010-1-21 16:55:39 | 显示全部楼层
买了看看

5

主题

47

回帖

0

精华

铜牌会员

积分
210
发表于 2010-1-21 18:46:44 | 显示全部楼层
回复 8# HoviDelphic


    男的啊,头像是lxy...
头像被屏蔽

1

主题

20

回帖

0

精华

初来乍到

积分
32
发表于 2010-1-21 18:49:28 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

90

主题

473

回帖

2

精华

钻石会员

积分
3261
发表于 2010-1-21 19:18:45 | 显示全部楼层
看了两遍了
没明白
举个例子吧,这样好理解

38

主题

199

回帖

2

精华

钻石会员

积分
3408
 楼主| 发表于 2010-1-21 22:26:07 | 显示全部楼层
本帖最后由 HoviDelphic 于 2010-1-21 22:29 编辑

驱动模板里就有例子啊!还有哪里不明白?
如果附件无法下载,请点击这里

4

主题

28

回帖

0

精华

铜牌会员

积分
199
QQ
发表于 2010-1-21 23:22:05 | 显示全部楼层
回复 2# HoviDelphic
有段时间琢磨了好久给驱动传构造类型,弄了半天,都没成功,最后还是一个个传好……
上帝一样掷骰子!

90

主题

473

回帖

2

精华

钻石会员

积分
3261
发表于 2010-1-21 23:29:56 | 显示全部楼层
具体也不知道哪里不懂
不知道有什么用
像那个起步那篇文章就很不错
结合实例,一步一步来
很适合新手学习
希望hd能够讲清楚这个通信是干什么用的,怎么用
谢谢

38

主题

199

回帖

2

精华

钻石会员

积分
3408
 楼主| 发表于 2010-1-22 02:54:58 | 显示全部楼层
本帖最后由 HoviDelphic 于 2010-1-22 02:56 编辑

通信就是让驱动发挥作用的。
发送IOCTL给驱动就像点击窗体上的按钮一样。
即使窗体上的按钮下面有代码,你不点击,按钮的代码能执行吗?
如果附件无法下载,请点击这里

38

主题

199

回帖

2

精华

钻石会员

积分
3408
 楼主| 发表于 2010-1-22 02:57:25 | 显示全部楼层
返回值有点像你点完按钮后,弹出个msgbox返回一个值给你。
如果附件无法下载,请点击这里

2

主题

7

回帖

0

精华

铜牌会员

积分
202
发表于 2010-1-22 14:02:16 | 显示全部楼层
:sleepy: 看看通信。。。这次不浪费就好

90

主题

473

回帖

2

精华

钻石会员

积分
3261
发表于 2010-1-22 23:30:29 | 显示全部楼层
还是不太明白
1.什么是驱动?
2.驱动是不是用c写的?
3.vb调用c写的代码?
呵呵,不知道问什么好~~
太菜了~~

9

主题

210

回帖

0

精华

初来乍到

积分
904
发表于 2010-1-23 12:34:26 | 显示全部楼层
HD能不能就这个帖子再加强下 和上一节课联系起来。
我的思路是这样的我们VB做一个程序和驱动通信,在R3这个程序里面输入想要打印的信息。
然后在驱动里面就打印出来,不一定是hello world拉!
嘿嘿```
这样更有利于大家理解。。
呵呵``

38

主题

199

回帖

2

精华

钻石会员

积分
3408
 楼主| 发表于 2010-1-23 14:16:07 | 显示全部楼层
本帖最后由 HoviDelphic 于 2010-1-23 14:21 编辑
1.什么是驱动?
2.驱动是不是用c写的?
3.vb调用c写的代码?
ok100fen 发表于 2010-1-22 23:30



    1.驱动就是能执行所有指令的程序,比如关闭中断。在一般的程序里,无论如何都是做不到的,无论用什么语言写。
    2.一般来说是,delphi也行,FB也行。
    3.vb调用驱动程序,跟编写驱动的语言无关。
如果附件无法下载,请点击这里

38

主题

199

回帖

2

精华

钻石会员

积分
3408
 楼主| 发表于 2010-1-23 14:19:13 | 显示全部楼层
HD能不能就这个帖子再加强下 和上一节课联系起来。
我的思路是这样的我们VB做一个程序和驱动通信,在R3这个 ...
oopww 发表于 2010-1-23 12:34


你仔细看看我的驱动模板,这些例子都在里面了。
里面有个VB传递字符串进驱动的例子。传递好了之后打印出来就行了。
传进去的类型是PCWSTR,可以把它转化成UNICODE_STRING(代码里面也有),然后就能用DbgPrint打印出来了。
注意,打印字符不是C语言中常见的%s,而是%wZ,注意大小写。
如果附件无法下载,请点击这里

6

主题

196

回帖

0

精华

铜牌会员

菜鸟

积分
52
发表于 2010-1-23 14:37:04 | 显示全部楼层
回复 14# TengAttack
传地址呗
VBCode
  1. Private Type dTest
  2. XX1 As Long
  3. XX2 As String
  4. End Type
  5. Private Sub Send(Byval XX As dTest)
  6. dDriver.IoControl .CTL_CODE_GEN(XXXX), VarPtr(XX), Len(XX), 0, 0
  7. End Sub
复制代码
驱动代码
memcpy(&AA,SystemBuffer,4);
memcpy(&BB,SystemBuffer+4,4);

38

主题

199

回帖

2

精华

钻石会员

积分
3408
 楼主| 发表于 2010-1-23 14:47:48 | 显示全部楼层
回复 驱动代码
memcpy(&AA,SystemBuffer,4);
memcpy(&BB,SystemBuffer+4,4);
xiaoly99 发表于 2010-1-23 14:37


这恐怕不太好吧!
还是sizeof(结构体)好些!
如果附件无法下载,请点击这里

4

主题

28

回帖

0

精华

铜牌会员

积分
199
QQ
发表于 2010-1-23 15:23:43 | 显示全部楼层
回复 23# xiaoly99
谢谢了
上帝一样掷骰子!

90

主题

473

回帖

2

精华

钻石会员

积分
3261
发表于 2010-1-23 17:25:58 | 显示全部楼层
我消化一下
3q

90

主题

473

回帖

2

精华

钻石会员

积分
3261
发表于 2010-1-23 17:26:26 | 显示全部楼层
祝贺一下,好像不用验证码了~~

5

主题

47

回帖

0

精华

铜牌会员

积分
210
发表于 2010-1-23 18:16:48 | 显示全部楼层
回复 27# ok100fen


    嗯 的啊 方便多了

90

主题

473

回帖

2

精华

钻石会员

积分
3261
发表于 2010-1-23 22:40:53 | 显示全部楼层
hd,还是写个简单使用通信的例子吧
有了例子,就好理解了
我等菜鸟不是常人所能理解的~~呵呵
从例子出发,或许能理解
盼~~~

38

主题

199

回帖

2

精华

钻石会员

积分
3408
 楼主| 发表于 2010-1-23 22:42:52 | 显示全部楼层
hd,还是写个简单使用通信的例子吧
有了例子,就好理解了
我等菜鸟不是常人所能理解的~~呵呵
从例子出发 ...
ok100fen 发表于 2010-1-23 22:40



    汗,你听不懂我的话么,我的驱动模板就是与驱动通信的例子!!!
如果附件无法下载,请点击这里

90

主题

473

回帖

2

精华

钻石会员

积分
3261
发表于 2010-1-24 00:07:56 | 显示全部楼层
看了好几遍你的那个驱动模板了
不明白什么意思
再举一个比较生动的例子吧
有点实用价值的
谢谢
我这个学生是不是很笨啊

6

主题

196

回帖

0

精华

铜牌会员

菜鸟

积分
52
发表于 2010-1-24 10:58:31 | 显示全部楼层
不笨不笨
本来就是Long,我喜欢用硬编码,要不就SizeOf(ULONG)
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

快速回复 返回顶部 返回列表