【紫水晶首发】VB小子玩转驱动程序(3):驱动通信
本帖最后由 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, 0End With
从驱动里返回数据到VB也很简单,就是把memcpy中两个参数的位置互换一下就可以了:memcpy(pIoBuffer,&ulR3OUT,sizeof(ULONG));在VB里这么写就能接收了:With DrvController.IoControl .CTL_CODE_GEN(控制代码), 0, 0, VarPtr(ret), 4End With执行完这段代码后,驱动返回的数据就存到了变量ret中。 驱动里的数据结构很复杂,我这里只讲最简单的整数和字符串的传递。不然的话就违背了我“通俗易懂”的原则。源码在我的驱动模板里已经有了,大家自己仔细琢磨琢磨。 :D 你用什么方法绕过了主题购买而直接看到了主题?
是不是dz论坛的漏洞? 我没下载啊。我连第一课都没看.
没心情.. 哦,明白了
某个地方我理解错误了,我还以为不购买主题就不能回帖。 :D哎...
初一的时候she firends tell me"Lxy said she like you"
but,,我竟然没反应..:dizzy: lgc你是男的还是女的啊?
怎么你的头像这么像个女的? 买了看看 回复 8# HoviDelphic
男的啊,头像是lxy... 看了两遍了
没明白
举个例子吧,这样好理解 本帖最后由 HoviDelphic 于 2010-1-21 22:29 编辑
驱动模板里就有例子啊!还有哪里不明白? 回复 2# HoviDelphic
有段时间琢磨了好久给驱动传构造类型,弄了半天,都没成功,最后还是一个个传好…… 具体也不知道哪里不懂
不知道有什么用
像那个起步那篇文章就很不错
结合实例,一步一步来
很适合新手学习
希望hd能够讲清楚这个通信是干什么用的,怎么用
谢谢 本帖最后由 HoviDelphic 于 2010-1-22 02:56 编辑
通信就是让驱动发挥作用的。
发送IOCTL给驱动就像点击窗体上的按钮一样。
即使窗体上的按钮下面有代码,你不点击,按钮的代码能执行吗? 返回值有点像你点完按钮后,弹出个msgbox返回一个值给你。 :sleepy: 看看通信。。。这次不浪费就好 还是不太明白
1.什么是驱动?
2.驱动是不是用c写的?
3.vb调用c写的代码?
呵呵,不知道问什么好~~
太菜了~~ HD能不能就这个帖子再加强下 和上一节课联系起来。
我的思路是这样的我们VB做一个程序和驱动通信,在R3这个程序里面输入想要打印的信息。
然后在驱动里面就打印出来,不一定是hello world拉!
嘿嘿```
这样更有利于大家理解。。
呵呵`` 本帖最后由 HoviDelphic 于 2010-1-23 14:21 编辑
1.什么是驱动?
2.驱动是不是用c写的?
3.vb调用c写的代码?
ok100fen 发表于 2010-1-22 23:30 http://www.m5home.com/bbs/images/common/back.gif
1.驱动就是能执行所有指令的程序,比如关闭中断。在一般的程序里,无论如何都是做不到的,无论用什么语言写。
2.一般来说是,delphi也行,FB也行。
3.vb调用驱动程序,跟编写驱动的语言无关。 HD能不能就这个帖子再加强下 和上一节课联系起来。
我的思路是这样的我们VB做一个程序和驱动通信,在R3这个 ...
oopww 发表于 2010-1-23 12:34 http://www.m5home.com/bbs/images/common/back.gif
你仔细看看我的驱动模板,这些例子都在里面了。
里面有个VB传递字符串进驱动的例子。传递好了之后打印出来就行了。
传进去的类型是PCWSTR,可以把它转化成UNICODE_STRING(代码里面也有),然后就能用DbgPrint打印出来了。
注意,打印字符不是C语言中常见的%s,而是%wZ,注意大小写。 回复 14# TengAttack
传地址呗:D
VBCodePrivate Type dTest
XX1 As Long
XX2 As String
End Type
Private Sub Send(Byval XX As dTest)
dDriver.IoControl .CTL_CODE_GEN(XXXX), VarPtr(XX), Len(XX), 0, 0
End Sub
驱动代码
memcpy(&AA,SystemBuffer,4);
memcpy(&BB,SystemBuffer+4,4); 回复 驱动代码
memcpy(&AA,SystemBuffer,4);
memcpy(&BB,SystemBuffer+4,4);
xiaoly99 发表于 2010-1-23 14:37 http://www.m5home.com/bbs/images/common/back.gif
这恐怕不太好吧!
还是sizeof(结构体)好些! 回复 23# xiaoly99
谢谢了 我消化一下
3q 祝贺一下,好像不用验证码了~~ 回复 27# ok100fen
嗯 的啊 方便多了 hd,还是写个简单使用通信的例子吧
有了例子,就好理解了
我等菜鸟不是常人所能理解的~~呵呵
从例子出发,或许能理解
盼~~~ hd,还是写个简单使用通信的例子吧
有了例子,就好理解了
我等菜鸟不是常人所能理解的~~呵呵
从例子出发 ...
ok100fen 发表于 2010-1-23 22:40 http://www.m5home.com/bbs/images/common/back.gif
汗,你听不懂我的话么,我的驱动模板就是与驱动通信的例子!!! 看了好几遍你的那个驱动模板了
不明白什么意思
再举一个比较生动的例子吧
有点实用价值的
谢谢
我这个学生是不是很笨啊:) 不笨不笨
本来就是Long,我喜欢用硬编码,要不就SizeOf(ULONG)
页:
[1]
2