本帖最后由 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中。 |