版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 Windows设备驱动程序设计西北工业大学计算机学院周兴社 谷建华 倪红波. Windows 2000/XP的设备驱动程序虚拟设备驱动程序VDD内核方式驱动程序文件系统驱动程序保管设备驱动程序PnP驱动程序显示驱动程序WDM驱动程序类驱动程序小驱动程序Windows2000/XP设备驱动程序的种类.虚拟设备驱动程序(Virtual Device Driver,VDD)可使DOS运用程序访问x86平台上的硬件,也可支持Windows 9x下的对端口访问。WDM驱动程序 是一种遵照电源管理协议并能在Win98和Win2000上实现源代码级兼容的PnP驱动程序。WDM驱动程序又可分为类驱动程序管理
2、已定义类的设备和小驱动程序提供厂商专有的支持。. 显示驱动程序是用于显示和打印设备的内核方式驱动程序。文件系统驱动程序在本地磁盘或网络上实现规范PC文件系统模型(含多层次目录构造和命名文件概念)。 保管设备驱动程序主要包括Windows NT早期版本的驱动程序,它直接控制一个硬设备而不用其他驱动程序协助,可以不做修正地在Windows 2000中运转。. WDM的根本构造1、设备对象 设备对象:系统为协助软件管理硬件而创建的一个数据 构造包括PDO、FDO、FiDO。 PDO(物理设备对象):设备对象中的物理型对象。 FDO(功能设备对象):设备对象中的功能型对象。FiDO(过滤器设备对象):
3、在I/O管理器、FDO和PDO间的监视、修正IRP流的过滤型对象,分上层过滤和下层过滤对象。.设备对象栈:描画对设备对象内部处置恳求的驱动层次的栈型构造.IRPI/O系统效力Win32子系统运用程序用户态中心态I/O管理器FDO设备对象FiDOFiDOPDO设备对象栈上层过滤器驱动程序功能驱动程序下层过滤器驱动程序总线驱动程序. 功能驱动程序 :管理FDO所代表的设备,担任其初始化、处置I/O操作、I/O操作完成时产生中断事件,为用户提供一种适当的设备控制方式。 总线驱动程序:担任管理PDO硬件和计算机之间的衔接。 过滤器驱动程序:管理FiDO所代表的设备,用于监视和修正IRP流,硬件或软件人
4、员可利用过滤器驱动程序修正上级驱动程序的传送过来的操作。WDM设备驱动程序类型每种硬件设备的驱动程序由上述两到三种驱动程序组成可以无过滤器驱动程序。一样类型的总线共用一种总线驱动程序如PCI总线驱动程序。. 设备对象与设备驱动程序关系每个功能设备对应一个设备对象设备对象栈为设备对象内部属性,一样型号的多个功能设备对应多个设备对象。每个设备对象具有不同的私有属性值(如设备ID)。一样型号的多个功能设备共用一个过滤驱动程序和功能驱动程序,即只需一个驱动程序对象。 设备驱动程序与设备关系: 同类中成员函数与类实例关系。.运用程序对设备对象的操作过程 操作接口:设备驱动程序的Win32 API函数,或
5、重载的设备驱动程序的Win32 API回调函数。 操作参数:设备句柄、操作类型及其它信息。 例:DeviceIoControlhDevice, DIOC_MY_IO, NULL, 0, NULL, 0, NULL,NULL; Win32子系统处置:将I/O操作转换后交I/O管理器处置, I/O管理器创建一个I/O恳求包(IRP)后,送到设备对象栈的最上层设备对象对应的驱动程序。. 驱动程序处置:每层驱动程序都可决议如何处置IRP,既可直接处置完该IRP就不再向下传,也可处置完后继续向下传送,还可只做向下传送任务。下层处置完的前往信息又经过该包的构造逐层向上传送。.设备驱动程序的装入过程总线驱动
6、程序检测到新的硬件安装导游指定新的硬件类型获得厂商、设备类型、版本、资源需求等信息取配置头区域信息由指定得到信息硬件接入添加新设备系统重启检测指定PnP管理器就创建PDO,在注册表中添加某些项一切硬件检测终了?NYPnP管理器决议分配哪些资源给各个设备.PnP管理器查找注册表中与该PDO相吻合的各级驱动程序执行DriverEntry(),设置各例程的入口地址,将对象指针装入I/O管理器中找到?NY读INF文件,按INF文件指令安装各级驱动程序PnP管理器装入最底层过滤驱动程序,调用其AddDevice函数,该函数创建一个FiDO,实现FiDO与同级驱动程序的衔接PnP管理器查找所选驱动程序对象
7、已在I/O管理器中已装入?.PnP管理器根据需求给设备发送各种PnP IRPPnP管理器给设备发送“启动设备PnP IRP,驱动程序将分配的资源信息向下传送到设备配置头区域中,并启动设备驱动程序处于等待形状,等待IRP的到来PnP管理器依次装入各级驱动程序,完成整个设备对象栈AddDevice函数把PDO衔接到FiDO上. WDM驱动程序的构造 WDM驱动程序包含许多例程,操作系统调用这些例程来执行对IRP的各种操作。 根本驱动程序例程 I/O控制例程 分发例程 DriverEntry AddDevice StartIOAdapterControl OnInterrupt DpcForIsr
8、DispatchPnpDispatchPower DispatchWmi DispatchRead DispatchWriteStartIO处置恳求队列、 AdapterControl处置DMA操作、OnInterrupt处置中断。.WDM驱动程序包含例程DriverEntry例程:这个例程是每一个设备驱动程序的入口。完成某些全局初始化如将驱动程序对象指针装入到I/O管理器中任务,设置呼应各种用户恳求的分发例程与I/O控制例程的入口。AddDevice例程:对于功能驱动程序,其AddDevice函数的根本职责是创建一个设备对象并把它衔接到以PDO为底的设备堆栈中。DispatchPnp例程:用
9、于处置IRP_MJ_PNP音讯,以便能实现即插即用的功能。DispatchPower例程:用于实现对电源管理的支持。DispatchWmi例程:WMI是微软实现的基于Web的企业管理工业规范,该例程用于处置有关的音讯。.驱动程序的DriverEntry函数例如:extern C NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath) / 初始化例程的入口地址 DriverObject-DriverUnload = DriverUnload; DriverObject-Driver
10、Extension-AddDevice = AddDevice; DriverObject-DriverStartIo = StartIo; DriverObject-MajorFunctionIRP_MJ_PNP = DispatchPnp; DriverObject-MajorFunctionIRP_MJ_POWER= DispatchPower; DriverObject-MajorFunctionIRP_MJ_SYSTEM_CONTROL = DispatchWmi; / 这里可参与其他MajorFunction处置例程的入口地址.驱动程序的AddDevice函数例如:NTSTATUS
11、 AddDevicePDRIVER_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; .驱动程序的IRP派遣函数例如:NTSTATUS DispatchXxx(PDEVIC
12、E_OBJECT device, PIRP Irp) PIO_STACK_LOCATION stack = IoGetCurrentIrpStackLocation(Irp);/获得栈单元指针 PDEVICE_EXTENSION pdx = (PDEVICE_EXTENSION)device-DeviceExtension;/获得设备扩展 /其他IRP处置操作 return STATUS_Xxx;/前往形状码 .I/O恳求包IRP定义:I/O恳求包IRP是驱动程序操作的中心,它是一个内核“对象,是预先定义的数据构造。运用:I/O管理器经过IRP对设备对象进展操作。 I/O管理器接纳到一个I/O
13、恳求后,分配并初始化一个IRP,再把它传送到适宜的设备驱动程序中的最高驱动程序中。 设备对象属性为设备驱动程序处置的数据。.由一个固定的首部和一个可变数目的I/O栈组成。1.IRP组成IRP首部组成.I/O栈:经过IO_STACK_LOCATION构造数组实现。 一次I/O恳求能够对应多个I/O操作实现方法: 较多个IRP实现; 一个IRP实现+I/O栈实现。较优IRP中的I/O栈组成.IO_STACK_LOCATION构呵斥员: MajorFunction该IRP的主功能码 MinorFunction该IRP的副功能码 ParametersIRP参数 DeviceObject(与该栈单元对应
14、的设备对象地址) FileObject内核文件对象地址 CompletionRoutineI/O完成程序地址 Context恣意的与上下文相关的值。.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控制。Parameters成员的几个常见的类型:.2、IRP创建与处置 创建IRP的函数: IoBuildAsynchr
15、onousFsdRequest();/创建异步IRP IoBuildSynchronousFsdRequest();/创建同步IRP IoBuildDeviceIoControlRequest(); /创建同步IRP_MJ_DEVICE_CONTROL或 / IRP_MJ_INTERNAL_DEVICE_CONTROL 恳求 IoAllocateIrp();/创建其他种类IRP IoMakeAssociatedIrp();/创建某些IRP的子IRP创建者:I/O管理器,或其他的驱动程序。. I/O管理器在创建完IRP后,将I/O恳求信息设置到IRP中,并将IRP发送到设备驱动程序中。知参数信息
16、: 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发送到设备驱动程
17、序IRP的设置与派遣:.IoCallDriver的执行过程:NTSTATUS IoCallDriver(PDEVICE_OBJECT device, PIRP Irp) IoSetNextIrpStackLocationIrp; PIO_STACK_LOCATION stack = IoGetCurrentIrpStackLocation(Irp);/获得栈单元指针 stack-DeviceObject = device; /设置设备对象构造地址 ULONG fcn = stack-MajorFunction;/得到主功能号 PDRIVER_OBJECT driver = device-Dri
18、verObject;/获得驱动程序对象的地址 return (*driver-MajorFunctionfcn)(device,Irp);/利用主功能号调用相应的派遣函数 *driver- MajorFunctionfcn是函数指针,它所指向的派遣函数是在DriverEntry例程中指定的。.3、IRP参数与Win32 API大部分IRP参数可以和Win32函数对应起来:IRP类型Win32 APIIRP_MJ_CREATECreateFileIRP_MJ_READReadFileIRP_MJ_WRITEWriteFileIRP_MJ_IOCTLDeviceIoControlIRP_MJ_CL
19、OSECloseIRP_MN_START_DEVICEStartDevice.五、即插即用 支持即插即用主要是指实现一个AddDevice程序和一个IRP_MJ_PNP处置程序。这个PnP IRP有8个次功能代码它们的主功能代码都是IRP_MJ_PNP。 IRP_MN_START_DEVICE 分配资源并启动设备IRP_MN_QUERY_REMOVE_DEVICE 讯问一个设备能否可以删除IRP_MN_REMOVE_DEVICE 设备被拔出,删除设备 IRP_MN_CANCEL_REMOVE_DEVICE 取消查询删除恳求IRP_MN_STOP_DEVICE 停顿设备进展资源重新分配IRP_M
20、N_QUERY_STOP_DEVICE 讯问设备能否可以停顿IRP_MN_CANCEL_STOP_DEVICE 取消查询停顿恳求 IRP_MN_SURPRISE_REMOVAL 用户在不测下拔出设备 .六、数据读/写WDM有4个规范的资源类型,分别是:CmResourceTypePort端口资源CmResourceTypeMemory内存资源CmResourceTypeInterrupt中断资源CmResourceTypeDmaDMA资源.1、内存与端口访问 虽然PC机的I/O端口是单独编址的,但为了做到和一致编址的机器兼容性,Windows 2000的设计者运用了硬件笼统层HAL的概念。无论是单独编址还是一致编址,只需求运用P386表中所给的函数就可以访问端口和内存了。.2、呼应中断 呼应中断首先要配置中断,也就是截获中断,然后就需求编写中断处置程序。 配置中断资源是在StartDevice函数中实现的,运用从CmResourceTypeInterrupt描画符中得到的参数来调用IoConnectInterrupt函数。和实方式下一样,在调用IoConnectInterrupt进展中断配置前应该制止PC机的中断,调用之后再允许设备中断。 .七、WDM驱动程序的安装文件驱动程序的安装: 安装步骤:根据INF文件中的指令进展。 安装内容:将可执行文件
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年青海省法检系统书记员招聘笔试参考题库及答案详解
- 2026年武汉市洪山区法检系统书记员招聘笔试参考试题及答案详解
- 2026年辽宁省辽阳市法检系统书记员招聘笔试备考题库及答案详解
- 2026年宝鸡市陈仓区法检系统书记员招聘笔试备考题库及答案详解
- 2026年河南省信阳市法检系统书记员招聘笔试参考试题及答案详解
- 2025年淮安市淮阴区法检系统书记员招聘考试试题及答案详解
- 二手新能源汽车鉴定评估规范
- 2026年河南省新乡市法检系统书记员招聘笔试参考题库及答案详解
- 2026年珠海市斗门区法检系统书记员招聘笔试备考试题及答案详解
- 2025年渝中区江北区法检系统书记员招聘考试试题及答案详解
- 2026年内蒙古自治区医师定期考核试题附答案
- 二升三语文暑假特色作业(2026版)
- (期末复习) 2025-2026学年人教版八年级数学下册期末考前预测卷
- 2027年高考化学复习必刷题-化学反应与能量(解答大题)
- 2026小红书有感运动IP方案
- 2026年执业药师《药事管理与法规》考试综合练习及完整答案详解(名师系列)
- 2026年档案修裱技术规范与破损档案抢救修复流程考核
- 《保障农民工工资支付条例》宣贯会
- 烫伤预防与护理实践指南(2025年版)
- 《2026年》医院行政岗位高频面试题包含详细解答
- 2026春外研版七年级下册英语期末试卷一(含听力音频答案)
评论
0/150
提交评论