wdm驱动开发之路
WDM驱动
Windows驱动开发模型WDM学习笔记绪言 (4)1.WDM驱动程序开发基础知识 (5)1.1WDM简介:Win32 Driver Model Win32驱动程序模型 (5)1.2 Win32 API (5)1.3 WDM特性 (5)1.4 WDM工作原理 (6)1.5 WDM与其它驱动程序的比较 (6)2.WDM驱动程序开发环境DDK设备驱动程序开发包 (6)2.1■安装DDK (6)2.1.1.Windows 98 DDK的安装 (7)2.1.2.Windows 95 DDK的安装 (7)2.1.3.NT DDK的安装 (8)2.2 ■构造环境:建立WDM驱动程序构造环境的方法 (8)2.2.1. 用SETENV.bat来安装驱动程序构造环境 (9)2.2.2. 手工运行SETENV.bat (9)2.2.3. 构造WDM驱动程序 (9)2.2.4.构造驱动程序 (9)2.2.5.检查Windows 98 DDK的安装 (9)3.WDM驱动程序的设计与开发 (10)3.1■WDM 驱动程序的运作流程 (10)3.2■驱动程序设计 (10)3.3■驱动程序开发 (11)3.3.l.编写驱动程序框架 (11)3.3.2.测试驱动程序 (11)4.WDM驱动程序编译运行:编译和安装设备驱动程序的方法 (12)4.1■编译设备驱动程序的方法 (12)4.1.1.举例分析 (12)4.1.2.编译的基本步骤 (13)4.2■设备驱动程序的安装和启动 (13)4.2.1.添加注册表中的键值 (13)4.2.2.控制驱动程序的装入次序 (14)4.2.3.驱动程序的Start值 (14)4.2.4.修改注册表的方法 (15)4.2.5.启动设备驱动程序 (15)4.2.6.调试工具 (16)5.wdm驱动开发基础-一些需要注意的问题汇总 (16)5.1注册表的角色 (16)5.2.如何命名注册表键 (16)5.3从用户模式中访问设备键 (17)5.4 函数原型“IN”关键字 (17)5.5 注册设备接口 (18)5.6 初始化设备扩展 (18)5.7 注意侧效 (19)5.8 try-finally中的控制流程 (20)5.9 生成异常 (22)5.10 __Leave语句 (23)5.11 简化页大小 (24)5.12 页故障关于分页 (24)5.13 alloc_text的使用 (25)5.14 关于段布置 (26)5.15 服务函数描述 (26)5.16 ExAllocatePoolWithTag (28)5.17 ExAllocatePool的其它形式 (29)5.18 单链表 (30)5.19 lookaside链表的服务函数 (31)5.20 打开注册表键 (31)5.21 删除子键或键值 (32)5.22 枚举子键或键值 (33)5.23 IRQL限定 (35)5.24 IRQL的明确控制 (35)5.25 自旋锁 (36)6. wdm驱动开发基础代码分析解析 (36)绪言在Windows的不同版本上开发的驱动程序“模型”(模型这个词语应该来源于单词“Mode”。
WDM驱动开发之路(1)
WDM驱动开发之路(1)WDM开发之路(1)--驱动开发网WDM教程WDM驱动开发之路写在前面:在专栏的前几期中,我们一起初步学习了vxd的开发技术。
Vxd技术是很深奥的,不是一篇两篇文章能讲清楚,但你已经入了门,剩下的就要看你的修行了。
多看书,多泡论坛(当然是上咱们的驱动开发网论坛了:->),多写程序…我的手不够用了。
功到自然成嘛。
不过话又说回来,vxd只是权宜之计,WDM才符合当今的潮流(程序员都是时髦人士,君不见先是VB、VC然后是asp、JSP、PHP,数也数不过来呀),Win9x寿终正寝时也就是vxd的末日,你不想随它而去吧(开个玩笑),那就随我来。
按笔者的想法,这篇文章写成连载形式,一次讲一个主题,并且必要时带着例子,让大伙step by step地把WDM驱动弄个透底,不想让大家觉得稀里糊涂,也不想让大家觉得白买杂志了。
今天我们一起讨论第一部分,了解篇。
(一)了解篇WDM模型(Windows Driver Model)是微软公司为当前主流操作系统Windows98和Windows 2000的驱动程序设计的一种构架。
它和传统的win3.x和win95使用的vxd的驱动是完全不同的体系结构。
不过对于最终用户来说,WDM驱动程序在Windows98和Windows2000下的表现很相似。
作为驱动开发人员来说,它在两者中有很多的不同。
并且Windows98中的WDM只能算是Windowss2000中的WDM的一个了集。
在Windows98中有一些驱动程序只能使用VXD来实现,如串行通讯驱动等。
要写驱动程序,首先要了解操作系统的结构。
在WDM体系中,windows2000操作系统中是最标准的实现方式,Windows98则是部分兼容WDM结构。
照微软的说法,Windows98和Windows2000 X86(Intel 架构)版本实现二进制码兼容(参见98DDK),Windows2000 x86版本与其它CPU平台版本实现源码级兼容(因为Windows 2000是基本NT相似的结构,最底层是硬件抽象层HAL,所有我们相信它们之间能源码级兼容)。
USB驱动程序的编写采用WDM驱动程序
U S B驱动程序的编写采用W D M驱动程序Document serial number【UU89WT-UU98YT-UU8CB-UUUT-UUT108】USB驱动程序的编写采用WDM 驱动程序。
WDM 驱动程序是一些例程的集合,它们被动地存在,等待主机系统软件(PnP 管理器、I/O 管理器、电源管理器等)来调用或激活它们。
具体驱动程序不同,其所包含的例程也不同。
一个WDM 驱动程序的基本组成包括以下5个例程:(1)驱动程序入口例程:处理驱动程序的初始化。
(2)即插即用例程:处理PnP 设备的添加、删除和停止。
(3)分发例程:处理用户应用程序发出的各种 I/O 请求。
(4)电源管理例程:处理电源管理请求。
(5)卸载例程:处理驱动程序的卸载。
包含文件:, ,, , , makefile,sources)在文件中,包含了上述五个例程:中定义了各种数据结构还有各种IOCTL控制码,用于不同数据的读写。
中实现了各种驱动例程。
包含了上述五个所说例程外还包含了其他例程,课程从下面的驱动程序入口例程得出一些信息。
驱动程序入口例程:NTSTATUSDriverEntry(IN PDRIVER_OBJECT DriverObject,IN PUNICODE_STRING RegistryPath){NTSTATUS ntStatus = STATUS_SUCCESS;PDEVICE_OBJECT deviceObject = NULL;DriverObject->MajorFunction[IRP_MJ_CREATE] = Ezusb_Create; DriverObject->MajorFunction[IRP_MJ_CLOSE] = Ezusb_Close; ources. If you want to add a new source # file to thiscomponent. This file merely indirects to the real make file # that is shared by all thedriver components of the Windows NT DDK # !INCLUDE $(NTMAKEENV) 不要编辑这个文件。
WDM设备驱动程序的设计和实现
1 WD M
11 WD 概 念 . M
维普资讯
S IT C F R TO E E O M N C — E HI O MA I N D V L P E T&E O O Y N C NM
文章编号:0 5 6 3 (0 7 0 - 2 2 0 10 - 0 3 2 0 )5 0 0 — 2
1 WD . 2 M的工作原理 WD M是一种分层化 的驱动程序模 型 , 在这种模 型中 , 驱动程序的层
个 高层 的驱动程序必须具有低层 驱动程序绝 大多数I P M _ X R _ JX X
和堆栈一起 工作 , 处理 I / O请求 。Wi o so 0 n w 2 o ⅨP的 I d / O子系统是基 于 对 象 的,对 WD 而言 ,最 重要 的对象 是驱 动程序对 象 和设备 对象 。 M
20 年 07
第 l卷 第 5 7 期
WD 设备驱 动程序 的设计和 实现 M
秦 为 郭志平 吕彩琴 周力农 , , ,
( . 大学机 电工程学院 , 1中北 山西太原 ,30 12内蒙古一机集团科研所二室 , 0 0 5 ;. 内蒙古包头 , 10 2 04 3 ) 摘 要: 设备 驱动程序是硬件设备连接 到计算机 系统的软件接 口。分析 了 WD 的工 M
Wid w 20 / P的 I no 80 0X / O子系统也是一 个包驱动系统 , 在该 系统中 , 每个
例 程人 口, 若设计 一个中间层驱动程序 , 首先应确认下层驱 动程序所 管
基于Windows开发WDM设备驱动程序的方法
基于Windows2000开发WDM设备驱动程序的方法摘要:本文介绍了Windows 2000 WDM驱动程序结构及其原理,给出一个驱动程序的例子关键词: WDM 驱动程序1.概述引入了全新的WDM (Win32 Driver Model)的驱动程序架构,说是新技术,其实早在1997年Microsoft就提出了该项技术并在Windows 98中得到了充分的应用,换句话说,Windows 98也支持WDM。
这样WDM就成为了一个跨平台的驱动程序模型不仅如此WDM驱动程序还可以在不修改源代码的情况下经过重新编译后在非Intel平台上运行。
2.WDM设备驱动程序的特点和原理2.1通用驱动程序对基本上一样的硬件,因为他们共享一个总线或完成类似的任务,设备驱动程序可以使用这些标准的驱动程序功能,使公共总线的共享容易,且更容易写出新的驱动程序,总线驱动程序,如USB、1394,和类驱动程序。
(1)Win32程序接口:可以使用Win32函数像访问文件那样访问设备CreateFile() 、Closehandle()、ReadFile()、WriteFile()、DeviceIoControl ()用于发出特殊请求,可发送数据给驱动和从驱动得到数据,IOCTL代码可以是预先定义的也可是自己定义的。
(2)创建设备大多数WDM设备对象都是在PnP管理器中调用AddDevice入口时创建,这个PnP 例程在插入新设备和安装Inf文件时被调用,此后一系列的PnP IRP 被发送到驱动程序,指示设备应如何启动和查询它的功能2.2WDM-的工作原理WDM是在NT 4.0驱动程序结构上发展起来的,所以它与NT 4.0驱动程序极为相似,但是它却有了本质上的提高,比如它支持USB、IEEE 1394、ACPI等全新的硬件标准。
虽然Windows 98与Windows 2000都支持WDM,可是并不意味着Windows 98下的VxD可以在 Windows 2000下运行,而NT下的WDM却可以在Windows 98下运行。
开发WDM型USB设备驱动程序
开发WDM型USB设备驱动程序USB设备驱动程序开发⼯具开发USB设备驱动程序需要专门的开发⼯具,⽬前应⽤⼴泛的⼯具主要有两⼤类。
⼀类是Microsoft公司提供的Windows DDK(Device Driver Kit)。
它有Windows 98 DDK 和Windows 2000 DDK两个版本。
Windows 98 DDK能够开发Windows 95/98/Me/NT下的VxD、KMD和WDM驱动程序。
Windows 2000 DDK 能够开发Windows 98/Me/NT/2000下的KMD和WDM驱动程序。
由于DDK基于汇编语⾔的编程⽅式和内核模式的调⽤,对没有深厚的OS原理和编程⽔平的⼈员来说,任务相当艰巨。
另⼀类是NuMega公司提供的DriverStudio,它是⼀个⼤的开发⼯具包,包含VtoolsD、SoftICE和DriverWorks等开发⼯具。
VtoolsD开发包提供了对VxD编程的C/C++类库⽀持,利⽤VtoolsD中的QuickVxD⼯具可以快速⽣成VxD的C/C++代码框架,开发者可以在此基础上根据各⾃的需要添加⾃⼰的代码。
DriverWorks⽤于开发KMD和WDM驱动程序,并且对DDK函数进⾏了类的封装,从⽽为开发Windows NT、Windows 2000和Widnwos98 WDM设备驱动程序提供了⼀个⾃动化的⽅法。
DriverWorks,提供了VC++下的开发向导Driver Wizard,按照它的提⽰可以迅速地⽣成驱动程序的框架。
这个框架结构提供可以正确执⾏WDM动态环境中IRP的请求,⽽且,也包含⽤于简化系统提供的标准类驱动程序(如HID、流)和总线驱动程序(如PCI和USB)接⼝的类等。
总之,利⽤DriverWorks开发WDM驱动程序,可以⼤⼤简化开发⼈员的⼯作量、缩短开发周期以及降低开发驱动程序的难度。
[1]⽤DriverWorks开发WDM型USB设备驱动程序要想使⽤DriverWorks,必须先安装以下软件:DriverStudio2.5,VisualStudio6.0,以及Windows2000DDK。
PCI9052 WDM驱动开发
在设计和使用PCI设备时,经常要在PC机的软件中访问和控制硬件设备,但Windows操作系统(Windows NT、Windows2000、WindowsXP)为了保证系统的安全性、稳定性和可移植性,对应用程序访问硬件资源加以限制,这就要求设计设备驱动程序以实现PC机的软件对PCI 设备的访问。
内核(Kernel)模式的驱动程序可以应用于WINDOWS NT和WINDOWS 2000的操作系统中。
它区别于WDM(Win32 Driver Model)模型,主要不支持即插即用,但对于编程的思想二者基本上一致,对于本文所述的DMA编程的方法在WDM模式的驱动程序中一样适合。
本文通过现有最常见的AMCC公司生产的AMCC S5933 PCI 控制芯片为例说明在WINDOWS NT平台下如何编写设备驱动程序以实现DMA传输方式。
本文对基本的驱动程序设计技术不作详细的说明,重点介绍PCI设备驱动程序开发的相关技术与实现方法,以及用户接口程序的设计与实现技术。
1 NT平台驱动程序模式及开发工具设备驱动程序是指管理某个外围设备的一段代码,驱动程序不会独立地存在,而是操作系统的一部分。
通过设备驱动程序,多个进程可以同时使用这些资源,从而可以实现多进程并行运行。
在本文中,将调用设备驱动程序的PC机程序称为用户程序。
Intel 80386以上的微处理器有4个优先级别:0级、1级、2级和3级。
Windows NT使用了一个简化的模型描述硬件特权级,然后这个模型映射到指定CPU上可用的特权检查机制,即内核模式和用户模式。
内核模式对应于Intel系统的0级,可以执行特权级指令,对任何I/O 设备有全部的访问权,还能够访问任何虚地址和控制虚拟内存硬件。
用户模式对应于Intel系统的3级环,用户程序在该模式下运行,对硬件的访问操作受到系统的限制。
开发设备驱动采用的工具包括微软为驱动开发提供的设备驱动开发包(Device Driver Kit,DDK)。
如何为ISA设备编写WDM驱动程序
如何为ISA设备编写WDM驱动程序WDM(Windows Driver Mode1)是Microsoft公司全新的Windows驱动程序模式,支持即插即用(PNP)、电源管理和WMI技术,它的运行平台是Windows 98/2000/XP/2003操作系统。
这种具有跨平台性的设备驱动模型可以大大简化驱动程序的开发工作,为用户的PNP设备驱动完成了大量的底层工作。
这也使得WDM对各种老设备,特别是那些不具有即插即用特性硬件的支持明显的不足。
在科研和工控中,最常用的数据采集卡通常都是基于PC总线的不能为PNP提供硬件支持的ISA设备。
为这类硬件编写非WDM驱动程序只能局部支持PNP特性,而且需要做大量额外的工作如:必须检测硬件,为硬件创建设备对象(用于代表硬件),配置并初始化硬件使其正常工作,这些工作非常复杂。
利用WDM可以大大简化这些工作。
1 WDM的结构WDM实际上是一个编写驱动程序的规范。
其驱动程序结构的特点和WINDOWS程序设计的消息驱动机制很相像,采用IRP驱动机制。
WINDOWS 98和WINDOWS 2000处理IRP 的方式一样,本质却完全不同。
Windows2000的内存管理采用了虚拟内存的概念,系统表现为具有一个比物理内存大得多的虚拟内存空间。
每个进程都被赋予它自己的虚拟地址空间,这个地址空间划分成固定大小的页(x86、32位处理器的页大小为4KB),一个页可以驻留在物理内存(非分页内存),或者被交换到硬盘上(分页内存)。
当进程中的一个线程正在运行时,该线程可以访问只属于它的进程的内存,属于所有其他进程的内存则隐藏着,并且不能被正在运行的线程访问。
每个进程有独立的内存空间,不会被其他程序访问,保护了数据的完整性。
这样,有一部分内存实际上不是在物理内存中,而是在硬盘上。
当访问并不存在于实际物理内存的地址时,内存管理器引发DISPATCH_ LEVEL级别的页故障中断,调用硬盘驱动程序把故障页读入内存。
WDM驱动程序开发之驱动框架篇:KDriver类
KDriver类:一、OverviewKDriver类提供了一个设备驱动程序的框架。
这个类的职责包括初始化驱动程序,把I/ O请求传递给它们的目标设备对象。
KDriver是一个抽象类,驱动编写人员必须写一个新的类来继承它。
新的子类必须重写DriverEntry函数,这是当系统载入驱动程序时框架要调用的函数。
这个派生类会有一个构造函数,但是构造函数不允许有参数。
一般来说,最好不要写这么一个构造函数。
把一切的初始化工作放在DriverEntry函数里来进行。
对于任何给定的驱动,只能有一个KDriver 类的实例存在,而且这个实例是框架自动创建的。
任何调用者可以通过调用DriverInstan ce静态函数来获得一个指向这个唯一实例的指针。
驱动编写人员必须做的另一件事情是通知框架:哪个类作为驱动框架来提供服务。
框架提供了定义了一个宏定义DECLARE_DRIVER_CLASS来实现这个事情。
任何一个驱动程序里都必须调用一次且只能调用一次这个宏,一般是在拥有DriverEntry函数的组件里。
这个宏必须放在任何函数之外,因为它事实上声明一个可以被框架调用的函数。
宏的参数应该是继承了KDriver类的那个类的名字。
除了DriverEntry,KDriver还有其他两个成员函数来做初始化的工作:RequestRei nitialization() 和Reinitialize()。
一个驱动程序在DriverEntry函数里调用RequestRe initialization()函数来指示系统调用Reinitialize()函数,作为第二级初始化。
而Reiniti alize()函数是一个可被重写的虚函数。
如果想要系统具有卸载(Unload)驱动的功能,就要在function.h文件里做一个声明:#define DRIVER_FUNCTION_UNLOAD。
这是虚函数Unload()的得到声明。
这个函数在基类中的实现代码调用了DeleteDevices() 函数来为这个驱动程序创建的每个设备调用析构函数。
WDM驱动程序设计之编译安装篇
设计开发好自己的WDM驱动程序后,为了运行该驱动程序,我们必须编译和安装它们。
编译设备驱动程序的方法安装DDK后,在DDK程序组下有Check和Free两个编译环境,Check环境用于编译带调试信息的驱动程序,Free则是编译正式发布版本的环境。
通常情况下设备驱动程序的编译采用命令行的方式。
通过一定的设置可以在VC ++的集成环境下编译。
一般来说,成功编译一个最基本的设备驱动程序需要四个文件,第一个是驱动程序,即C语言源程序文件(例如vdisk.c,注意下面所有的例子都是以vdisk来说明);第二个是RC 文件(例如vdisk.rc);第三个是sources文件;第四个文件是makefile.rc文件。
sources 文件和make文件类似,用来指定需要编译的文件以及需要连接的库文件。
这三个辅助文件都很简单,在DDK samples的每个例程里都有三个这样的文件,依样画瓢就能理解它们的结构和意义。
1.举例分析以下以vdisk程序为例,设vdisk.rc代码为:/vdisk.rc/#include#include#define VER_FILETYPE VFT_DRV#define VER_FILESUBTYPE VFT2_DRV_SYSTEM#define VER_FILEDESCRIPTION_STR "SCSI VDisk Driver"#define VER_INTERNALNAME_STR "vdisk.sys"#define VER_ORIGINALFILENAME_STR "vdisk.sys"#include "common.ver"/end of vdisk.rc/设备驱动程序一般都使用Build实用程序来进行,Build只是NMAKE外面的一个外包装程序。
Build本身其实相当简单,编译的大部分工作实际上由Build传递给NMAKE来进行。
设备驱动开发大作业
《驱动程序开发技术》大作业——WDM驱动程序的开发流程和要点摘要WDM(Windows Driver Model)是Microsoft公司推出的一种符合Windows2k/XP下的内核模式驱动程序的分层体系结构的驱动程序模式。
它源于 Windows NT的分层32位设备驱动程序模型,它支持更多的特性,如即插即用( PnP ,Plug and Play )、电源管理( PM ,Power Management )、Windows管理诊断( WMI ,Windows Management Instrumentation )和 NT 事件。
它为Windows操作系统的设备驱动程序提供了统一的框架,在Windows平台上,WDM 将成为主流的驱动模式。
WDM是Windows98和Windows2000使用的新的驱动程序设计规范。
使用WDM使得硬件驱动程序更加稳定,让操作系统对硬件更加有效地控制硬件。
除了定义一个驱动程序与操作系统连接的标准接口以外,WDM也指明了驱动程序应该采用的更加模块化的设计。
WDM引入了功能设备对象FDO(Function Device Object)与物理设备对象PDO(Physical Device Object)两个新类来描述硬件,一个PDO对应一个真实的硬件。
一个硬件只允许有一个PDO,却可以拥有多个FDO,在驱动程序中直接操作的不是硬件而是相应的PDO和FDO。
关键词: WDM;驱动程序;操作系统; FDO; PDOWDM驱动程序的开发流程和要点1 概述WDM(Windows Driver Model)是Microsoft公司推出的一种符合Windows2k/XP下的内核模式驱动程序的分层体系结构的驱动程序模式。
相对于以前的KDM、VXD来说,它的性能更高、系统之间移植更加方便。
随着Microsoft的操作系统的不断升级,WDM已逐步取代了KDM、VXD,成为了Microsoft系统下驱动程序开发的主流。
WDM驱动程序
建立驱动开发环境建立驱动开发环境,所需的软件为DriverStudio3.2 + DDK2003 + VC。
DDK建议使用最新的DDK2003,因为可以减少很多麻烦。
使用DDK2600的话,很多人反映会碰到一个编译出错的问题。
这是我使用DDK2600时碰到的同样的问题,然后在EDNchina网站上发的贴:--------------我在用DriverStudio开发驱动时,碰到了这样的问题:--------------------Configuration: KFileWrite - Win32Free--------------------d:\DESIGN~1\DRIVER~1\DRIVER~4\include\kcsq.h(35): Could not find the file csq.h.d:\DESIGN~1\DRIVER~1\DRIVER~4\include\kcsq.h(35): Could not find the file csq.h.Linking with DDK linker...LINK : fatal error LNK1181: cannot open input file 'ntstrsafe.lib' Error executing link.exe.KFileWrite.sys - 1 error(s), 0 warning(s)关键是这个ntstrsafe.lib.我在网上一搜,碰到这种问题的人还不少呢,虽然解决方法是很多,但都差不了几个字,要么从DDK2003那拷一个,或者是在project-->setting-->link下去掉对ntstrsafe.lib的链接,也不知他们自己到底有没有试,我在project-->setting-->link下压根就没看到ntstrsafe.lib几个字...很郁闷啊--------------网上所说的解决方法是对的,但没有说清楚,使人无法一时明白。
ISA板卡的WDM驱动程序开发
作, 提供 给开 发 者一 个 非 常 简 洁 的界 面 , 发 者 开 要做 的工 作 就是 根 据 硬 件 的特 定 功 能 编写 相 应 代码 。 1 )使 用 WD D v eD vrWi r M ei r e z d建立 驱 c i a 动程序 开 发工程
吴淦 华 殷 锋
中 国电子科技 集 团公 司第二 十 七研 究所 郑 州 40 1 50 5
摘
要 :S IA总线作 为一种工业标 准体系结构总线 , 在工业控 制中被广泛应用 。本文 从工程应用角 度介 绍
了使用 N m g r eSui 开发 IA设备 WD u eaD i rtdo v S M驱 动程序 的方法 , 并简单介绍了其应用程序 的开发过程。
3 2使用 D ie t i . r r u o开发 WD vS d M驱 动程序
和L M为接收端输出信号 ,C P M为发送端输出信 号 。接收端 信号 流程 如 图 1发 送 端 信号 流 程 如 ,
图 2 。
使 用 D i rtd r eSui 以大 大地 简 化 WD 驱 v o可 M 动程 序 的开发过 程 , 因为它封 装 了底 层 的繁杂 操
WD 的原理 和编 程方 法 。 M 本文 以一块 IA 同步通 讯卡 为 硬件基 础 , S 从 工程 应 用 角 度 介 绍 了使 用 N meaDi rtdo u g reSu i v
3 驱动程序开发
3 1在 系统 中创 建新 的硬件 类型 . 进 入 系统 注册 表编 辑 器 , H E — O A _ 在 K Y L C L
接收 硬件 源分 下: 端 资 配如
WDM入门教程
WDM入门教程学习和编写WDM 驱动程序对谁而言都是一件具有挑战的事情,需要恒心和毅力。
当你入门后你会发现这是一件多么令人兴奋的事情。
但是如何使用WDM的编译环境从而开始WDM学习的旅程?对一个初学者来说这个门槛可不低。
安装完DDK后,可以用[开始]->[Development kit]->[Windows XX DDK]->[check/free Build Environment]来启动编译环境,由于DDK没用提供IDE环境(当然你可以使用配置后的VC或DriverStudio这另当别论),对于我们这些孕育在Xp时代的程序员来说这无疑是件难事。
为什么?因为编译一个WDM程序除了.cpp .h 源文件外至少还需要:makefile文件sources 文件这两个文件本应该由IDE自动帮我们生成,如VC就为我们的所有工程生成了makefile,sources,xx.rc文件,平时我们根本不需要了解他们就可以编译我们的工程。
可DDK没有工具为我们生成这两个文件,但DDK编译程序的时候又需要他们,俗话说得好“我不如地狱谁入地狱”,我们就来编写这两个文件:一.makefile (没有扩展名,它名字就叫makefile),内容如下:# DO NOT EDIT THIS FILE Edit .\sources. if you want to add a new source# file to this component. This file merely indirects to the real make file# that is shared by all the components of NT.#!INCLUDE $(NTMAKEENV)\makefile.def值得高兴的是,WDM程序使用的所有makefile都这样写,我们只需写一个,编译时把它拷贝到工作目录下就行了二.sources文件就需要我们根据不同的场合修改了,不过基本模板如下:TARGETNAME=驱动程序名// 告诉编译器连接生成的文件名为“驱动程序名”(不含扩展名)TARGETPATH=obj // 固定不变TARGETTYPE=DRIVER // 固定不变(表明,连接成*.sys <驱动程序>文件)DRIVERTYPE=WDM // 为 Win32 Driver Model 驱动INCLUDES=$(BASEDIR)\inc\ddk;$(BASEDIR)\inc // 源程序可能使用的DDK头文件所在的目录// 多个目录用“;” 隔开SOURCES=aa.cpp bb.cpp // 将编译的源文件(不写*.h), 资源文件(*.rc)// 多个文件用空格隔开其中“$(BASEDIR)”指DDK当前的安装目录,例如当前DDK安装在D:上,则$(BASEDIR) 就是“D:\DDK”,所以上面的INCLUDES可以翻译成D:\DDK\inc\ddk; D:\DDK\inc三.不得不注意的3个讨厌问题:1. 编译时必须保证 makefile,sources和源程序在同一目录下2. 编写sources文件时,其中的”=”两边不能有空格3. 如果上面的问题还不够讨厌,那么下面这个问题可以讨厌的让人放弃学习DDK,工程的工作目录的绝对路径中不能出现空格,如“C:\Documents and Settings\MyProgramme\”将不能被DDK编译器编译,而且表面上看来DDK好像是完成的编译,实际上它什么都没做!1:首先安装好WDK,然后进入"开始"->"所有程序"->"Windows Driver Kits"->"WDK XXXX.XXXX.X" ->"Windows XP"->"x86 Checked Build Environment"在弹出来的命令行窗口中输入"Build",让它自动生成所需要的库,等待它执行完2:打开VS2005,在菜单上选择"工具"->"选项"弹出"选项"窗口,选择"项目和解决方案"->"VC++目录","显示以下内容的目录""可执行文件"中添加"F:\WinDDK\7600.16385.0\bin\x86\x86" "F:\WinDDK\7600.16385.0\bin\x86" "F:\WinDDK\7600.16385.0\tools\pfd\bin\bin\x86""包含文件"中添加"F:\WinDDK\7600.16385.0\inc\api" "F:\WinDDK\7600.16385.0\inc\crt" "F:\WinDDK\7600.16385.0\inc\ddk""引用文件"中添加"F:\WinDDK\7600.16385.0\lib\wxp\i386""库文件"中添加"F:\WinDDK\7600.16385.0\lib" "F:\WinDDK\7600.16385.0\lib\wxp\i386""源文件"中添加"F:\WinDDK\7600.16385.0\src"以上添加完毕直接按"确定"关闭"选项"对话框如果编译出现C2144错误的时候,请把以上添加的文件向前移动(就是点击"选项"对话框中的向上的箭头按钮)3:新建工程后配置管理器:新建:Checked4:工程属性:c++:预处理器:_X86_调用约定:__stdcallLINK:输出文件:后缀为sys $(OutDir)\$(ProjectName)。
基于WDM的驱动程序开发研究实现
基于WDM的驱动程序开发研究实现【摘要】:文章首先分析了WDM的工作原理和机制,并结合实例着重探讨了基于WDM的设备驱动程序的设计和实现方法。
【关键词】:WDM; 分层结构; 驱动程序一、引言WDM(Windows Driver Model,Windows驱动程序模式)是Microsoft最新推出的一种驱动程序模型,旨在实现在对新硬件支持的基础上,进一步降低所需驱动程序的数量和复杂性,起到简化驱动程序的开发过程的目的。
WDM属于操作系统的内核模式,其驱动程序由运行于内核模式的系统代码组成。
它采用灵活的分层驱动方法,即在用户应用程序和物理设备之间存在着几个不同的驱动程序层次,且各层上的WDM驱动程序具有不同的优先级。
这种分层机制使得WDM 能够定义更加广泛更加通用的驱动程序,其可包括各种文件系统、网络组件和专用设备等。
二、WDM(一)WDM的分层结构如图1所示,WDM体系结构实行分层处理,即设备驱动被分为:高层驱动程序、中间层驱动程序、底层驱动程序。
每层驱动再把I/O请求划分成更简单的请求,以传给更下层的驱动执行。
最底层的驱动程序在收到I/O请求后,通过硬件抽象层,与硬件发生作用,从而完成I/O请求工作。
在这样的架构下,当外设发生改变时,只要改变程序栈中的一个或几个驱动程序即可,而处于最上层的用户应用程序可完全不变。
对于硬件设备的开发者而言,只需要开发设备驱动程序就可以了,因为底层的驱动程序都由主板厂商和微软提供。
WDM引入设备对象的概念来描述一个设备,主要包含物理设备对象(Physical Device Object,PDO)、功能设备对象(Functional Device Object,FDO)和过滤设备对象(Filter Device Object,Filter DO)。
其中,PDO对应实际的物理设备,FDO和Filter DO是相应驱动程序的处理对象。
一个物理设备有且只有一个PDO和一个FDO,但却可以拥有多个Filter DO。
WDM驱动程序开发文档
WDM驱动程序开发文档WDM(Windows Driver Mode)是MS提供的98和NT 5.0下的通用的驱动程序模型。
相比起以前的KDM和VXD来说,它的性能更高、系统之间移植更加方便。
所以,随着系统的升级(指MS的操作系统),WDM已经逐步取代KDM和VXD,成为MS系统下驱动程序开发的主流。
(关于Windows下的驱动程序编写,查看参考文献1)第一部分从操作系统看驱动程序Windows NT的系统结构决定了NT下访问设备的特殊性。
NT是建立在Mach和Vax思想上的一种客户/服务器模型操作系统,由一个特权执行体以及一系列被称为保护子系统的非特权服务器组成。
整个操作系统被分为用户态模式和核心态模式。
所谓特权,是指处理器的操作方式,大多数的处理器都有一种甚至若干种特权方式。
在特权方式方式下,所有机器指令都可执行并且系统内存可存取。
在非特权方式方式下,某些机器指令不能执行并且系统内存不可存取。
在Windows NT下,核心态就是指处于特权处理器方式下,而用户态总处于非特权处理器方式。
核心态模式又被称为NT执行体,包括了系统服务和硬件描述层(HAL),它们运行于CPU 的特权层Ring0(在驱动程序内部,在不同部分还分为不同权限层)。
系统服务包含了一个操作系统的所有应有服务,文件系统,进程控制,内存管理,设备管理等等。
NT中除了微内核外,另外还包含了一些独特的部分,如对象管理器,配置管理器,执行体支持,本地过程调用,安全监视器,所有这些都建立在HAL之上。
IO管理器实现对设备的管理,包含了文件系统,中间介质和设备驱动。
通过HAL,NT可以防止内核和NT执行体的其它部分受硬件平台不同的影响。
另外NT还将网络管理器加入了核心态模式。
用户态模式包括了一些保护子系统,如OS/2子系统,POSIX子系统,安全子系统,当然还有最常用的Win32子系统,NT都称之为服务器。
它们运行于CPU的用户层Ring3,建立在服务器上的各类应用程序被称为客户。
WDM驱动程序设计
现在Windows98和Windows2000已经成了主流操作系统的主流,原先用来实现驱动程序的VxD技术随着Win95的淡出也慢慢地将退出历史舞台,在Windows98和Windows2000中设备驱动程序将根据Windows驱动程序模型(WDM)来设计。
WDM通过提供一种灵活的方式来简化驱动程序的开发,在实现对新硬件支持的基础上减少并降低所必须开发的驱动程序的数量和复杂性。
WDM驱动程序设计一.WDM简介微软不断推出新的操作系统,现在Windows98和Windows2000已经成了主流,原先用来实现驱动程序的VxD技术随着Win95的淡出也慢慢地将退出历史舞台,在Windows98和Windows2000中设备驱动程序将根据Windows驱动程序模型(WDM)来设计。
WDM通过提供一种灵活的方式来简化驱动程序的开发,在实现对新硬件支持的基础上减少并降低所必须开发的驱动程序的数量和复杂性。
Windows驱动程序模型分两个方面,除了核心模型描述设备驱动程序的标准结构外,WDM还为常见类型的设备实现了一个模块化的、分层次类型的总线驱动程序和类驱动程序。
总线驱动程序实现了支持通用串行总线(USB)、IEEE1394(FireWire)协议等。
类驱动程序是为实现标准Windows功能提供条件。
WDM对标准类接口的支持减少了Windows 95和Windows NT所需的设备驱动程序的数量和复杂性。
在Windows平台上,WDM将成为21世纪主流的驱动模式。
WDM支持USB、IEEE 1394、ACPI等全新的硬件标准。
而且以往在两个平台上同时运行时需要编写两个截然不同的驱动程序,现在只需要编写一个WDM驱动程序就可以了。
WDM驱动程序也是分层的,即不同层上的驱动程序有着不同的优先级,而Windows 9x下的VxD则没有此结构。
WDM还引入了功能设备对象FDO(Functional Device Object)与物理设备对象PDO(Physical Device Object)两个新类来描述硬件,一个PDO对应一个真实硬件。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
WDM驱动开发之路写在前面:在专栏的前几期中,我们一起初步学习了vxd的开发技术。
Vxd技术是很深奥的,不是一篇两篇文章能讲清楚,但你已经入了门,剩下的就要看你的修行了。
多看书,多泡论坛(当然是上咱们的驱动开发网论坛了:->),多写程序…我的手不够用了。
功到自然成嘛。
不过话又说回来,vxd只是权宜之计,WDM才符合当今的潮流(程序员都是时髦人士,君不见先是VB、VC然后是asp、JSP、PHP,数也数不过来呀),Win9x寿终正寝时也就是vxd的末日,你不想随它而去吧(开个玩笑),那就随我来。
按笔者的想法,这篇文章写成连载形式,一次讲一个主题,并且必要时带着例子,让大伙step by step地把WDM驱动弄个透底,不想让大家觉得稀里糊涂,也不想让大家觉得白买杂志了。
今天我们一起讨论第一部分,了解篇。
(一)了解篇WDM模型(Windows Driver Model)是微软公司为当前主流操作系统Windows98和Windows 2000的驱动程序设计的一种构架。
它和传统的win3.x和win95使用的vxd的驱动是完全不同的体系结构。
不过对于最终用户来说,WDM驱动程序在Windows98和Windows2000下的表现很相似。
作为驱动开发人员来说,它在两者中有很多的不同。
并且Windows98中的WDM只能算是Windowss2000中的WDM的一个了集。
在Windows98中有一些驱动程序只能使用VXD来实现,如串行通讯驱动等。
要写驱动程序,首先要了解操作系统的结构。
在WDM体系中,windows2000操作系统中是最标准的实现方式,Windows98则是部分兼容WDM结构。
照微软的说法,Windows98和Windows2000 X86(Intel 架构)版本实现二进制码兼容(参见98DDK),Windows2000 x86版本与其它CPU平台版本实现源码级兼容(因为Windows 2000是基本NT相似的结构,最底层是硬件抽象层HAL,所有我们相信它们之间能源码级兼容)。
但实际上,Windows2000的WDM实现中有很多例程在Windows98中没有实现,一旦试图加载这样的WDM驱动程序到Windows98中,则不能正常加载,当然我们也有办法实现它,那就是利用“桩”技术。
具体可参见Walter Oney写的《Programming the Microsoft Windows Driver Model》一书。
我们首先来看看Windows 2000的系统结构,然后再来看看Windows 98的。
图一是Windows 2000的系统结构图。
从图中我们可以看出:整个系统被分为两个态,用户态和核心态。
从图中可以明显看出I/O操作最后是怎样作用到硬件上的。
用户态应用程序对Windows 子系统进行win32 API调用,这个调用由系统服务接口作用到I/O管理器(严格地说,在Windows 系统中不存在I/O管理器这样的独立模块,这个只是为了方便叙述而将各种核心功能调用的集合称作I/O管理器,业界人士都这样称呼这个部分),I/O管理器进行必要的参数匹配和操作安全性检查,然后由这个请求构造出合适的IRP(IO Request Package,I/O请求包),并把此IRP传给驱动程序。
简单情况下,驱动程序直接执行这个请求包,并与硬件打交道,从而完成I/O请求工作,最后由I/O管理器将执行结果返回给用户态程序。
但在WDM体系结构中,大部分实行分层处理。
即在图中“设备驱动“这部分,分成了若干层,典型地分成高层驱动程序、中间层驱动程序、底层驱动程序。
每层驱动再把I/O请求划分成更简单的请求,以传给更下层的驱动执行。
以文件系统驱动为例,最高层驱动只知道文件如何在磁盘上表示,但不知到怎样得到数据。
最低层驱动程序只知道怎样从磁盘取出512B为单的数据块,但不知道文件怎样表示。
举个更具体的生活例子。
主人(最高层驱动)知道(并且需要)笔计本电脑,但不知道具体放在什么位置;而仆人(最底层驱动)却知道它放在具体什么地方,但图一不知道(也不需要管)怎么使用。
在WDM驱动体系中,驱动尽可能被设计成分层并且通用的。
以USB驱动为例,USB 总线驱动负责与硬件打交道,但不负责数据的逻辑表示。
其它驱动程序只是扮演客户端驱动程序的角色,把各种请求转换成对USB总线驱动程序的请求。
比如我们使用的HID驱动中的键盘驱动程序(USB接口),我们按下键时,它只是简单(当然不是想象的那么简单,只是相对于USB总线驱动而言的)地把它转化为对USB总线驱动程序的请求,然后将USB总线驱动程序得到的结果返回系统中。
还有一类驱动程序就是我们常说的过滤器驱动程序。
它不负责完成基本的驱动任务,但它位其它驱动层次之间,并添加一些功能。
在设计过程中,有一个原则就是不影响其它层次的功能。
常见的例子是防火墙,底层实现其实是一种中间层过滤器驱动程序,负责检查IP 包的进出情况,允许合法的包通过,阻止非法的包通过。
最底层的驱动程序在收到IRP后,通过硬件抽象层,然后与硬件发生作用,从而完成I/O请求工作。
在这样的架构下,Windows 2000( or NT)上面的层就不需要对应每个操作系统都要开发一遍了。
所以微软认为在Windows2000 x86平台下开发的驱动和其它CPU平台下Windows 2000源码级兼容。
(试想一下,如果大家都用c写一个“hello world!”程序,那么只要有c编译器的操作系统平台下,运行的结果都是一致的。
)WDM驱动体系相对于Windows NT的KMD驱动体系不同之处在于它支持即插即用、拥有总线驱动和类驱动等等。
WDM驱动体系重新定义驱动程序层次,以便适应即插即用系统。
在这时我们引入了”驱动程序栈“的概念。
驱动程序栈是WDM驱动体系中驱动层次的有序集合。
可以这样理解:把各层次的驱动程序按一定顺序排列起来,各负责完成一定的功能。
具体可以看以下的图示:从图中我们可以看到,处于最下层的是总线驱动程序,上面是功能驱动程序。
在总线驱动程序和功能驱动程序之间还有可能出现过滤器驱动程序(中间层驱动)。
在某些特殊情况下有可能在第一个功能驱动程序层上出现几个另外的功能驱动程序。
总线驱动程序负责列举设备,也就是说,它负责发现总线上的所有设备并检测设备何时添加到总线上或何时从总线上删除。
总线驱动程序每发现一个设备就创建一个对应的物理设备对象。
一些总线驱动程序只是简单地控制对总线的访问权。
我们知道,一旦拥有总线权时,我们就可以完成我们想做的任何工作。
当然,大部分的总线驱动程序为我们完成这类总线上的所有任务。
功能驱动程序负责完成特定的功能,知道如何控制设备工作。
它在驱动程序栈中位于总线驱动程序上面。
功能驱动程序负责创建一个功能设备对象。
在USB 总线情形中,功能驱动程序必须使用总线驱动程序来访问它自己的设备。
在驱动程序栈中,可以插入各种类型的过滤驱动程序。
对于总线上的所有设备,总线过滤驱动程序被添加在总线驱动之上;而对于一个特定类的所有功能的功能驱动程序添加类过滤驱动程序。
设备过滤驱动程序仅对特定的设备添加。
上层的过滤驱动程序添加在功能驱动程序之上,而低层的过滤驱动程序添加在功能驱动程序下面。
在WDM 驱动体系中,为了实现上面所说的分层思想,也为了简化驱动程序的编写,预先提供了几种类驱动程序和总线驱动程序。
主要包括如下几类:一、人工输入设备(HID)类驱动程序人工输入设备类驱动程序提供输入设备的一个抽象接口。
实际的输入硬件可以使用不同的方法连接。
这些方法被HID 类驱动程序隐藏。
如果是USB 总线的人工输入设备,有可能要调用USB 总线驱动程序,但HID 类驱动提供给上层的接口是相同的,不因为底层接口的改变而有所不同。
二、静态图象体系静态图象体系结构(STI)根本上不是一种驱动程序,而是使用小类驱动程序获得扫描仪和静态图象相机图形数据的一种手段。
STI 目前支持SCSI 设备、串行设备、并行设备和USB 设备。
三、流类驱动程序流类驱动程序提供访问高带宽、时间关键的视频和音频数据的基础。
流类驱动程序使用小类驱动程序接口到实际的硬件。
我们可以编写中间过滤驱动程序来转换数据格式。
四、端口驱动程序音频端口驱动程序和小端口驱动程序用于控制实际的硬件。
通常由硬件制造商编写。
五、IEEE 1394总线驱动程序IEEE1394总线驱动程序列举并控制IEEE1394高速总线,这个总线驱动程序使用端口驱动程序访问IEEE1394硬件设备的控制电路。
IEEE1394客户驱动程序发出IEEE1394请求块IRB来控制它们自己的设备(这点上和USB驱动程序很相似的)。
六、USB总线驱动程序USB总线驱动程序列举并控制低速的USB总线设备。
主机控制器驱动程序(HOST设备)作为访问主要的两类USB主机控制器的标准。
USB客户驱动程序使用各种IOCTL通过USB类驱动程序访问它们自己的设备。
最主要的还是通过URB(USB请求块)来控制它们自己的设备。
七、SCSI和CDROM/DVD驱动程序SCSI和CDROM/DVD驱动程序用于访问硬盘、软驱、CDROM和DVD设备。
和上面的相似,提供各种端口驱动程序和小端口驱动程序来访各自的硬件设备。
例如:IEEE1394总线上的CDROM的请求会发送到IEEE1394总线驱动程序。
八、ACPIACPI(高级配置和电源管理接口)总线驱动程序与PC ACPI BIOS作用,列举系统中的设备并控制它们的电源使用。
九、PCI和PnPISA总线驱动程序它们和USB总线驱动相似,列举各自总线上的设备并控制它们。
PnPISA只对符合即插即用工业标准的ISA总线设备作这些工作。
还有一点必须明白,那就是I/O管理器向设备驱动程序栈发送的IRP是从栈顶进入的,理解这点很重要。
这样,当用户向I/O管理器请求了它要访问的功能设备时,I/O管理器将保证它的全部请求都发送到设备栈的顶部,这样处在设备驱动程序栈中的任何层次的过滤器驱动程序或功能驱动程序都得到首先处理这些请求的机会。
这就是WDM驱动程序的简单介绍。
上面我们主要讲述了Windows2000中的情形。
在Windows98中很相似,但由于它继承于windows95,所有不能够所有的设备都实现WDM体系结构。
有几种设备还只能使用VXD体系。
如串口驱动和文件系统驱动等。
从上面我们已经知道wdm究竟是怎么回事,接下来让我们看看在Windows2000操作系统中有哪些驱动程序。
请见图三。
∙虚拟设备驱动程序(VDD)是一个用户模式部件,它可以使DOS应用程序访问x86平台上的硬件。
VDD通过屏蔽I/O权限掩码来捕获端口存取操作,它基本上是模拟硬件操作,这对于那些直接对裸机硬件编程的应用程序特别有用。