VB小子玩转驱动程序:起步作者:胡文亮 注1:本文只适合并针对初级的VB编程爱好者阅读,请所谓的“大牛”飘过。 注2:本文可能会有技术性错误,但是我尽可能保证本文的正确性。 注3:欢迎各位转载,转载最好注明出处和作者。 现在,我们来安装WDK7。首先用UltraISO把ISO文件解压缩,注意,要用UltraISO来解压缩,不要用WinRAR解压缩,WinRAR解压的文件貌似有问题。解压完成就双击“KitSetup.exe”,选择以下选项:
选择完毕后点击“OK”进行安装即可。 安装好编译器后,大家就去下载一份我的驱动模板(地址:http://www.m5home.com/bbs/thread-3376-1-1.html),保存在硬盘上。注意,路径中不能有空格。打开“MyDriver.c”文件,可以看到有八个函数,但最主要的只有两个:DriverEntry(名字不可自定义)和DriverUnload(名字可以自定义)。DriverEntry是驱动程序的入口函数,相当于普通C程序的main函数和VB的sub_main()。DriverUnload可以理解成驱动程序的出口函数,某些操作要在这里执行。还有一个函数是DispatchIoctl(名字可以自定义,需要DispatchCreate函数和DispatchClose函数的配合才可正常使用)。它用来处理不同的控制代码(IoControlCode)来做不同的事情。我用一个VB的例子来解释:有个程序有三个按钮数组,它们分别用来显示0到2这三个数字,我们在Button_Click过程中这么写:
Private Sub Button_Click(Index As Integer) Select Case Index Case 0
MsgBox 0 Case 1
MsgBox 1 Case 2
MsgBox 2 End Select End Sub
当我们点击Button(N)时就会执行Case N,同理,在驱动里的DispatchIoctl相当于这个程序的Button_Click,当我们发送控制代码(点击相应按钮)时相应的代码就会被执行。而且,同一控制代码(按钮)可以多次发送(点击),一旦相应代码执行完毕就会等待下一次的触发,直到程序退出。 在“Driver.h”中,有几个宏:DEVICE_NAME、LINK_GLOBAL_NAME、LINK_NAME,它们代表了这个驱动程序在内核中名字。大家最好把他们设置成同样的名字。基本格式如下: #define DEVICE_NAME L"\\Device\\驱动名称" #define LINK_NAME L"\\DosDevices\\驱动名称" #define LINK_GLOBAL_NAME L"\\DosDevices\\Global\\驱动名称"
现在我们在DriverEntry的倒数第二行(return STATUS_SUCCESS;)之前加上一句: DbgPrint(“Hello,World!”);
接下来就可以编译了。 在生成驱动程序的过程中,有两个没有后缀名的文件起了重要作用,一个是sources,一个是makefile。makefile的内容千篇一律,这里不解释,唯一要解释的是source,它的基本格式如下: TARGETNAME=SYS文件的名字 TARGETTYPE=DRIVER TARGETPATH=obj INCLUDES=.\ SOURCES = 源文件的名字(可以有多个)
用惯了VB的人肯定养成了坏习惯,老是幻想有个IDE,IDE上有个按钮,叫“生成EXE”。我现在就告诉大家,这个按钮不存在。我们要手动编译。首先打开【开始】菜单,然后依次选择:程序 -> Windows Driver Kits -> WDK 7600.16385.0 -> Build Environments -> Windows XP -> x86 Checked Build Environment。打开那个黑乎乎的cmd窗口后,使用cd命令把工作目录切换你的源码目录,然后输入Build命令即可:
生成的sys文件保存在\objchk_wxp_x86\i386目录下。 接下来就测试驱动程序,首先打开DbgView,然后使用“DrvLoader.exe”加载,加载完了之后,如果DbgView显示出一行字:
那就说明你入门了。 |