c9_Windows设备驱动程序设计_第1页
c9_Windows设备驱动程序设计_第2页
c9_Windows设备驱动程序设计_第3页
c9_Windows设备驱动程序设计_第4页
c9_Windows设备驱动程序设计_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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硬件和计算机之间的连接。 过滤器驱动程序:

4、管理FiDO所代表的设备,用于监视和修改IRP流,硬件或软件人员可利用过滤器驱动程序修改上级驱动程序的传递过来的操作。WDMWDM设备驱动程序类型设备驱动程序类型每种硬件设备的驱动程序由上述两到三种驱动程序组成(可以无过滤器驱动程序)。相同类型的总线共用一种总线驱动程序(如PCI总线驱动程序)。 设备对象与设备驱动程序关系每个功能设备对应一个设备对象(设备对象栈为设备对象内部属性),相同型号的多个功能设备对应多个设备对象。每个设备对象具有不同的私有属性值(如设备ID)。相同型号的多个功能设备共用一个过滤驱动程序和功能驱动程序,即只有一个驱动程序对象。 设备驱动程序与设备关系: 同类中成员函数与

5、类实例关系。应用程序对应用程序对设备对象的操作过程设备对象的操作过程 操作接口:设备驱动程序的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)后,送到设备对象栈的最上层设备对象对应的驱动程序。 驱动程序处理:每层驱动程序都可决定如何处理IRP,既可直接处理完该IRP就不再向下传,也可处理

6、完后继续向下传递,还可只做向下传递工作。下层处理完的返回信息又通过该包的结构逐层向上传递。设备驱动程序的装入过程总线驱动程序检测到新的硬件安装向导指定新的硬件类型取得厂商、设备类型、版本、资源需求等信息取配置头区域信息由指定得到信息硬件接入添加新设备系统重启检测指定PnP管理器就创建PDO,在注册表中添加某些项所有硬件检测完毕?NYPnP管理器决定分配哪些资源给各个设备PnP管理器查找注册表中与该PDO相吻合的各级驱动程序执行DriverEntry(),设置各例程的入口地址,将对象指针装入I/O管理器中找到?NY读INF文件,按INF文件指令安装各级驱动程序PnP管理器装入最底层过滤驱动程序,

7、调用其AddDevice函数,该函数创建一个FiDO,实现FiDO与同级驱动程序的连接PnP管理器查找所选驱动程序对象已在I/O管理器中已装入?PnP管理器根据需要给设备发送各种PnP IRPPnP管理器给设备发送“启动设备”PnP IRP,驱动程序将分配的资源信息向下传送到设备配置头区域中,并启动设备驱动程序处于等待状态,等待IRP的到来PnP管理器依次装入各级驱动程序,完成整个设备对象栈AddDevice函数把PDO连接到FiDO上 WDM驱动程序的结构 WDM驱动程序包含许多例程,操作系统调用这些例程来执行对IRP的各种操作。 基本驱动程序例程 I/O控制例程 分发例程 DriverEn

8、try AddDevice StartIOAdapterControl OnInterrupt DpcForIsr DispatchPnpDispatchPower DispatchWmi DispatchRead DispatchWriteStartIO处理请求队列、 AdapterControl处理DMA操作、OnInterrupt处理中断。WDM驱动程序包含例程DriverEntry例程:这个例程是每一个设备驱动程序的入口。完成某些全局初始化(如将驱动程序对象指针装入到I/O管理器中)工作,设置响应各种用户请求的分发例程与I/O控制例程的入口。AddDevice例程:对于功能驱动程序,其

9、AddDevice函数的基本职责是创建一个设备对象并把它连接到以PDO为底的设备堆栈中。DispatchPnp例程:用于处理IRP_MJ_PNP消息,以便能实现即插即用的功能。DispatchPower例程:用于实现对电源管理的支持。DispatchWmi例程:WMI是微软实现的基于Web的企业管理工业标准,该例程用于处理有关的消息。驱动程序的DriverEntry函数示例:extern C NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath) / 初始化例程的入口地址 Dri

10、verObject-DriverUnload = DriverUnload; DriverObject-DriverExtension-AddDevice = AddDevice; DriverObject-DriverStartIo = StartIo; DriverObject-MajorFunctionIRP_MJ_PNP = DispatchPnp; DriverObject-MajorFunctionIRP_MJ_POWER= DispatchPower; DriverObject-MajorFunctionIRP_MJ_SYSTEM_CONTROL = DispatchWmi; /

