WDM驱动程序简介
- 格式:ppt
- 大小:84.01 KB
- 文档页数:13
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教程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,所有我们相信它们之间能源码级兼容)。
WDM内核驱动程序模型分析WDM驱动程序是Windows 2000操作系统重要的组成部分,它的正常工作需要有Windows 2000其它内核组件的支持,同时大部分的内核组件也必须同WDM驱动程序交互来完成它们的功能,为能够完整而清晰的说明WDM驱动程序的工作情况,本文首先说明Windows 2000操作系统的内核工作机理,同时将给出WDM驱动程序和内核其它组件的协同工作机制,最后分析WDM驱动程序的结构和工作流程。
1 Windows 2000内核组件工作模式1.1 Windows 2000的设计思想在现代操作系统中,应用程序和操作系统本身是分开的——操作系统代码运行在核心态并有权访问系统数据和硬件;应用程序运行在用户态,能够使用的接口和访问系统数据的权限都受到限制。
当用户程序调用系统服务时,处理器捕获该调用,然后把调用的线程切换到核心态。
当系统服务完成后,操作系统将线程描述表切换回用户态,允许调用者继续运行。
系统核心态部分的设计是丰富多样的。
较典型的有以下几种:A) 传统的单片式操作系统。
系统被设计为一个单一的、庞大的软件系统,在内部组件之间有许多关联。
这种软件系统依赖于许多系统组件。
这种相互关联意味着要扩展系统,就需要对全部代码库进行大量修改。
同时在单片式操作系统中大量的操作系统代码运行于同一内存空间,这就意味着任何操作系统组件都可能损坏正在被其它组件使用数据。
B) 分片式的操作系统。
将操作系统发分为不同层次中的模块。
每个模块提供一组功能函数其它模块调用。
在某一层次上的代码只能调用较低层次上的代码。
在一些了系统中,DEC公司的OpenVMS包括老的Multics操作系统,硬件甚至强制分层(使用多重、分级处理模式)。
分层操作系统结构的优点是,由于每层代码只能访问较低层的接口(和数据结构),因此限制了使用无限权利的代码数量,这种结构也允许在最底层开始调试操作系统,然后一层一层的往上调试,直到整个操作系统工作正常。
WDM驱动程序入门(1)-Hello WDMWDM驱动程序是一种很新的东西,相信很多人都跟我一样,对它很感兴趣,但是又找不到学习的切入点。
究其原因,还是因为WDM是一种非常“死板板”的程序,它一运行就是工作在系统的底层RING 0处,提供各种接口给应用程序调用。
也正因为如此,它不像普通的应用程序一样,可以很快地上手——更多的时候,你是在阅读它的技术资料和各种接口信息,你还要非常地熟悉系统底层的工作原理,否则一个不小心,就“蓝屏”了,呵呵——话说回来,写驱动程序的时候,死机是家常便饭。
因此很多人都对WDM望而生畏了。
回想一下,我刚开始学WDM的情形还历历在目——看书看了整整3天,但是看完之后好像跟没看也差不了多少,还是不知道怎么入门,甚至连怎么写一个“Hello World”都不知道——后来才知道其实WDM是没有所谓的“Hello World”程序的,唉,真是痛苦啊,这主要还是因为网络上的WDM资料太少造成的。
为了不让大家重蹈我的覆辙并对WDM有个感性的认识,在此我给出一个最简单的完整的WDM框架,并附有注释,姑且可以算是一个入门的“Hello World”吧。
废话少说,让我们马上开始研究,要求读者已安装DDK 2000。
(在Win98中我还没有测试过,不清楚是否能正常运行)/***************************************************************程序名称:Hello World for WDM文件名称:HelloWDM.cpp作者:罗聪日期:2002-8-16***************************************************************///一定要的头文件,声明了函数模块和变量:#include "HelloWDM.h"/***************************************************************函数名称:DriverEntry()功能描述:WDM程序入口***************************************************************///extern "C"是必须的,表示“用C链接”。
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. DriverEntry ()DDK中定义的函数原型如下:NTSTATUS DriverEntry (IN PDRIVER_OBJECT DriverObject,IN PUNICODE_STRING RegistryPath);DriverEntry的第一个参数是一个指针,指向一个刚被初始化的驱动程序对象,该对象就代表你的驱动程序。
DriverEntry的第二个参数是设备服务键的键名。
如果该例程执行成功,则返回STATUS_SUCCESS,如果失败,则依据失败状态返回定义在ntstatus.h中的错误值。
这是驱动程序的入口函数,相当于用户态程序的main()函数,它在驱动程序被加载进内存的时候调用。
主要工作是把各种函数指针填入驱动程序对象。
这些指针为操作系统指明了驱动程序容器中各种子例程的位置,这样,该驱动程序对象关联的设备对象在接收到上层的IRP的时候,就会通过驱动程序对象中设置的函数指针,找到相应的派遣函数来做处理。
Eg.一个简单的DriverEntry()代码片断:DriverObject->DriverUnload =DriverUnload; <--1DriverObject->DriverExtension->AddDevice = AddDevice;DriverObject->DriverStartIo = StartIo;DriverObject->MajorFunction [IRP_MJ_CREATE] = DriverDispatchCreate; <--2DriverObject->MajorFunction [IRP_MJ_CLOSE] = DriverDispatchClose;DriverUnload指向驱动程序的清除例程。
I/O管理器会在卸载驱动程序前调用该例程。
通常,WDM驱动程序的DriverEntry例程一般不分配任何资源,所以DriverUnload例程也没有什么清除工作要做。
PCI传输卡的WDM驱动程序设计2008-01-20摘要:介绍了在Windows2000操作系统下,使用DriverStudio软件编写符合WDM模式的PCI数据传输卡驱动程序,并详细分析了一个应用实例。
关键词:PCI总线设备驱动程序 WDM模式 DriverStudioPCI总线规范是为提高微机总线的数据传输速度而制定的一种局部总线标准。
在设计自行开发的基于PCI总线的数据传输设备时,需要开发相应的`设备驱动程序。
通常开发PCI设备驱动程序有多种模式,在Windows2000环境下,主要采用WDM模式。
本文针对自行开发的基于PCI总线的CCD视频信号传输控制卡,编写了符合WDM模式的驱动程序。
1WDM模式驱动程序1.1WDM模式(WindowsDriverModel)Windows2000对驱动程序的编写不再基于以往的Win3.x和Win9x下的VxD(虚拟设备驱动程序)结构,而是基于一种新的驱动模型――WDM(WindowsDriverModel)。
WDM为Windows98/2000/XP操作系统的设备驱动程序的设计提供了统一的框架。
WDM来源于WindowsNT的分层32位设备驱动程序模型(layered32-bitdevicedrivermodel)。
它支持更多的特性,如即插即用(PnP)、电源管理、WMI和NT事件。
1.2设备驱动程序设备驱动程序是操作系统的一个组成部分,它由I/O管理器(I/OManager)管理和调动。
Windows2000操作系统下的I/O管理器功能描述如图1所示。
I/O管理器每收到一个来自用户应用程序的请求就创建一个I/O请求包(IRP)的数据结构,并将其作为参数传递给驱动程序。
驱动程序通过识别IRP中的物理设备对象(PDO)来区别是发送给哪一个设备。
IRP结构中存放请求的类型、用户缓冲区的首地址、用户请求数据的长度等信息。
驱动程序处理完这个请求后,在该结构中填入处理结果的有关信息,调用IoCompleteRequest将其返回给I/O管理器,用户应用程序的请求随即返回。
wdmWDMDWDM是Dense Wavelength Division Multiplexing(密集波分复用)的缩写,这是一项用来在现有的光纤骨干网上提高带宽的激光技术。
更确切地说,该技术是在一根指定的光纤中,多路复用单个光纤载波的紧密光谱间距,以便利用可以达到的传输性能(例如,达到最小程度的色散或者衰减),这样,在给定的信息传输容量下,就可以减少所需要的光纤的总数量。
用途DWDM能够在同一根光纤中,把不同的波长同时进行组合和传输。
为了保证有效,一根光纤转换为多个虚拟光纤。
所以,如果你打算复用8个光纤载波(OC),即一根光纤中传输8路信号,这样传输容量就将从2.5 Gb/s提高到20 Gb/s。
目前,由于采用了DWDM技术,单根光纤可以传输的数据流量最大达到400Gb/s。
随着厂商在每根光纤中加入更多信道,每秒兆兆位的传输速度指日可待。
技术波分复用(WDM)是将两种或多种不同波长的光载波信号(携带各种信息)在发送端经复用器(亦称合波器,Multiplexer)汇合在一起,并耦合到光线路的同一根光纤中进行传输的技术;在接收端,经解复用器(亦称分波器或称去复用器,Demultiplexer)将各种波长的光载波分离,然后由光接收机作进一步处理以恢复原信号。
这种在同一根光纤中同时传输两个或众多不同波长光信号的技术,称为波分复用。
WDM本质上是光域上的频分复用FDM技术。
每个波长通路通过频域的分割实现,每个波长通路占用一段光纤的带宽。
WDM系统采用的波长都是不同的,也就是特定标准波长,为了区别于SDH系统普通波长,有时又称为彩色光接口,而称普通光系统的光接口为"白色光口"或"白光口"。
通信系统的设计不同,每个波长之间的间隔宽度也有不同。
按照通道间隔的不同,WDM可以细分为CWDM(稀疏波分复用)和DWDM(密集波分复用)。
CWDM的信道间隔为20nm,而DWDM的信道间隔从0.2nm 到1.2nm,所以相对于DWDM,CWDM称为稀疏波分复用技术。
WDM驱动程序入门(2)——驱动程序的小秘密好啦,辛辛苦苦终于写完了程序,让我们编译运行吧!按下Ctrl+F5(嘿嘿,让我们先假设你习惯用VC来写程序),我等啊等……疑?怎么毫无动静的?再看看Output窗口,哇!有几百个错误啊!!不禁头大——这是怎么回事呢?原来,WDM程序编译出来的并不是我们常见的.exe,而是.sys文件,在未经设置编译环境之前,是不能直接用VC来编译的(这就是为什么会有几百个错误了)。
这种类型的文件你可以在WINNT/System32/Drivers里面找到很多。
其实驱动程序也是一种PE 文件,它同样由DOS MZ header开头,也有完整的DOS stub和PE header,同样拥有Import table和Export table——hoho……那跟普通的PE文件有什么不一样呢?伟大的领袖毛主席教育我们,实践是检验真理的唯一标准。
那么就让我们先来做个小剖析,加深对.sys文件的认识吧!(如果你对.sys的内部细节没有兴趣的话,可以略过不看。
^_^)首先祭出Delphi里附带的tdump.exe程序(别问我为什么用这个,这只是纯粹的习惯问题)。
让我们键入:C:/WINNT/System32/Drivers>tdump ccport.sys -em -ee参数-em是列出Import table,-ee是列出Export table。
回车之后,屏幕列出一大堆东西:C:/WINNT/SYSTEM32/DRIVERS>tdump ccport.sys -em -ee Turbo Dump Version 5.0.16.12 Copyright ? 1988, 2000 Inprise CorporationDisplay of File CCPORT.SYSIMPORT: NTOSKRNL.EXE={hint:011Fh}.’memcpy’IMPORT: NTOSKRNL.EXE={hint:003Dh}.’IoDeleteDevice’IMPORT: NTOSKRNL.EXE={hint:0030h}.’IoAttachDeviceT oDeviceStack’IMPORT: NTOSKRNL.EXE={hint:008Eh}.’KeSetEvent’IMPORT: NTOSKRNL.EXE={hint:0068h}.’IofCallDriver’IMPORT: NTOSKRNL.EXE={hint:0095h}.’KeWaitForSingle Object’IMPORT: NTOSKRNL.EXE={hint:0074h}.’KeInitializeEvent’IMPORT: NTOSKRNL.EXE={hint:003Fh}.’IoDetachDevice’IMPORT: NTOSKRNL.EXE={hint:00D3h}.’RtlFreeUnicodeS tring’IMPORT: NTOSKRNL.EXE={hint:0077h}.’KeInitializeSpinL ock’IMPORT: NTOSKRNL.EXE={hint:0129h}.’strcpy’IMPORT: NTOSKRNL.EXE={hint:0121h}.’memset’IMPORT: NTOSKRNL.EXE={hint:003Ch}.’IoCreateUnprote ctedSymbolicLink’IMPORT: NTOSKRNL.EXE={hint:0038h}.’IoCreateDevice’IMPORT: NTOSKRNL.EXE={hint:00C2h}.’RtlAnsiStringToU nicodeString’IMPORT: NTOSKRNL.EXE={hint:0069h}.’IofCompleteReq uest’IMPORT: NTOSKRNL.EXE={hint:0124h}.’sprintf’IMPORT: NTOSKRNL.EXE={hint:003Eh}.’IoDeleteSymboli cLink’IMPORT: NTOSKRNL.EXE={hint:0042h}.’IoFreeIrp’IMPORT: NTOSKRNL.EXE={hint:004Dh}.’IoInitializeIrp’IMPORT: NTOSKRNL.EXE={hint:002Dh}.’IoAllocateIrp’IMPORT: NTOSKRNL.EXE={hint:0027h}.’InterlockedExcha nge’IMPORT: NTOSKRNL.EXE={hint:0025h}.’InterlockedCom pareExchange’IMPORT: NTOSKRNL.EXE={hint:0035h}.’IoCancelIrp’IMPORT: NTOSKRNL.EXE={hint:012Ah}.’strlen’IMPORT: NTOSKRNL.EXE={hint:0126h}.’strcat’IMPORT: NTOSKRNL.EXE={hint:0114h}.’atoi’IMPORT: NTOSKRNL.EXE={hint:0128h}.’strcmp’IMPORT: NTOSKRNL.EXE={hint:0034h}.’IoBuildSynchron ousFsdRequest’IMPORT: NTOSKRNL.EXE={hint:00D5h}.’RtlInitAnsiString’IMPORT: HAL.DLL={hint:0006h}.’KfAcquireSpinLock’IMPORT: HAL.DLL={hint:0009h}.’KfReleaseSpinLock’EXPORT ord:0001=’Vcomm_DriverControl’我们可以很清楚地看到,它主要调用了NTOSKRNL.EXE和HAL.DLL文件(实际上你会发现,几乎所有的WDM驱动程序都会调用NTOSKRNL.EXE文件,从它的名字你可以看出为什么了吧?),并且输出了一个函数“Vcomm_DriverControl”。
wdm驱动
WDM驱动是指Windows Driver Model(Windows驱动模型)驱动,它是一种用于开发Windows操作系统设备驱动程序的软件框架。
WDM驱动是为Windows 98、Windows Me和Windows 2000引入的,它提供了一种标准化的方式来编写设备驱动程序。
相比于传统的驱动开发方式,WDM驱动具有更丰富的功能和更高的灵活性。
WDM驱动在设备驱动程序的开发中提供了许多优点,包括:
1. 简化了驱动程序的开发:WDM驱动使用一套统一的API,使得驱动程序的开发更加简单和一致。
2. 可移植性:WDM驱动可以在不同的Windows操作系统版本上运行,而无需进行大量的修改。
3. 兼容性:WDM驱动允许旧的驱动程序与新的设备完全兼容,而无需进行修改。
4. 性能:WDM驱动通过使用更高级的设备驱动模型和硬件访问机制,提高了设备驱动程序的性能。
总之,WDM驱动是一种用于开发Windows设备驱动程序的软件框架,它提供了许多优势和便利,使开发者能够更轻松地开发高性能和兼容性强的驱动程序。
USB驱动程序的编写采用WDM 驱动程序。
WDM 驱动程序是一些例程的集合,它们被动地存在,等待主机系统软件(PnP 管理器、I/O 管理器、电源管理器等)来调用或激活它们。
具体驱动程序不同,其所包含的例程也不同。
一个WDM 驱动程序的基本组成包括以下5个例程:(1)驱动程序入口例程:处理驱动程序的初始化。
(2)即插即用例程:处理PnP 设备的添加、删除和停止。
(3)分发例程:处理用户应用程序发出的各种 I/O 请求。
(4)电源管理例程:处理电源管理请求。
(5)卸载例程:处理驱动程序的卸载。
包含文件:ezusbsys.c, ezusbsys.h,ezusbsys.rc, resource.h, version.h, makefile,sources)在ezusbsys.c文件中,包含了上述五个例程:ezusbsys.h中定义了各种数据结构还有各种IOCTL控制码,用于不同数据的读写。
Ezusbsys.c 中实现了各种驱动例程。
包含了上述五个所说例程外还包含了其他例程,课程从下面的驱动程序入口例程得出一些信息。
驱动程序入口例程: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;//分发例程DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = Ezusb_ProcessIOCTL;//即插即用例程DriverObject->MajorFunction[IRP_MJ_PNP] = Ezusb_DispatchPnp;//电源管理例程DriverObject->MajorFunction[IRP_MJ_POWER] = Ezusb_DispatchPower;//设备添加例程DriverObject->DriverExtension->AddDevice = Ezusb_PnPAddDevice;//卸载例程DriverObject->DriverUnload = Ezusb_Unload;return ntStatus;}在原有框架下,主要实现了的代码段在于ezusbsys.c文件中的如下例程:NTSTATUSEzusb_Read_Write( IN PDEVICE_OBJECT fdo, IN PIRP Irp )在该例程中实现对大数据块的读写控制和实现。