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例程也没有什么清除工作要做。