驱动开发

驱动类型 扩展名 OS版本 开发环境SDK开发包
VxD( Virtual Device Driver,虚拟设备驱动程序) .vxd Win3.1起,用于Windows 95/98/Me
KMD( Kernel Mode Driver,内核模式驱动程序) .sys Windows NT
WDM(Win32 Driver Mode,Win32驱动程序模型) .sys Win98起,用于2000/XP/2003 DDK(Driver Developer Kit):Windows 98的DDK,Windows Server 2003 SP1的DDK WDM驱动无非是微软在NT式驱动之上进行了扩充,过滤驱动也不例外 。
WDF(Windows Driver Foudation) 分为内核级的KMDF(Kernel-Mode Driver Framework),和用户级的UMDF(User-Mode Driver Framework)

KMDF:.sys

UMDF:.dll

Vista及以后版本 WDK(Windows Driver Kit):WDK8.1、WDK10 其实WDK可以看做是DDK的升级版本,现在一般的WDK是包含以前DDK相关的功能,现在XP下也可以用WDK开发驱动,WDK能编译出2000-2008的各种驱动。

ddk 和wdk区别

ddk是基于wdm驱动模型的,而wdk是基于WDF驱动模型的,wdm驱动模型和wdf驱动模型的最大的区别是:

1)wdf驱动框架对WDM进行了一次封装,WDF框架就好像C++中的基类一样,且这个基类中的model,IO model ,pnp和电源管理模型;且提供了一些与操作系统相关的处理函数,这些函数好像C++中的虚函数一样,WDF驱动中能够对这些函数进行override;特别是Pnp管理和电源管理!基本上都由WDF框架做了,而WDF的功能驱动几乎不要对它进行特殊的处理;

2)WDF驱动模型 与WDM驱动模型的另外一个主要区别是:

WDF 驱动采用队列进行IO处理,而WDM中将所有的IO操作都用默认的队列进行处理,如果要进行IRp同步,必须使用StartIO;

3)WDF是面向对象的,而WDM是面向过程的,WDF提供对象的封装,如将IRP封装成WDFREQUEST,对象提供方法和Event。

5)usb设备的读写;

当应用程序使用ReadFile或WriteFile进行读写时,首先将

UsbBuildInterruptOrBulkTransferRequest将构建urb请求,然后通过IoCallDriver发送给底层usb 总线驱动;

对于WDF来说,WdfUsbTargetPipeFormatRequestForRead 格式化读请求,然后使用WdfRequestSend  发送给底层Usb总线驱动;

对WDM和WDF的usb的读写都可以设置完成例程;

怎么样快速入门windows内核编程

实际上我的windows内核编程和恶意代码分析的经历只有3个月,还不知道今后能不能继续用得上。我很幸运地接受到一个博士后老师指导,他原本是想让我帮他实现一个系统来着,计划开发周期为8个月,而我由于保不了研,不得不只做出一个原型,就被迫找工作。

    其实他也没手把手教我,只是交给了一些资料,教给我做研究并独立解决问题的方法,让我规避了很多陷阱,下面列举一些最有用的资料:

1、入门的话,当属codeproject上的Driver Development Part系列。你google一下,会出1~7章,每章都用简洁精练的语言把windows驱动开发最难的部分讲清楚了,比国内很多教程强得多。我这么笨的都能看懂。

2、学windows内核驱动编程就应该从学写rootkit开始入门,这个有意思。到网上找《Professional Rootkits》和《subvert the windows kernel》的电子书来看,把他们配套的程序都玩一下,想想怎么样改进,各种rootkit的功能排列组合一下看能不能生成更强大的。网站www.rootkit.com上有更多的开放源代码的rootkit和keylogger,当你觉得它好玩的时候,会对他们的原理产生兴趣,才会驱动你去做更进一步的研究,有兴趣才会有动力。

3、《Windows NT(2000) Native API Reference》是一份很重量级的资料,有事没事翻一翻,会有新的收获,遇到自己感兴趣的函数,就可以放到google里查一下它的用法。如果查不到或者查到的不满意,可以把函数放入reactos中查也是一种学习的好方法。reactos一个非官方的开源的xp内核源码。

4、最后就是看windows出的《windows internal》大块头书,现在出到第五版。

5、codeproject上有其他的Windows驱动编程,有空可以看看,关键词搜"hook","rootkit",老外很慷慨,会把他们自己创新的想法和POC程序写出来供大众参考学习。

6、到看雪或者第八个男人论坛去看别人历史以来的提问,开源程序。但这些都相当次要,前面1~4才是重量级的。

步骤1到步骤5可以相互结合着一起做会事半功倍。初学的时候,先别急着考虑各种绕过机制,先把基础夯牢,磨刀不误砍柴工,沉得住气,才能做大学问。

