WDM驱动
关于Windows WDM设备驱动程序
关于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.
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驱动程序
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驱动程序简介
设;避免在代码中直接引用硬件
可抢先性和可中断性 多处理器安全 基于对象 数据包驱动 异步
Windows XP 系统结构
WDM驱动程序模型
WDM模型主要包含以下内容:
1、描述了设备驱动程序的标准结构和应该完成的主 要功能。
一个应用程序打开了设备因此系统发送给驱动另一个irp处理函数进行了少量的操作之后返回???操作系统与驱动的交互过程?应用程序尝试读取或者写入一些数据因此系统发送一个irp处理例程将irp放入一个队列之后返回
设备驱动程序设计
第二讲
WDM驱动程序简介
Windows XP 驱动程序分类
内核模式驱动程序的属性
迷你驱动:包含在类驱动中,用于管理设备实例的厂商专有
特征例程。类驱动和迷你驱动合在一起才构成一个完整的 功能驱动程序。
IRP包
WDM驱动的层次结构
上层过滤器驱动程序 功能驱动程序
下层过滤器驱动程序 总线驱动程序
驱动程序如何工作
驱动程序是一个收集让操作系统调用的用来执行各 种涉及到硬件操作的子程序的容器。
某些I/O操作引发设备中断,中断服务例程做一些 很少的操作,然后请求一个DPC,之后返回。
DPC例程运行了,它可能要读回数据,或者继续下 一次的写操作等,然后开始下一个排在队列中的 IRP,之后DPC例程返回系统。
随着时间变化,在这期间系统会发送各种IRP给驱 动程序,驱动程序进行相应的处理。
操作系统与驱动的交互过程
系统运行时设备插入或者系统重新启动发现了某个 设备,系统就会装载可执行的驱动程序到内存中, 并且调用其DriverEntry例程。DriveEntry做了一些 初始化操作之后返回。
WDM 介绍
Communication between WDM Driver and AP
WDM 驅動與應用程式的通信方式: 為設備創建符號鏈接法:在驅動程式中用 IoCreateDevice() 創建新的設備對象的時候給新創 建的設備對象取個名字; 然后調用 IoCreateSymbolicLink() 創建一個符號鏈接;之后在应用 程序中调用 Createfile()打开驱动程序。
Innovating Customer Value
The Composition of WDM
一個完整的 WDM 驅動程序,除了包含驱动程序源文件,還包含 MAKEFILE, SOURCE, .RC和 .INF 文件: SOURCE檔 主要是用來指定編譯的源文件; MAKEFILE檔 在 WDM 驅動中都是一樣的,不需要修改,它存在的原因是在用“ build“編譯 WDM 驅動程序的時候,大部分的編譯工作 build 會傳遞給 NMAKE 來執行;
IANC Confidential
Innovating Customer Value
WDM Filter Driver Programming
Programming Process: WDM 驅動程序是一些例程的集合,它們被動的存在,等待主機系統軟件(PnP 管理器、 I/O管理器、 電源管理器等)來調用或激活它們。一個 WDM 驅動程序至少包括 5 個例 程: 1)驅動程序入口例程:處理驅動程序的初始化; 2)即插即用例程: 處理 PnP 設備的添加、刪除和停止(包括IRP_MJ_PNP .etc); 3)分發例程: 處理用戶應用程序發出的各種 I/O 請求(包括 IRP_MJ_CREATE \ IRP_MJ_READ \ IRP_MJ_WRITE\ IRP_MJ_DEVICE_CONTROL .ect); 4)電源管理例程:處理電源管理請求(包括 IRP_MJ_POWER) 5)卸載例程: 處理驅動程序的卸載。
构造WDM驱动程序开发环境安装成功WindowsDDK后课件
结构化异常处理
终止处理 Windows应用程序在运行时通常要分配资源,使用这些资源,
然后释放它们 由于异常改变了控制的流程,因此很容易导致无法释放在产
生异常的代码块中分配的资源 使用终止处理程序可以保证进行这样的清除工作
25
结构化异常处理
终止处理
– __try –{ – ... –} – __finally –{ – ... –}
26
结构化异常处理
终止处理 有两种情况可能使受保护段不正常地结束
– 在try块中执行了return、goto、break或continue等控制语句 – 在try块中发生异常
27
结构化异常处理
软件异常 当一个函数执行失败时,习惯上要返回一些特殊的值来,函
数的调用者可以检查这些特殊值并采取一种替代的动作 如果这个调用者是被另一个调用者调用的函数,那么它还需
部分通过资源编译器组合为一个完整的EXE文件 将用户界面资源一类的静态数据与程序代码相分离有如下一
些优点:
– 减少内存要求; – 划清了程序员与用户界面设计人员的任务分工 – 用户界面风格的变化可以不必修改程序代码或只需进行少量的
修改
11
Windows应用程序设计模式
Windows应用程序的开发流程
36
Windows驱动程序模型
WDM以Windows NT 4.0的内部结构为基础,同时引入了 Windows 9x的即插即用特性,为存在于Windows 98和 Windows 2000/XP/2003操作系统中的设备驱动程序提供了 一个统一的参考框架
9
Windows应用程序设计模式
硬件输入
事件驱动
Windows 系统消息队列
WDM内核驱动程序模型分析
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驱动
为了让这个驱动被系统加载,必须创建一个 inf 文件。
由于是使用现成的例子,因此这一步也可以省下来。
直接右键点击例子中的 inf 文件,在弹出的菜单中选择 “安装 ”即可。
这里要注意的是, inf 中的 StartType 参数,它可以控制驱动被加载 的方式:因为是测试,我使用 SERVICE_DEMAND_START ,即由手动加载 驱动。
例子是 miniFilter 驱动,因此可以在命令提示行中用 “fltmcload 驱动名称 ”来加载,相应的卸载是 “fltmc unload ”。
如果是其它驱动,则 用"net start 驱动名称"来加载,相应的卸载是"net stop 驱动名称”。
注 意驱动名称不是文件名, 而是inf 中[Settings ]的ServiceName 值。
驱动 要发布时,也可以通过 CreateService & StartService API 来动态安 Inf 文件的写法,可以参考例子,或者拿现成的改一改。
下面的是摘 自驱动开发网的XiangXiangRen 整理的 Inf 文件, 改起来比较方便, 谢谢 XiangXiangR en 。
文件过滤驱动安装 inf 文件简易获得法不少同仁获得 inf 文件都是直接修改 sfilter.inf, 这个修改很需要耐性, 不小心 敲错 又不能编译调试,改错难度不小。
有些同仁不加修改,结果 sfilter 满天飞:)。
我修改了一下 sfilter 的安装文件,这样你只要修改最后的字符 串列表,就可以 轻松得到自己的安装文件了。
可以用于任何打算静态加载的文件过滤驱动, 内容 如下:SERVICE_AUTO_START (2)SERVICE_BOOT_START (0) 会自动加载SERVICE_DEMAND_START(3) 安全模式下不会自动加载 在系统安全模式下启动时 驱动也则驱动不会自动加载[Version]signature = "$Windows NT$"Class = "ActivityMonitor" ;This is determined by the work this filter driver doesClassGuid = {b86dff51-a31e-4bac-b3cf-e8cfe75c9fc2} ;This value is determined by the ClassProvider = %MyName%DriverVer = 08/28/2005,1.0.0.1CatalogFile = Mycat.cat ; A CatalogFile entry is required for a WHQL sign ature.; The actual catalog file will be provided by WHQL. The; catalog file for this sample is not provided for use. [DestinationDirs]DefaultDestDir My.DriverFiles = 12= 12 ;%windir%\system32\drivers[SourceDisksNames]1 = %MyDisk%[SourceDisksFiles]%MySysFileName% = 1[DefaultInstall]OptionDesc = %MyServiceDesc%CopyFiles = My.DriverFiles[DefaultInstall.Services]AddService = %MyServiceName%,,My.Service AddReg = My.AddRegistry[DefaultUninstall]DelFiles = My.DriverFilesDelReg = My.DelRegistry[DefaultUninstall.Services]DelService = %MyServiceName%,0x200 [My.Service]DisplayName Description ServiceBinary= %MyServiceName%= %MyServiceDesc%= %12%\%MySysFileName%;%windir%\system32\drivers\JwFvfs.sysServiceType = 2 ;SERVICE_FILE_SYSTEM_DRIVERStartType = 0 ;SERVICE_BOOT_STARTErrorControl = 1 ;SERVICE_ERROR_NORMALLoadOrderGroup = "FSFilter Activity Monitor" ;"filter" if install to 2k.AddReg = My.AddRegistry[My.AddRegistry][My.DelRegistry][My.DriverFiles]%MySysFileName%[Strings]MyName = "Tan Wen"MyServiceDesc = "Tan Wen's File System Filter."MyServiceName = "TanWenFsF"MyRegistry = "system\currentcontrolset\services\TanWenFsF"MyDisk = "Tan Wen Source Media"MySysFileName = "TanWen.sys"修改的时候只要修改最后的字符串列表,依次是开发者名,服务描述,服务名,注册表位置,磁盘标签,驱动文件名。
WDM驱动程序的框架
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例程也没有什么清除工作要做。
wdm设备驱动程序入门共39页文档
应用程序对设备对象的操作过程
操作接口:设备驱动程序的Win32 API函数,或重载的设备驱动程序的 Win32 API回调函数。 操作参数:设备句柄、操作类型及其它信息。 例:DeviceIoControl(hDevice, DIOC_MY_IO, NULL, 0,
NULL, 0, NULL,NULL); Win32子系统处理:将I/O操作转换后交I/O管理器处理, I/O管理器创建 一个I/O请求包(IRP)后,送到设备对象栈的最上层设备对象对应的驱动 程序。
已装 入?
执行DriverEntry(),设置各例程 的入口地址,将对象指针装入I/O 管理器中
PnP管理器装入最底层过滤驱动程序,调用其 AddDevice函数,该函数创建一个FiDO,实现FiDO与 同级驱动程序的连接
AddDevice函数把PDO连接到FiDO上 PnP管理器依次装入各级驱动程序,完成整个设备对象栈
PnP管理器根据需要给设备发送各种PnP IRP PnP管理器给设备发送“启动设备”PnP IRP,驱动程序将分 配的资源信息向下传送到设备配置头区域中,并启动设备
驱动程序处于等待状态,等待IRP的到来
WDM驱动程序的结构
WDM驱动程序包含许多例程,操作系统调用这些例程来执
行对IRP的各种操作。
Hale Waihona Puke 基本驱动程序例程取得厂商、设备类型、版本、资源需求等信息
PnP管理器就创建PDO,在注册表中添加某些项
N
所有硬件检测完毕?
Y PnP管理器决定分配哪些资源给各个设备
设备驱动程序的装入过程
PnP管理器查找注册表中与该PDO相吻合的各级驱 动程序
找到? N
Y
读INF文件,按INF文 件指令安装各级驱动
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驱动程序入门(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驱动程序
建立驱动开发环境建立驱动开发环境,所需的软件为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几个字...很郁闷啊--------------网上所说的解决方法是对的,但没有说清楚,使人无法一时明白。
wdm驱动
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设备驱动程序的软件框架,它提供了许多优势和便利,使开发者能够更轻松地开发高性能和兼容性强的驱动程序。
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,建立在服务器上的各类应用程序被称为客户。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
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”。
在Windows NT上,驱动程序被称为Kernel Driver Mode驱动程序。
笔者认为这个Mode是指一种驱动程序的结构和运作的规范),有过不同的名称。
比如在Windows 9x上的驱动程序,都叫做VXD,而在Windows NT上的驱动程序被称为KDM驱动程序,Windows 98~2000这个时期出现的新模型叫做WDM。
Windows的驱动模型概念,本来是就驱动程序的行为而言的。
比如WDM驱动,必须要满足提供n种被要求的特性(如电源管理、即插即用)才被称为WDM驱动。
如果不提供这些功能,那么统一称为NT式驱动。
同样的,WDF驱动也有它的一系列规范。
模型的发展并不是和操作系统版本的升级齐步走的,而是有一个逐渐替代的过程。
比如Windows 98已经支持部分的WDM驱动程序,但是又支持一部分的VXD驱动。
而到了Windows 2000,则VXD这种驱动程序完全被淘汰了。
KDM则是WDM的前身。
WDM是在KDM的基础上增加了一些新的特性,制定了一些新的规范而造就的。
绝大部分函数调用都是通用的。
同三维视频() 是一家以技术和创新领先的多媒体视频产品专业供应商,主要致力于多媒体视频产品的设计、开发、生产和销售。
产品已涵盖专业音视频采集卡、流媒体采集卡、万能采集卡、pci-e高清音视频采集卡、VGA采集卡、外置USB视频采集卡、DVI数字采集卡、HDMI采集卡、高清非编卡、LED电子视频耳鼻喉内窥镜、管道内窥镜、工业视频内窥镜、视频采集卡、HDMI切换器、HDMI 分配器等各大领域。
随着Windows 9x的失宠,VXD难逃彻底被淘汰的命运。
Windows NT则发展成了后来的Windows版本,KDM也变成了WDM而存在下来。
当然,微软不会闲着,现在又推出了新的WDF。
由于某些原因,在此整理的这篇文章并不十分的完善和完整,如果哪位读者补充以后,可以将补充后的文档发给同三维(tswvideo@),我们将整理更完整的版本并发布,期待大家的沟通交流。
-------------------同三维同三维视频:同舟视达科技:同三维:同三维官网:同三维视频内窥镜:同三维视频采集卡:同三维视频转换器:同三维商城:1.WDM驱动程序开发基础知识1.1WDM简介:Win32 Driver Model Win32驱动程序模型WDM(Win32 Driver Model),即Win32驱动程序模型,是Microsoft力推的全新驱动程序模式,旨在通过提供一种灵活的方式来简化驱动程序的开发,在实现对新硬件支持的基础上减少并降低所必须开发的驱动程序的数量和复杂性。
除了通用的平台服务和扩展外,WDM还实现了一个模块化的、分层次类型的微型驱动程序结构。
类型驱动程序实现了支持通用总线、协议或设备类所需的功能性接口。
类型驱动程序的一般特性是为逻辑设备的命令设置、协议和代码重用所需的总线接口实现标准化提供必要的条件。
WDM对标准类接口的支持减少了Windows 95和Windows NT所需的设备驱动程序的数量和复杂性。
Windows 2000也引入了WDM驱动程序构架。
虽然WDM目前实际应用还不多,但是相信在不久的将来,在Windows平台上,WDM将成为21世纪主流的驱动模式。
1.2 Win32 APIWindows 98不像Windows 2000那样非常有规律的处理I/O操作。
应用程序调用Win32 API,而且仅当读硬盘文件、通信端口和有WDM驱动程序的设备时才调用相应的Win32 API,对其它设备必须使用特定的机制。
全部Windows 2000的内核模式I/O操作都使用一个共同的数据结构(IRP),Windows 98不具备这一特点,应用程序请求更达不到内核模式。
不过,当谈到WDM驱动程序的时候,Windows 98内部的体系结构与Windows 2000是非常相似的。
系统模块(NTKERN.VxD)包括大量Windows NT内核支持函数,它完成请求包IRPs的创建,把它们发送给WDM驱动程序,从这一点考虑,两个环境之间不存在差异。
1.3 WDM特性模块化的WDM体系结构中灵活统一的接口,使操作系统可以动态地配置不同的驱动程序模块来支持特定的设备。
一个典型的驱动程序堆栈由通用设备、协议及特定协议和特定总线的微型驱动程序联接的总线类驱动程序构成。
动态构造WDM驱动程序堆栈是实现即插即用设备支持的关键。
WDM服务使实现一个用于Windows NT和Windows 95快速反应的模型成为可能。
WDM提供了多个执行优先级,包括核心态和非核心态线程、IRQ级别和被延缓的程序调用(DPC)。
所有的WDM类和微型驱动程序都作为核心态(第0层)的特权级线程(不会被CPU调度程序中断)执行。
32个IRQ级可以被用于区分硬件中断服务的优先级。
对于每个中断,DPC被排入队列等到被启用中断的IRQ服务例程完成后再执行。
DPCs通过有效的减少中断被禁止的时间,使系统对中断的响应获得了很大的提高。
对于使用多处理器的基于x86的PC系统,在Windows NT下对中断的支持是以Intel的多处理器规范1.4版本为基础的。
对于流媒体应用程序,WDM在核心态提供了快速反应的接口来处理I/O流。
WDM的流接口是通过标准的WDM类接口提供出的。
1.4 WDM工作原理WDM支持USB、IEEE 1394、ACPI等全新的硬件标准。
而且以往在两个平台上同时运行时需要编写两个截然不同的驱动程序,现在只需要编写一个WDM驱动程序就可以了。
WDM驱动程序也是分层的,即不同层上的驱动程序有着不同的优先级,而Windows 9x下的VxD则没有此结构。
另外,WDM还引入了功能设备对象FDO(Functional Device Object)与物理设备对象PDO(Physical Device Object)两个新类来描述硬件,一个PDO对应一个真实硬件。
一个硬件只允许有一个PDO,却可以拥有多个FDO,在驱动程序中直接操作的不是硬件而是相应的PDO与FDO。
在Ring-3与Ring-0通讯方面,系统为每一个用户请求打包形成一个IRP结构,将其发送至驱动程序,并通过识别IRP中的PDO来区别是发送给哪一个设备的。
在驱动程序的加载方面,WDM不通过驱动程序名称识别,而是通过一个128位的GUID来实现驱动程序的识别。
1.5 WDM与其它驱动程序的比较写WDM和其它模式驱动程序基本上是相同的,代码中的主要区别在于如何创建设备。
在WDM驱动程序中,即插即用(PnP)管理器告知何时向系统添加一个设备,或者从系统删除设备。
PnP 管理器使用安装的INF文件查找新设备的正确驱动程序;而其它模式驱动程序必须发现它自己的设备,使用专门的安装程序安装。
在细节上也存在很多区别:其它模式驱动程序参数一般由注册表提供,在DriverEntry里调用读注册表的函数,然后根据注册表再调用CreateDevice,但是WDM一般不是这样,这是由于Windows 2000下支持PnP,在加载的时候会发PnP消息给Driver,所以一般不需要在DriverEntry里调用CreateDevice,而是在AddDevice里创建,或者在PnP消息里创建。
一般在DriverEntry里创建的是一个与设备或者对象毫无关系的虚拟设备,用于管理与Win32的通讯。
如果不想对该设备做什么特别的处理,或者设备不复杂,AddDevice 可以简单返回Nt_Success,不用调用CreateDevice。