如何编写Windows驱动程序

知道如何编写Windows驱动程序的人不多,而且驱动程序通常都工作在内核模式,因此驱动程序一直被很多人看的很神秘。Windows Vista的驱动程序模型肯定会有比较大的变动,微软长期以来都保持各个版本之间的向下兼容,这也是windows发展的根基。我知道很多人对于写驱动程序还是觉得比较陌生,我看到很多介绍驱动程序的书写得也比较难懂,这里我用一个实例来说一下在Windows下面编写驱动程序的方法。

编写Windows驱动程序比编写Linux驱动程序入门要难一些,刚开始很多人看着一大堆的概念都迷糊了。本文用一个虚拟串口的驱动程序作为例子,来阐述Windows下面的驱动程序的开发方法。这个虚拟串口的驱动程序是在驱动之家的一个贴子里面发现的。

关于如何编写Windows驱动程序,本文计划分为2个部分进行说明:

如何编写Windows驱动程序第一个部分:介绍编写和编译驱动程序需要准备的环境以及我将要介绍的这个驱动程序的大体思路。

如何编写Windows驱动程序第二个部分:主要对驱动程序的实现进行详细说明。

开发编写Windows驱动程序需要两个东西:

一个是Windows Driver Development Kit,即DDK,这里用的是Windows 2000的DDK,现在可能比较难下载到了,win8都出来了,当然现在已经有更高版本的DDK了,但原理都差不多。

另外一个编写Windows驱动程序工具就是编译器:VC6.0,VS2008,VS2010哪个版本都可以。不过我用的W2K DDK只跟VC6.0一起用了,其它的我不能担保了。

编写Windows驱动程序工具都装好上之后,在开始菜单就会有一个DDK的菜单栏,里面有一个checked 和一个 free,Checked就是我们平时写程序的debug版本,free的那个就是release版本。刚开始分不清楚,随便点一个都成,进去之后就是一个DOS窗口,里面可以编译我们的驱动程序。找一个DDK的例子,敲Build试试编译一下。

然后说一下我们的虚拟串口驱动程序,传说windows的内核驱动程序分为3种——总线驱动、过滤器驱动和功能驱动。总线驱动很明显,就是驱动总线的。负责发现设备,通知设备管理器。过滤器驱动是什么呢?就相当于我们设计模式里面说的Adapter,他可以变更设备的接口行为,至于功能驱动嘛,就是真正实现设备功能的驱动啦。

我们要做一个虚拟的串口驱动程序,大家就很清楚,这个设备是一个虚拟的,虚拟的就不能在任何总线上面了。这样子,我们就先虚拟一个总线出来,然后告诉设备管理器,这里有一个串口,哈哈,设备管理器傻乎乎的就去找一个串口的功能驱动带过来用了,然后操作系统就会以为我们这里有一个串口了。

所以这个虚拟的串口驱动程序,实际上就由一个总线驱动、功能驱动构成。总线驱动负责说这里有几个串口,功能驱动就把这个假串口告诉PNP说这是一个串口,然后应用程序就会过来进行访问了。

这里就有一个问题,我要虚拟几个串口出来呢?什么时候报告设备管理器新的串口呢?

这个虚拟串口驱动程序是这么解决的,另外再搞一个应用程序,这个应用程序通知这个虚拟总线说,来,加一个串口,就相当于一个中断,这个虚拟总线就向我们的设备管理器进行报告,一路下去就OK了。

关于学习如何编写Windows驱动程序工具的扩展阅读答疑

问:

1.学习如何编写Windows驱动程序,需要那些基础?我的VC水平还可以,ASM也可以.我是学工控的.

2.学习编写Windows驱动程序的资料很匮乏,以E文的居多.是否主要就只有E文的关键呢?

3.你的学习编写Windows驱动程序过程是如何的?

答:

首先要确定你需要编写的是哪一类Windows设备的驱动,不同的设备的驱动的编写方法并不一样,编写一个显示驱动和编写一个网卡驱动完全是两回事。使用的编译器也未必相同,例如编写9X下的打印驱动需要16位的编译器,

如果你仅仅是想学习一下,不妨先学WDM驱动的编写,到书店去买一本机械工业出版社出版的《Windows   WDM   设备驱动程序指南》,这本书虽然翻译得太次,但好歹也算个入门的教材,你可以从中知道DRIVER的基本原理,知道DedriveIoControl调用时参数是怎样传递下来又是怎样在驱动中处理的,知道驱动的安装过程等等。

到微软的网站去把98DDK和2000DDK两者都下载下来,并不是所有的设备驱动都需要根据不同的操作系统重新编写的,例如网卡的驱动,在98和2000下是两进制兼容的,所以在98DDK中找不到网卡驱动的编写,只有2000DDK中才有,另外某些驱动还要到95DDK中去找(例如,视频压缩的驱动程序),当然最好是找一套完整的MSDN。

准备一个好的调式器,首选当然是SoftIce,但SoftIce调试驱动在Windows启动过程中加载的过程比较麻烦,调试显示卡的驱动可能更加无能为力,WinDebug可以解决这个问题,但需要两台机器同时进行操作,而且速度比较慢,两者需要根据实际需要进行选择。

编写Windows驱动程序过程中首先要了解硬件的一些实际操作,例如对DeviceIoControl传递下来的控制码和数据如何通过去控制硬件,是通过I/O读写,地址读写,还是产生一个中断等等,如果是USB或者1394接口的,则需要对管道,端点等概念有所了解。另外,还有很多的驱动并不涉及硬件,只是驱动堆栈中的一个中间层(如网络协议,硬盘镜像等),也有的即使是堆栈低层的也不涉及硬件,在上面说到的那本书中的很多例子都是如此。

微软DDK的中有很多样本,可以作为驱动的框架,进行代码的嵌入,最好不要自己从头写,否则在你还没有深入了解以前,会无从下手的。

编写Windows驱动程序参考资料即使是E文的也并不全,最好就是直接看DDK中的帮助,除了95DDK,其他的应该是很详细的了。

简单的驱动可以去找一个Numega   DriverStudio来写,但除非你的硬件读写操作很简单,否则作用不大。

主要还有靠实践。

演绎自:csdn

 

 

此条目发表在 windows驱动开发 分类目录,贴了 , 标签。将固定链接加入收藏夹。

发表评论