11、 这里可加入其他MajorFunction处理例程的入口地址驱动程序的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(st

12、atus) return status; 驱动程序的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;/返回状态码 I/OI/O请求包(请求包(IRPIRP)定义:I/O请求包

13、(IRP)是驱动程序操作的中心,它是一个内核“对象”,是预先定义的数据结构。应用:I/O管理器通过IRP对设备对象进行操作。 I/O管理器接收到一个I/O请求后,分配并初始化一个IRP,再把它传递到合适的设备驱动程序中的最高驱动程序中。 设备对象属性为设备驱动程序处理的数据。由一个固定的首部和一个可变数目的I/O栈组成。1.IRP1.IRP组成组成IRP首部组成I/O栈:通过IO_STACK_LOCATION结构数组实现。 一次I/O请求可能对应多个I/O操作实现方法: 较多个IRP实现; 一个IRP实现+I/O栈实现。(较优)IRPIRP中的中的I/OI/O栈组成栈组成nIO_STACK_L

14、OCATION结构成员: MajorFunction(该IRP的主功能码) MinorFunction(该IRP的副功能码) Parameters(IRP参数) DeviceObject(与该栈单元对应的设备对象地址) FileObject(内核文件对象地址) CompletionRoutine(I/O完成程序地址) Context(任意的与上下文相关的值)。IRP_MJ_CREATE请求,创建设备映射; IRP_MJ_CLOSE请求,关闭设备映射; IRP_MJ_READ请求,读取设备对象的信息; IRP_MJ_WRITE请求,对设备对象写信息; IRP_MJ_PNP请求,实现PnP管理,如

15、IRP_MN_START_DEVICE请求,启动设备; IRP_MJ_IOCTL请求,I/O控制。Parameters成员的几个常见的类型:2、IRP创建与处理 创建IRP的函数: IoBuildAsynchronousFsdRequest();/创建异步IRP IoBuildSynchronousFsdRequest();/创建同步IRP IoBuildDeviceIoControlRequest(); /创建同步IRP_MJ_DEVICE_CONTROL或 / IRP_MJ_INTERNAL_DEVICE_CONTROL 请求 IoAllocateIrp();/创建其他种类IRP IoMa

16、keAssociatedIrp();/创建某些IRP的子IRP创建者:I/O管理器,或其他的驱动程序。 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; /

17、填充MajorFunction代码 /对栈做其他初始化的工作 /如StartIo() NTSTATUS status = IoCallDriver(DeviceObject,Irp);/把IRP发送到设备驱动程序IRP的设置与派遣:IoCallDriverIoCallDriver的执行过程:的执行过程:NTSTATUS IoCallDriver(PDEVICE_OBJECT device, PIRP Irp) IoSetNextIrpStackLocation(Irp); PIO_STACK_LOCATION stack = IoGetCurrentIrpStackLocation(Irp);

18、/获得栈单元指针 stack-DeviceObject = device; /设置设备对象结构地址 ULONG fcn = stack-MajorFunction;/得到主功能号 PDRIVER_OBJECT driver = device-DriverObject;/获得驱动程序对象的地址 return (*driver-MajorFunctionfcn)(device,Irp);/利用主功能号调用相应的派遣函数 *driver- MajorFunctionfcn是函数指针,它所指向的派遣函数是在DriverEntry例程中指定的。3、IRP参数与Win32 API大部分大部分IRPIRP参

19、数可以和参数可以和Win32Win32函数对应起来:函数对应起来:IRP类型Win32 APIIRP_MJ_CREATECreateFileIRP_MJ_READReadFileIRP_MJ_WRITEWriteFileIRP_MJ_IOCTLDeviceIoControlIRP_MJ_CLOSECloseIRP_MN_START_DEVICEStartDevice五、即插即用 支持即插即用主要是指实现一个AddDevice程序和一个IRP_MJ_PNP处理程序。这个PnP IRP有8个次功能代码(它们的主功能代码都是IRP_MJ_PNP)。 IRP_MN_START_DEVICE 分配资源并

20、启动设备 IRP_MN_QUERY_REMOVE_DEVICE 询问一个设备是否可以删除 IRP_MN_REMOVE_DEVICE 设备被拔出,删除设备 IRP_MN_CANCEL_REMOVE_DEVICE 取消查询删除请求 IRP_MN_STOP_DEVICE 停止设备进行资源重新分配 IRP_MN_QUERY_STOP_DEVICE 询问设备是否可以停止 IRP_MN_CANCEL_STOP_DEVICE 取消查询停止请求 IRP_MN_SURPRISE_REMOVAL 用户在意外下拔出设备 六、数据读/写WDM有4个标准的资源类型,分别是:CmResourceTypePort(端口资源

21、)CmResourceTypeMemory(内存资源)CmResourceTypeInterrupt(中断资源)CmResourceTypeDma(DMA资源)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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论