其实成为大牛的路并不遥远,只是很多人找不到路,或者在途中半途而废而已,做学问切忌浮躁,一步一步来,慢慢来。

 

驱动编写

DDK是Device Development Kit,设备开发包的意思。如果你想开发一个设备驱动程序,如显卡驱动程序,就必须使用DDK。

 

驱动编写可以分多种情况,下面分别讨论:

1、串口通讯。

Windows自身带有串口通讯的API,所以一般串口通讯不需要编写单独的驱动程序,只需要调用系统功能就可以了。VB带有MSCOMM控件(QA000388 "MSComm无法在中文Windows 95下传递二进制数据"),而VC++可以参考QA000162 "在VC中如何开发串囗",Delphi可以参考QA002595 "在Delphi中怎样控制 Modem"。绝大多数串口外置的MODEM的驱动程序就是一个.inf文件(这个文件的规范在DDK中有说明),而没有实际的驱动文件。不过软猫不能使用这个办法。如果ISDN设备是通过串口的,也可以仿照MODEM编写这样的串口文件(当然如果要支持CAPI,就编写使用CAPI SDK编写驱动程序)。

2、使用现成的驱动软件包。

如果你的硬件是比较简单的数据采集卡这样的硬件,也可以使用一些现成的驱动软件包,这些软件包提供了一些基本的硬件操作功能,这样你可以免除使用DDK开发的苦恼。而且这些工具多数支持Delphi、VB、C++ Builder这样的软件,这样可以解决这些软件无法调用DDK编写驱动的问题。可以参考QA000335 "如何在VB中如何控制端口和物理地址"。这样的商业工具包括NTPort Library(http://china.zealsoft.com/cn/ntport/)、MemAccess Library(http://china.zealsoft.com/cn/memaccess/)、WinDriver等。

3、使用DDK编写

如果前两种情况都不适用,你就需要使用DDK编写了。每个Windows版本都有对应的DDK,其主页为http://www.microsoft.com/whdc/devtools/ddk/default.mspx,通常需要定购MSDN才能获得。你也可以下载KMDF(http://www.microsoft.com/whdc/driver/WDF/KMDF_pkgdwn.mspx?),其中包括了Windows Server 2003 SP1的DDK。可以从http://download.microsoft.com/download/win98SE/Install/Gold/W98/EN-US/98DDK.EXE下载。。当然你应该根据自己使用的操作系统进行选择。Win9x的主要驱动都是VxD类型的,可以在Win95/98/Me下使用,但不能在WinNT/2000下使用。WinNT的驱动一般都是.sys文件,Win2000可以兼容WinNT驱动,但一般不能在Win9x下使用。所以如果你要支持Win9x和WinNT,需要编写两类驱动程序。USB设备的驱动程序是WDM类型的,扩展名为.sys,但只能在Win98/Me/2000下使用。

Win98 DDK和Windows 2000的DDK安装比较简单,而且和VC++配合的比较好,最好使用这两个DDK包。Win95 DDK和WinNT DDK默认安装需要Win32 SDK,如果没有,需要手工修改环境变量或SETENV.BAT,略微麻烦一些,最好不使用。除了安装DDK,还需要VC++进行编译,最好是VC++ 6.0。其他软件都不是必须的。当然,最好有SoftICE作为调试工具。

驱动的编写同一般程序有很大不同,所以建议买本书,参考QA001005 "有关DDK编程的书籍"。你也可以参考QA002697 "PCI设备Windows通用驱动程序设计",以了解一个大概。

此外,也有一些DDK的增强工具,如DriverWorks(http://www.numega.com/),这个软件和DDK相比,就如同MFC和API。

ntport library    enables your win32 applications to real-time direct access to pc i/o ports without using the windows drivers development kit(ddk).     该库是很多需要直接访问pc机的io端口的软件的“标配”,就算你未安装该库,打开控制面板的“添加或删除程序”有时你也会发现该库已被安装好了: memaccess library (也是非常著名的直接访问内存的库)    memaccess library让程序员控制设备,而无须借助于ddk。这个工具允许实时读取物理内存。典型的应用程序包括控制isa和pci设备。memaccess library可以替代basic的peek和poke语句。memaccess library还支持获取pci设备的配置空间的基地址。产品中包括visual basic(vb 6.0/vb.net)、visual c++、borland c++ builder、visual c#、delphi的示例。另外,可以下载visual fortran、powerbasic的示例。 附录:ntport library相关资源 ------------------------ http://www.zealsoft.com/ntport/index.html http://www.zealsoft.com/ntport/books.html // recommend following books which will help you understand how to use ntport library to interface with your hardware devices.

参见

  1. Windows驱动开发如何入门- CSDN博客

  2. 【技术分享】从一篇文章入门Windows驱动程序(一)

  3. 【技术分享】从一篇文章入门Windows驱动程序(二)