本帖最后由 HoviDelphic 于 2010-7-11 19:28 编辑
VB小子玩转驱动程序:前言 作者:胡文亮
注1:本文只适合并针对初级的VB编程爱好者阅读,请所谓的“大牛”飘过。 注2:本文可能会有技术性错误,但是我尽可能保证本文的正确性。 注3:欢迎各位转载,转载最好注明出处和作者。 相信不少人都听过“驱动程序”这个词,因为太多的地方用到了它。比如买了新显卡,大家安装完硬件之后的第一件事一定是去官网下载最新版本的驱动,以让它很好的工作。经常在VBGOOD、紫水晶逛的人一定写过不少程序,但不知道有没有人想写一个程序,来直接控制硬件? 要直接控制硬件,只有驱动程序能够做到。很可惜,由于VB自身的限制,驱动程序很难用VB制作。所以,大家必须抛开可爱的VB,投进C语言的怀抱。C语言和VB有很大的不同,但是还是有很多相似的地方。对于学过C语言且对驱动程序感兴趣的作者,可以很方便地阅读本文,对于没学过C语言但对驱动程序感兴趣的读者,可以把借学习驱动程序之机来学习C语言。
驱动程序有很多种,Windows NT些列内核的操作系统主要有两种,一种是NT式驱动,一种是WDM式驱动,本文只讲NT式驱动。记得以前还有“软件驱动”和“硬件驱动”的说法,甚至有人煞有介事地说杀毒软件用的驱动就是“软件驱动”,硬件公司提供的驱动就是“硬件驱动”。我觉得这样不对,如果你愿意的话,可以在一个驱动里写一段强杀进程的代码,再写一段操作显卡显存的代码。这么说,这是“软件驱动”还是“硬件驱动”?
驱动程序和普通的程序有很大的不同,最重要的一点就是出错即蓝屏。经常玩VB的朋友习惯了修改完程序后连“保存”都不按就直接按F5运行。这在驱动编程中是绝对不可能的,所有的测试必须先编译才能进行。大家也别指望驱动程序出错后有个提示框出现,驱动程序出错的唯一后果就是蓝屏,再恶心点就是直接黑屏重启,连蓝屏都省了。所以大家在测试驱动程序的时候务必在干净的虚拟机中进行,免得蓝屏损坏文件甚至硬件(VBGOOD某网友曾说在真机中测试驱动,结果把自己320GB的硬盘玩挂了)。虚拟机软件推荐使用微软的VPC。 有人看到这点,也许想打退堂鼓了。其实,万物都有两面性。在驱动程序具有较高危险性(出错蓝屏)的同时,驱动程序也比普通程序具有了高得多的权限。最重要的一点,就是可以执行“特权指令”。啥叫“特权指令”呢?就是具有特权的程序(比如驱动程序)才能执行的指令。打个比方,我是紫水晶的普通会员,而老马是管理员,他可以删除我的号,而我不能删除他的号一样。在这个例子里,“删除账号”算是“特权指令”了,只有具有特权用户才能使用,而我只是普通用户,就不能使用。而“普通指令”呢,就是任何程序都可以执行的指令。比如,我和老马都可以发帖,“发帖”就算是“普通指令”。主流的安全防护软件发现有普通程序试图加载驱动程序时会发出警告,因为加载了驱动程序,那个普通程序就拥有了和杀毒软件一样的特权。记得我小时候,有个家伙仗着自己的父亲有钱有权,总是欺负别的同学,但是不怎么敢欺负我,因为当时我父亲的官衔和他父亲的官衔高(注:本段是我模仿当年明月风格的尝试,希望大家喜欢。我尽量不在《VB小子玩转驱动程序》中使用术语,就像当年明月一样不在《明朝那些事儿》中使用历史专用名词一样)。 俗话说,“工欲善其事,必先利其器”。我们编译驱动程序的软件叫WDK,全名Windows Driver Kit。而编辑器任选,我个人推荐Notepad++。大家在VB里调试程序时总是会在程序里加上Debug.Print,运行到那里时能在“立即”窗口看到。而在驱动程序里没有Debug.Print,只有函数DbgPrint。没有“立即”窗口,只有DbgView。DbgView是个软件,可以查看驱动程序输出的调试信息。这些软件可以在这里下载:http://www.m5home.com/bbs/thread-3346-1-1.html。 最后我再重申一次,《VB小子玩转驱动程序》的十堂课只是驱动程序的入门课,大家别指望学完了就能写个驱动程序控制自己家的显卡!不过看懂我以前发在VBGOOD的代码是可以的。下堂课,我就教大家写一个驱动版本的“Hello,World!”。 |