开发windows驱动的相关知识(转)

最近要搞windows驱动,正在做驱动入门。经百度,google加问两位驱动开发高手后,搜集了以下资料,记录下来,以后有新的再补上。

关于开发平台

   第一个遇到的问题就是开发平台。一查就发现有一大堆概念了!下面罗列出来:

VxD:

   啥都不说,先把百度百科的解释列出来

   虚拟设备驱动程序被简称为VxD。x代表各种设备的名字,如虚拟键盘驱动程序(vkd),虚拟鼠标驱动程序(vmd)等等。VxD程序是硬件成功初始化的途径。记得dos程序认为它们拥有系统的一切,当它们在虚拟机中运行时,Windows需要给它们一个实机器的替身。VxD程序就是这些替身。VxD程序通常虚拟一些硬件设备,所以,例如当一个dos程序认为它在同键盘通讯时,实际是虚拟键盘驱动程序在和dos程序通讯。一个VxD程序通常控制真正的硬件设备并对该设备在各个虚拟机之间的共享进行管理。 尽管如此,并不是说每个VxD程序必须和一个硬件设备相连。虽然VxD程序是用来虚拟硬件设备的,但是我们也可以把VxD程序看作是在第0级别的dll。例如,如果你需要做一些只有在第0级别才能做的工作,你就可以编一个VxD程序来为你完成这个工作。这样,由于此VxD程序并没有虚拟任何设备,你就可以把它仅仅看作是你的程序的扩展。

   VxD程序是Windows 9x特有的,它在Windows NT下不能运行。所以如果你的程序是依靠VxD的,它就不能被移植到Windows NT平台上去。

   作者语:说白了,VxD就是Windows 9x下的驱动程序模型,由于9x已经十分古老了,我们几乎可以忽略它。。。

DDK:

   这个应该是大家关于驱动听到得最多的一个概念了。再次上百度百科

   DDK是Device Development Kit,设备开发包的意思。一般指windows设备驱动程序开发包。如果你想开发一个设备驱动程序,如显卡驱动程序,就必须使用DDK。
   得到DDK需要二级订阅MSDN光盘,但是微软公司也经常不定期开放DDK的网络下载。

   作者语:DDK是NT下面的驱动开发Kit,它的地位就像Windows平台下软件开发的SDK一样,是驱动开发最核心的东西。

IFS Kit :

   这个无法百度百科到,自己写好了。IFS Kit全称Installable File Systems Kit,是专门用来写内核模式文件系统驱动和文件过滤驱动的模型。根据我查到的资料(尚未实践,不知道是否正确),IFS其实就是对DDK中关于文件系统的接口进行了一定的封装,使得开发者能够更加容易地用IFS Kit来开发与文件系统相关的驱动。可以肯定的是,装这个Kit就会把DDK也装上去了。

WDM:

   WDM(Win32 Driver Model),即Win32驱动程序模型,旨在通过提供一种灵活的方式来简化驱动程序的开发。在实现对新硬件的支持上,减少并降低了所必须开发的驱动程序的数量和复杂性。除了通用的平台服务和扩展外,WDM还实现了一个模块化的、分层次的微型驱动程序结构。

   以上是官方说法,自Windows 2000开始,开发驱动程序以WDM为基础的。根据从网上查回来的资料,WDM其实是一种驱动模型,就像VxD是另一种旧的驱动模型一样。而DDK则是一个驱动开发包,可以说WDM核心还是DDK,但是又对DDK进行了封装。

WDF:

   再次贴百度百科算了

   如所周知,自Windows 2000开始,开发驱动程序必以WDM为基础的,但其开发难度之大,根本不能奢望像用户模式应用程序开发那样容易。为改善这种局面,微软推出了新的驱动程序开发环境。要预先指出的是,这不是另起炉灶改弦更张,而是以WDM为基础进行了建模和封装,显著特点是降低了开发难度。因为:
1、   将原来普通程序设计中基于对象的技术应用到了驱动开发中。WDM中虽也有对象模型,但与真正的基于对象技术根本就不是一回事。为了实现基于对象的技术,微软精心设计了对象模型并进行了封装。属性、方法、事件等等“一个都不能少”。
2、    无论内核模式的驱动程序或者用户模式的驱动程序,都采用同一套对象模型构建,采用同一个基础承载。这个基础就是WDF。WDF虽然已经是经过封装和定义的对象模型,但对内核模式和用户模式对象来说,WDF又是两者的父对象。换言之两者都是继承了WDF才得到的,或者都是从WDF派生而来的。相对于内核模式,派生出的对象称为“KMD框架”即KMDF;相对于用户模式,派生出的模型称为“UMD框架”即UMDF。无论何种模式的框架,其内部封装的方法、执行的行为其实还是用WDM完成的。
3、   更重要的,也是微软反复炫耀的是封装了驱动程序中的某些共同行为:例如即插即用和电源管理就属于这种共同行为。因为大多数驱动程序中都需要处理即插即用和电源管理问题,据说这大概要上千行的代码,况且,没有相当水平还不一定能处理好。为了一劳永逸,WDF干脆将即插即用和电源管理封装了进了对象之内,一举成了对象的缺省(默认)行为。
4、   改变了操作系统内核与驱动程序之间的关系,WDM驱动程序中,一方面要处理硬件,另一方面要处理驱动程序与操作系统内核的交互。现在WDF则将驱动程序与操作系统内核之间进行了分离,驱动程序与操作系统交互工作交给框架内封装的方法(函数)完成,这样驱动开发者只需专注处理硬件的行为即可。这不仅避免了顾此失彼两面不周的弊端,也由于双方的分离,对操作系统内的某些改动,硬件制造商配套驱动程序的开发都有莫大的好处。
5、   两种模式的驱动程序(KMDF、UMDF)都使用同一环境进行构建,这一环境称为WDK。
      即KMDF,UMDF的开发环境为WDK。

