您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 管理学资料 > c9_Windows设备驱动程序设计
Windows设备驱动程序设计西北工业大学计算机学院周兴社谷建华倪红波Windows2000/XP的设备驱动程序虚拟设备驱动程序(VDD)内核模式驱动程序文件系统驱动程序保留设备驱动程序PnP驱动程序显示驱动程序WDM驱动程序类驱动程序小驱动程序Windows2000/XP设备驱动程序的种类虚拟设备驱动程序(VirtualDeviceDriver,VDD)可使DOS应用程序访问x86平台上的硬件,也可支持Windows9x下的对端口访问。WDM驱动程序是一种遵循电源管理协议并能在Win98和Win2000上实现源代码级兼容的PnP驱动程序。WDM驱动程序又可分为类驱动程序(管理已定义类的设备)和小驱动程序(提供厂商专有的支持)。显示驱动程序是用于显示和打印设备的内核模式驱动程序。文件系统驱动程序在本地磁盘或网络上实现标准PC文件系统模型(含多层次目录结构和命名文件概念)。保留设备驱动程序主要包括WindowsNT早期版本的驱动程序,它直接控制一个硬设备而不用其他驱动程序帮助,可以不做修改地在Windows2000中运行。WDM的基本结构1、设备对象设备对象:系统为帮助软件管理硬件而创建的一个数据结构(包括PDO、FDO、FiDO)。PDO(物理设备对象):设备对象中的物理型对象。FDO(功能设备对象):设备对象中的功能型对象。FiDO(过滤器设备对象):在I/O管理器、FDO和PDO间的监视、修改IRP流的过滤型对象,分上层过滤和下层过滤对象。设备对象栈:描述对设备对象内部处理请求的驱动层次的栈型结构IRPI/O系统服务Win32子系统应用程序用户态核心态I/O管理器FDO设备对象FiDOFiDOPDO设备对象栈上层过滤器驱动程序功能驱动程序下层过滤器驱动程序总线驱动程序功能驱动程序:管理FDO所代表的设备,负责其初始化、处理I/O操作、I/O操作完成时产生中断事件,为用户提供一种适当的设备控制方式。总线驱动程序:负责管理PDO硬件和计算机之间的连接。过滤器驱动程序:管理FiDO所代表的设备,用于监视和修改IRP流,硬件或软件人员可利用过滤器驱动程序修改上级驱动程序的传递过来的操作。WDM设备驱动程序类型每种硬件设备的驱动程序由上述两到三种驱动程序组成(可以无过滤器驱动程序)。相同类型的总线共用一种总线驱动程序(如PCI总线驱动程序)。设备对象与设备驱动程序关系每个功能设备对应一个设备对象(设备对象栈为设备对象内部属性),相同型号的多个功能设备对应多个设备对象。每个设备对象具有不同的私有属性值(如设备ID)。相同型号的多个功能设备共用一个过滤驱动程序和功能驱动程序,即只有一个驱动程序对象。设备驱动程序与设备关系:同类中成员函数与类实例关系。应用程序对设备对象的操作过程操作接口:设备驱动程序的Win32API函数,或重载的设备驱动程序的Win32API回调函数。操作参数:设备句柄、操作类型及其它信息。例:DeviceIoControl(hDevice,DIOC_MY_IO,NULL,0,NULL,0,NULL,NULL);Win32子系统处理:将I/O操作转换后交I/O管理器处理,I/O管理器创建一个I/O请求包(IRP)后,送到设备对象栈的最上层设备对象对应的驱动程序。驱动程序处理:每层驱动程序都可决定如何处理IRP,既可直接处理完该IRP就不再向下传,也可处理完后继续向下传递,还可只做向下传递工作。下层处理完的返回信息又通过该包的结构逐层向上传递。设备驱动程序的装入过程总线驱动程序检测到新的硬件安装向导指定新的硬件类型取得厂商、设备类型、版本、资源需求等信息取配置头区域信息由指定得到信息硬件接入添加新设备系统重启检测指定PnP管理器就创建PDO,在注册表中添加某些项所有硬件检测完毕?NYPnP管理器决定分配哪些资源给各个设备PnP管理器查找注册表中与该PDO相吻合的各级驱动程序执行DriverEntry(),设置各例程的入口地址,将对象指针装入I/O管理器中找到?NY读INF文件,按INF文件指令安装各级驱动程序PnP管理器装入最底层过滤驱动程序,调用其AddDevice函数,该函数创建一个FiDO,实现FiDO与同级驱动程序的连接PnP管理器查找所选驱动程序对象已在I/O管理器中已装入?PnP管理器根据需要给设备发送各种PnPIRPPnP管理器给设备发送“启动设备”PnPIRP,驱动程序将分配的资源信息向下传送到设备配置头区域中,并启动设备驱动程序处于等待状态,等待IRP的到来PnP管理器依次装入各级驱动程序,完成整个设备对象栈AddDevice函数把PDO连接到FiDO上WDM驱动程序的结构WDM驱动程序包含许多例程,操作系统调用这些例程来执行对IRP的各种操作。基本驱动程序例程I/O控制例程分发例程DriverEntryAddDeviceStartIOAdapterControlOnInterruptDpcForIsrDispatchPnpDispatchPowerDispatchWmiDispatchReadDispatchWriteStartIO处理请求队列、AdapterControl处理DMA操作、OnInterrupt处理中断。WDM驱动程序包含例程•DriverEntry例程:这个例程是每一个设备驱动程序的入口。完成某些全局初始化(如将驱动程序对象指针装入到I/O管理器中)工作,设置响应各种用户请求的分发例程与I/O控制例程的入口。•AddDevice例程:对于功能驱动程序,其AddDevice函数的基本职责是创建一个设备对象并把它连接到以PDO为底的设备堆栈中。•DispatchPnp例程:用于处理IRP_MJ_PNP消息,以便能实现即插即用的功能。•DispatchPower例程:用于实现对电源管理的支持。•DispatchWmi例程:WMI是微软实现的基于Web的企业管理工业标准,该例程用于处理有关的消息。驱动程序的DriverEntry函数示例:externCNTSTATUSDriverEntry(INPDRIVER_OBJECTDriverObject,INPUNICODE_STRINGRegistryPath){//初始化例程的入口地址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处理例程的入口地址驱动程序的AddDevice函数示例:NTSTATUSAddDevice(PDRIVER_OBJECTDriverObject,PDEVICE_OBJECTpdo){NTSTATUSstatus;PDEVICE_OBJECTfdo;status=IoCreateDevice(DriveObject,sizeof(WDM_DEVICE_EXTENSION),NULL,FILE_DEVICE_UNKNOWN,0,FALSE,&fdo);//在fdo中产生我们的功能设备对象if(NT_ERROR(status))returnstatus;……}驱动程序的IRP派遣函数示例:NTSTATUSDispatchXxx(PDEVICE_OBJECTdevice,PIRPIrp){PIO_STACK_LOCATIONstack=IoGetCurrentIrpStackLocation(Irp);//获得栈单元指针PDEVICE_EXTENSIONpdx=(PDEVICE_EXTENSION)device-DeviceExtension;//获得设备扩展……//其他IRP处理操作returnSTATUS_Xxx;//返回状态码}I/O请求包(IRP)定义:I/O请求包(IRP)是驱动程序操作的中心,它是一个内核“对象”,是预先定义的数据结构。应用:I/O管理器通过IRP对设备对象进行操作。I/O管理器接收到一个I/O请求后,分配并初始化一个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的副功能码)Parameters(IRP参数)DeviceObject(与该栈单元对应的设备对象地址)FileObject(内核文件对象地址)CompletionRoutine(I/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的函数:IoBuildAsynchronousFsdRequest();//创建异步IRPIoBuildSynchronousFsdRequest();//创建同步IRPIoBuildDeviceIoControlRequest();//创建同步IRP_MJ_DEVICE_CONTROL或//IRP_MJ_INTERNAL_DEVICE_CONTROL请求IoAllocateIrp();//创建其他种类IRPIoMakeAssociatedIrp();//创建某些IRP的子IRP创建者:I/O管理器,或其他的驱动程序。I/O管理器在创建完IRP后,将I/O请求信息设置到IRP中,并将IRP发送到设备驱动程序中。已知参数信息:PDEVICE_OBJECTDeviceObject;//设备对象结构IRP_MJ_Xxx;//I/O请求对应的功能码I/O管理器的处理流程:PIO_STACK_LOCATIONstack=IoGetNextIrpStackLocation(Irp);//获得该IRP第一个堆栈单元的指针(堆栈初始为空)stack-MajorFunction=IRP_MJ_Xxx;//填充MajorFunction代码……//对栈做其他初始化的工作//如StartIo()NTSTATUSstatus=IoCallDriver(DeviceObject,Irp);//把IRP发送到设备驱动程序IRP的设置与派遣:IoCallDriver的执行过程:NTSTATUSIoCallDriver(PDEVICE_OBJECTdevice,PIRPIrp){IoSetNextIrpStackLocation(Irp);PIO_STACK_LOCATIONstack=IoGetCurrentIrpStackLocation(Irp);//获得栈单元指针stack-DeviceObject=device;//设置设备对象结构地址ULONGfcn=stack-MajorFunction;//得到主功能号PDRIVER_OBJECTdriver=device-DriverObject;
本文标题:c9_Windows设备驱动程序设计
链接地址:https://www.777doc.com/doc-1306274 .html