wdm设备驱动程序入门

合集下载

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开发之路(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,所有我们相信它们之间能源码级兼容)。

关于Windows WDM设备驱动程序

关于Windows WDM设备驱动程序
2.Operate the hardware using WDM in kernel mode.As we know, we have no privilege to operate the hardware resource (i.e. physical memory, disk, port(s))directly in user mode.
关于Windows WDM设备驱动程序
描述:
1 WDM支持哪些操作系统(起码要求说明是否支持WIN XP系列
2 WDM可以实现哪些方面的功能
3 使用WDM是否可以实现全局控制WINDOWS
4 WDM和VXD的区别
5 WDM程序的载体的存在方式(即DLL、EXE、DRV、VXD等)
6 WDM程序的开发工具(如用VC++应创建哪类工程)
3.Oh, you mistake the architecture of the WDM in OS.Your driver in WDM mode is only ONE part in the large operation system.You could say "affect" not "control" system kernel, because it has ring0 privilege.
"NT System Drivers" are used by Windows NT, Windows 2000 and to a degree by Windows 98 (in a slightly newer form known as "Windows Driver Model"drivers). They execute at kernel mode and, like VxDs, use an entirely different API that user mode application code. They consist entirely of 32-bit code. The documentation included with the Windows NT, 2000 and 98 DDKs describes the API calls used by NT system and WDM drivers. "Dynamic Link Libraries", or DLLs, are basically normal application code packaged into a dynamically-loadable module. They execute at user mode and consist entirely either of 16- or 32-bit code and use the normal Windows API (they *can* call CreateWindow(), etc.). They are loaded by applications or other DLLs and export functions (usually by name) that can be called directly.

WDM入门

WDM入门

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链接”。

Windows下设备驱动程序的开发方法

Windows下设备驱动程序的开发方法

目录一、驱动开发环境的搭建 (1)1.1 关于DDK (1)1.2 关于驱动程序的编译 (1)1.3关于驱动程序的运行 (2)二、驱动程序的结构 (3)2.1 驱动程序的头文件 (3)2.2 驱动程序的入口点 (3)2.3 创建设备例程 (4)2.4 卸载驱动例程 (5)2.5 派遣例程 (6)三、编写驱动程序的基础知识 (6)3.1 内核模式下的字符串操作 (6)3.2 内核模式下各种开头函数的区别 (8)3.3 一个示例程序 (10)3.4 补充说明 (10)四、在驱动中使用链表 (10)4.1 内存的分配与释放 (10)4.2 使用LIST_ENTRY (12)4.3 使用自旋锁 (12)五、在驱动中读写文件 (15)5.1 使用OBJECT_ATTRIBUTES (15)5.2 创建、打开文件 (16)5.3 读写文件操作 (16)5.4 文件的其它相关操作 (18)六、在驱动中操作注册表 (18)6.1 创建、打开注册表 (19)6.2 读写注册表 (20)6.3 枚举注册表 (21)七、在驱动中获取系统时间 (21)7.1 获取启动毫秒数 (21)7.2 获取系统时间 (22)八、在驱动中创建内核线程 (23)8.1 创建内核线程 (23)8.2 关于线程同步 (24)九、初探IRP (25)9.1 IRP的概念 (25)9.2 IRP的处理 (26)9.3 IRP派遣例程示例 (27)十、驱动程序与应用层的通信 (29)10.1 使用WriteFile通信 (29)10.2 使用DeviceIoControl进行通信 (32)十二、驱动程序开发实例 (33)12.1 NT驱动程序 (33)12.2 WDM驱动程序 (35)十三、参考资料 (41)一、驱动开发环境的搭建1.1 关于DDK开发驱动程序必备的一个东西就是DDK(Device Development Kit,设备驱动开发包),它跟我们在ring3常听到的SDK差不多,只不过它们分别支持开发不同的程序而已。

WDM驱动程序设计

WDM驱动程序设计

用Setup程序安装DDK,步骤为:
(1)运行Windows 98 DDK中的SETUP.EXE文件,安装Windows 98 DDK到C:\98DDK。
(2)安装VC++ 5.0到C:\VCPPDEV。
(3)修改CONFIG.SYS增大环境变量空间。在CONFIG.SYS文件最后加入一行:
(4)安装VC++ 5.0到C:\Program Files\DevStudio\VC。
(5)建立C:\MSTOOLS\BINW16目录,拷贝资源编译器。
Windows 95 DDK需要一个能将Win32资源的源文件编译成16位资源的资源编译器。如果有Win32 SDK,可以将BINW16目录下的文件直接拷贝到C:\MSTOOLS\BINW16;如果没有Win32 SDK,则可以使用第三方的资源编译器,这里以使用Borland的资源编译器为例:
另外值得注意的是,一个硬件只允许有一个PDO,却可以拥有多个FDO,在驱动程序中直接操作的不是硬件而是相应的PDO与FDO。在Ring-3与Ring-0通讯方面,系统为每一个用户请求打包形成一个IRP结构,将其发送至驱动程序,并通过识别IRP中的PDO来区别是发送给哪一个设备的。另外,在驱动程序的加载方面,WDM不通过驱动程序名称识别,而是通过一个128位的GUID来实现驱动程序的识别。
call ddkenv.bat (DDK的环境)
call vcvars32.bat (VC++的环境)
C:\MASM611\BINR\NEW-VARS.BAT
C:\DDK\DDKINIT.BAT 32 BASE
C:\Program Files\DevStudio\VC\bin\

基于Windows开发WDM设备驱动程序的方法

基于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设备驱动程序

开发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。

WDM驱动程序设计之编译安装篇

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驱动程序入门(2)——驱动程序的小秘密

WDM驱动程序入门(2)——驱动程序的小秘密

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驱动程序简介》PPT课件

《WDM驱动程序简介》PPT课件
✓ 需要排队请求的驱动程序可能还有一个StartIo例程. 而执行直接存储器存取〔DMA〕操作的驱动程序 会有一个AdapterControl例程.产生硬件中断的驱动 程序也会有一个中断服务例程〔ISR〕和一个延迟 过程调用〔DPC〕例程
sys和exe
✓ 像EXE程序一样,驱动程序也是可执行文件.其扩展 名为.SYS
✓ 最后应用程序关闭设备,具体操作就像关闭一 个文件一样 .
WDM驱动程序模型
WDM模型主要包含以下内容: 1、描述了设备驱动程序的标准结构和应该完成
的主要功能. 2、描述了操作系统为设备驱动提供的各种服务,
以及操作系统与设备驱动程序之间详细的交 互过程 3、为常见类型的设备提供一系列的总线驱动程 序和类驱动程序.
WDM驱动程序的分类
功能驱动:每个WDM驱动都包含功能驱动;它了解 使硬件工作的所有细节,负责具体I/O过程,负责处 理中断事件,为用户提供一种设备适合的控制方式.
✓ 即插即用管理器发送给驱动程序一些IRP,相应的 IRP处理函数处理完该IRP之后返回.
✓ 一个应用程序打开了设备,因此系统发送给驱动另 一个IRP,处理函数进行了少量的操作之后返回
操作系统与驱动的交互过程
✓ 应用程序尝试读取或者写入一些数据,因此系统发 送一个IRP,处理例程将IRP放入一个队列之后返回.
迷你驱动:包含在类驱动中,用于管理 Nhomakorabea备实例的厂商
IRP包
WDM驱动的层次结构
上层过滤器驱动程序 功能驱动程序
下层过滤器驱动程序 总线驱动程序
驱动程序如何工作
✓ 驱动程序是一个收集让操作系统调用的用来执行各 种涉及到硬件操作的子程序的容器.
✓ 一些例程,如DriverEntry和AddDevice例程和一些特 定的I/O 请求包〔IRP〕的处理函数会出现在每个这 样的容器中 .

WDM驱动程序设计

WDM驱动程序设计
✓ 从这两个字段中提取CM_PARTIAL_RESOURCE_LIST类型 子结构。它描述了设备被赋予的所有I/O资源。
IRP_MN_START_DEVICE 处理函数
NTSTATUS HandleStartDevice(PDEVICE_OBJECT fdo, PIRP Irp) { NTSTATUS status = ForwardAndWait(fdo, Irp); ……… PIO_STACK_LOCATION stack = IoGetCurrentIrpStackLocation(Irp); PCM_PARTIAL_RESOURCE_LIST raw, translated;
translated->PartialDescriptors; ULONG nres = translated->Count; for (ULONG i = 0; i < nres; ++i, ++resource) {
switch (resource->Type) { case CmResourceTypePort: // 配置硬件,用局部变量记录资源分配结果 case CmResourceTypeInterrupt: case CmResourceTypeMemory: case CmResourceTypeDma:
✓ 开发人员不用关心这些细节,只须用READ_PORT_XXX函数 或WRITE_PORT_XXX访问该寄存器就可以了。
UCHAR READ_PORT_UCHAR(IN PUCHAR Port); ULONG READ_PORT_ULONG(IN PULONG Port); USHORT READ_PORT_USHORT(IN PUSHORT Port); VOID WRITE_PORT_UCHAR( IN PUCHAR Port,

WDM入门教程

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(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,建立在服务器上的各类应用程序被称为客户。

USB驱动程序的编写采用WDM 驱动程序(计算机类)

USB驱动程序的编写采用WDM 驱动程序(计算机类)

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 )在该例程中实现对大数据块的读写控制和实现。

USB.设备的WDM.驱动程序设计

USB.设备的WDM.驱动程序设计

USB设备的WDM驱动程序设计卡拉河海大学计算机及信息工程学院niekele2010@yahoo.fr摘要:本文介绍了WDM驱动模型,并且针对USB总线给出了USB设备的WDM驱动程序的设计方法。

关键词: WDM、USB总线、驱动程序一, W DM驱动模型介绍为了方便用户进行WINDOWS平台的驱动程序开发,Microsoft于1996年宣布了一种适用于当前广泛使用的WIN2000及WINDOWS XP操作系统的Win32驱动程序模型。

这个驱动模型就是WDM(Windows Driver Model)——WINDOWS驱动模型。

WDM驱动具有以下几个特点。

详见参考文献[1]第一章。

1)可移植性好,采用WDM模型的设备驱动程序在不同的Windows操作系统上基本上是二进制兼容的,而在不同的CPU平台Windows操作系统上是源代码兼容的。

2)分层结构。

WDM模型使用了如图1的层次结构。

图中左边是一个设备对象堆栈。

设备对象是系统为帮助软件管理硬件而创建的数据结构。

一个物理硬件可以有多个这样的数据结构。

处于堆栈最底层的设备对象称为物理设备对象(physical device object),或简称为PDO。

在设备对象堆栈的中间某处有一个对象称为功能设备对象(functional device object),或简称FDO。

在FDO的上面和下面还会有一些过滤器设备对象(filter device object)。

位于FDO上面的过滤器设备对象称为上层过滤器,位于FDO下面(但仍在PDO 之上)的过滤器设备对象称为下层过滤器。

3)可配置性好。

WDM驱动程序通过其底层的类(总线)驱动程序枚举和访问硬件资源,使得设备的配置变得相对简单和容易。

而且WDM驱动程序还可以支持WMI(Windows Management Instrumentation),通过WMI,用户可以控制驱动程序的某些行为和属性。

4)支持即插即用和电源管理。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

设备对象与设备驱动程序关系
每个功能设备对应一个设备对象(设备对象栈为设备对象内部属性), 相同型号的多个功能设备对应多个设备对象。每个设备对象具有不同的私 有属性值(如设备ID)。
相同型号的多个功能设备共用一个过滤驱动程序和功能驱动程序,
即只有一个驱动程序对象。
设备驱动程序与设备关系:
同类中成员函数与类实例关系。
显示驱动程序是用于显示和打印设备的内核模式驱动程 序。 文件系统驱动程序在本地磁盘或网络上实现标准PC文件 系统模型(含多层次目录结构和命名文件概念)。 保留设备驱动程序主要包括Windows NT早期版本的驱动 程序,它直接控制一个硬设备而不用其他驱动程序帮助 ,可以不做修改地在Windows 2000中运行。
驱动程序的AddDevice函数示例:
NTSTATUS AddDevice(PDRIVER_OBJECT DriverObject, PDEVICE_OBJECT pdo) { NTSTATUS status; PDEVICE_OBJECT fdo; status=IoCreateDevice(DriveObject, sizeof(WDM_DEVICE_EXTENSION), NULL, FILE_DEVICE_UNKNOWN, 0, FALSE, &fdo); //在fdo中产生我们的功能设备对象 if (NT_ERROR(status)) return status; ……}
PnP管理器根据需要给设备发送各种PnP IRP
PnP管理器给设备发送“启动设备”PnP IRP,驱动程序将分 配的资源信息向下传送到设备配置头区域中,并启动设备
驱动程序处于等待状态,等待IRP的到来
WDM驱动程序的结构
WDM驱动程序包含许多例程,操作系统调用这些例程来执
行对IRP的各种操作。
基本驱动程序例程 I/O控制例程 StartIO AdapterControl OnInterrupt DpcForIsr StartIO处理请求队列、 AdapterControl处理DMA 操作、OnInterrupt处理中断。 分发例程
已装 入?
执行DriverEntry(),设置各例程 入口地址,将对象指针装入I/O 管理器中
PnP管理器装入最底层过滤驱动程序,调用其 AddDevice函数,该函数创建一个FiDO,实现FiDO与 同级驱动程序的连接
AddDevice函数把PDO连接到FiDO上
PnP管理器依次装入各级驱动程序,完成整个设备对象栈
IRP的设置与派遣:
I/O管理器在创建完IRP后,将I/O请求信息设置到IRP中, 并将IRP发送到设备驱动程序中。 已知参数信息: PDEVICE_OBJECT DeviceObject; //设备对象结构 IRP_MJ_Xxx; //I/O请求对应的功能码 I/O管理器的处理流程: PIO_STACK_LOCATION stack = IoGetNextIrpStackLocation(Irp); //获得该IRP第一个堆栈单元的指针(堆栈初始为空) stack->MajorFunction = IRP_MJ_Xxx; //填充MajorFunction代码 …… //对栈做其他初始化的工作 //如StartIo() NTSTATUS status = IoCallDriver(DeviceObject,Irp); //把IRP发送到设备驱动程序
驱动程序处理:每层驱动程序都可决定如何处理IRP,既可直接处理 完该IRP就不再向下传,也可处理完后继续向下传递,还可只做向下 传递工作。下层处理完的返回信息又通过该包的结构逐层向上传递。
系统重启
硬件接入
添加新设备 指定 检测 安装向导指定新的硬件类 型
总线驱动程序检测到新的 硬件
取配置头区域信息 由指定得到信息 取得厂商、设备类型、版本、资源需求等信息
文件系统 驱动程序
保留设备 驱动程序
PnP 驱动程序 WDM驱动程序
显示 驱动程序
类驱动程序
小驱动程序
Windows2000/XP设备驱动程序的种类
虚拟设备驱动程序(Virtual Device Driver,VDD)可 使DOS应用程序访问x86平台上的硬件,也可支持 Windows 9x下的对端口访问。 WDM驱动程序 是一种遵循电源管理协议并能在Win98 和Win2000上实现源代码级兼容的PnP驱动程序。WDM 驱动程序又可分为类驱动程序(管理已定义类的设备) 和小驱动程序(提供厂商专有的支持)。
Windows2000/XP设备驱动程序设计
Windows 2000/XP的设备驱动程序


什么是驱动程序 OS patch 学习Windows驱动程序的难点 技术壁垒,资料少 内核编程 user-api-内核
Windows 2000/XP的设备驱动程序
虚拟设备 驱动程序(VDD) 内核模式 驱动程序

I/O请求包(IRP)
定义:I/O请求包(IRP)是驱动程序操作的中心,它是一个内核“对象”, 是预先定义的数据结构。 应用:I/O管理器通过IRP对设备对象进行操作。 I/O管理器接收到一个I/O请求后,分配并初始化一个IRP,再把它传递 到合适的设备驱动程序中的最高驱动程序中。 设备对象属性为设备驱动程序处理的数据。
Parameters成员的几个常见的类型:
IRP_MJ_CREATE请求,创建设备映射; IRP_MJ_CLOSE请求,关闭设备映射; IRP_MJ_READ请求,读取设备对象的信息; IRP_MJ_WRITE请求,对设备对象写信息; IRP_MJ_PNP请求,实现PnP管理,如 IRP_MN_START_DEVICE请求,启动设备; IRP_MJ_IOCTL请求,I/O控制。
2、IRP创建与处理
创建者:I/O管理器,或其他的驱动程序。
创建IRP的函数: IoBuildAsynchronousFsdRequest();//创建异步IRP IoBuildSynchronousFsdRequest();//创建同步IRP IoBuildDeviceIoControlRequest(); //创建同步IRP_MJ_DEVICE_CONTROL或 // IRP_MJ_INTERNAL_DEVICE_CONTROL 请求 IoAllocateIrp();//创建其他种类IRP IoMakeAssociatedIrp();//创建某些IRP的子IRP
1.IRP组成
由一个固定的首部和一个可变数目的I/O栈组成。
IRP首部组成
IRP中的I/O栈组成
I/O栈:通过IO_STACK_LOCATION结构数组实现。 一次I/O请求可能对应多个I/O操作 实现方法: 较多个IRP实现; 一个IRP实现+I/O栈实现。(较优)

IO_STACK_LOCATION结构成员: MajorFunction(该IRP的主功能码) MinorFunction(该IRP的副功能码) Parameters(IRP参数) DeviceObject(与该栈单元对应的设备对象地址) FileObject(内核文件对象地址) CompletionRoutine(I/O完成程序地址) Context(任意的与上下文相关的值)。
WDM的基本结构
1、设备对象
设备对象:系统为帮助软件管理硬件而创建的一个数据 结构(包括 PDO、FDO、FiDO)。 PDO(物理设备对象):设备对象中的物理型对象。 FDO(功能设备对象):设备对象中的功能型对象。 FiDO(过滤器设备对象):在I/O管理器、FDO和PDO间的监视、修改 IRP流的过滤型对象,分上层过滤和下层过滤对象。
驱动程序的DriverEntry函数示例:
extern "C" NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath) { // 初始化例程的入口地址 DriverObject->DriverUnload = DriverUnload; DriverObject->DriverExtension->AddDevice = AddDevice; DriverObject->DriverStartIo = StartIo; DriverObject->MajorFunction[IRP_MJ_PNP] = DispatchPnp; DriverObject->MajorFunction[IRP_MJ_POWER]= DispatchPower; DriverObject->MajorFunction[IRP_MJ_SYSTEM_CONTROL] = DispatchWmi; …… // 这里可加入其他MajorFunction处理例程的入口地址
驱动程序的IRP派遣函数示例:
NTSTATUS DispatchXxx(PDEVICE_OBJECT device, PIRP Irp) { PIO_STACK_LOCATION stack = IoGetCurrentIrpStackLocation(Irp);//获得栈单元指针 PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION)device->DeviceExtension //获得设备扩展 …… //其他IRP处理操作 return STATUS_Xxx; //返回状态码 }
DriverEntry
AddDevice
DispatchPnp DispatchPower
DispatchWmi DispatchRead DispatchWrite
WDM驱动程序包含例程
• DriverEntry例程:这个例程是每一个设备驱动程序的入口。完成 某些全局初始化(如将驱动程序对象指针装入到I/O管理器中)工 作,设置响应各种用户请求的分发例程与I/O控制例程的入口。 • AddDevice例程:对于功能驱动程序,其AddDevice函数的基本职责 是创建一个设备对象并把它连接到以PDO为底的设备堆栈中。 • DispatchPnp例程:用于处理IRP_MJ_PNP消息,以便能实现即插即 用的功能。 • DispatchPower例程:用于实现对电源管理的支持。 • DispatchWmi例程:WMI是微软实现的基于Web的企业管理工业标准 ,该例程用于处理有关的消息。
相关文档
最新文档