作者语:貌似微软又再次发挥其封装的能力,把WDM封装成WDF。。。

WDK:

   还是贴百度百科

   WDK 是一种完全集成的驱动程序开发系统,它包含 Windows DDK,用于测试 Windows 驱动器的可靠性和稳定性.
包括:
Windows 驱动程序基础 (WDF) 简化了 Windows 驱动程序的开发和支持。
头文件重构(Windows Vista 和更高版本)通过提供更简单的目录结构、避免声明冲突以及对所有支持的 Windows 版本使用单一头文件集,减小头文件的复杂性。
可安装文件系统 (IFS) 工具包将头、库、示例以及文档作为 WDK 的一部分分发。
验证程序和静态分析工具(如 PREfast 和静态驱动程序验证程序)帮助您在编译时查找 bug。
   作者语:我在网上找到一条很另我兴奋的公式

WDK = DDK (Driver Development Kit) + HCT Kit (Hardware Compatibility Test) + WDF (Windows Driver Foundation) + DTM (Driver Test Manager) + WDF Driver Verification Tools + IFS Kit (Installable File Systems Kit) + Free ISO image download - Visual Studio 2005 out of the box integration

   WDK貌似是一个包含了众多最新驱动开发模型和工具的一个工具包,实际上如果你想开发Vista或Server 2008的驱动的话最好用WDK来开发。当然,我觉得它的核心还是DDK。

本节最后给一个WDK的方法:

上Microsoft Connect

http://connect.microsoft.com/

注册帐户并登录

选择站点目录

选择开发人员工具

在右侧选择WDK

选择下载就可以了

如何编译一个最简单的驱动

   在安装完WDK后,假设我的WDK装在D:\WinDDK。在目录D:\WinDDK\6001.18002\src下面就会有很多不同的例子,随便找个例子出来,比如D:\WinDDK\6001.18002\src\filesys\miniFilter\nullFilter。

   为了方便我下面就直接贴帮助文档了,大家可以从WDK Samples Index中查到所有示例的编译和运行方法。下面就把nullFilter的贴出来。

nullFilter Minifilter Sample

[This is preliminary documentation and subject to change.]
Description

The nullFilter minifilter is a sample minifilter that shows how to register a minifilter with the filter manager.

Theory of Operation

The nullFilter minifilter is a simple minifilter that registers itself with the filter manager for no callback operations.

Implementation and Design

You should use this sample if you are developing a minifilter.

Building the Sample
  1. Open the appropriate WDK free or check build environment to set basic environment variables that the build utility needs.
  2. Navigate to the directory that contains the device source code (for example, CD src\filesys\miniFilter\nullFilter).
  3. Run build -ceZ or use the BCZ macro. This behavior calls the Microsoft make routines that produce log files called Buildxxx_yyy_zzz.log, Buildxxx_yyy_zzz.wrn, and Buildxxx_yyy_zzz.err if there are any warnings or errors. xxx stands for "fre" or "chk" depending on the environment you choose, yyy stands for the operating system version (for example, "Wlh" for Windows Vista), and zzz stands for the platform version (for example, "x86" for x86-based, "IA64" for Itanium-based, or "AMD64" for x64-based).

If the build succeeds, the driver, nullFilter.sys, will be placed in a platform-specific subdirectory of your %TargetPath% directory that is specified in the Sources file.

Installation

End User

The nullFilter minifilter comes with an INF file that will install the minifilter. To install the minifilter, do the following:

  1. Make sure that nullFilter.sys and nullFilter.inf are in the same directory.
  2. In Windows Explorer, right-click nullFilter.inf, and click Install.

This installation will make the necessary registry updates to register the metadata service and place nullFilter.sys in the %SystemRoot%\system32\drivers directory.

To load this minifilter, run fltmc load nullFilter or net start nullFilter.

Code Tour

File Manifest

File
Description

nullFilter.c
The entire implementation of the nullFilter minifilter.

关于学习资源

以下是其中一位驱动开发高手给我的学习资源:

Sysinternals http://technet.microsoft.com/en-us/sysinternals/default.aspx
驱动开发网 http://bbs.driverdevelop.com/
OSR http://www.osronline.com/

我比较喜欢驱动开发网,可是据说OSR才是真正高手云集。看书的话《Inside Windows NT》毫无疑问必看,《Undocumented Windows NT》也不错。如果是搞文件过滤的话楚狂人系列可谓入门经典。但是最好的资源我觉得还是msdn和WDK自带的例子。

最后必须说明,我连驱动的门都没入,只是把我查到的资料发上来,大家如果看到哪些错了麻烦一定要指正。以后如果有新的我会更新上来。。。

posted @ 2009-05-25 17:40  回忆1919  阅读(1701)  评论(0编辑  收藏  举报