Windows 2000XP下IO设备驱动程序的设计.doc

上传人:laozhun 文档编号:2390153 上传时间:2023-02-17 格式:DOC 页数:7 大小:30.50KB
返回 下载 相关 举报
Windows 2000XP下IO设备驱动程序的设计.doc_第1页
第1页 / 共7页
Windows 2000XP下IO设备驱动程序的设计.doc_第2页
第2页 / 共7页
Windows 2000XP下IO设备驱动程序的设计.doc_第3页
第3页 / 共7页
Windows 2000XP下IO设备驱动程序的设计.doc_第4页
第4页 / 共7页
Windows 2000XP下IO设备驱动程序的设计.doc_第5页
第5页 / 共7页
点击查看更多>>
资源描述

《Windows 2000XP下IO设备驱动程序的设计.doc》由会员分享,可在线阅读,更多相关《Windows 2000XP下IO设备驱动程序的设计.doc(7页珍藏版)》请在三一办公上搜索。

1、Windows 2000/XP下I/O设备驱动程序的设计摘要:本文介绍了Windows 2000/XP下WDM驱动程序的基本设计方法;阐述了I/O设备驱动程序的基本构成,硬件资源的配置和访问的方法;提出了设备驱动程序在实际应用中的层次化结构。关键词:WDM;设备驱动程序;I/O端口;DLLDesign of I/O Device Driver under Windows 2000/XPAbstract:This paper introduce the primary designing methods of WDM driver under Windows 2000/XP. It descri

2、be the basic structure of an I/O device driver, and the method of configing and accessing the hardware resources. It also put forward the layered structure of device driver in the real implement. Keyword:WDM;device driver; I/O port; DLL1 引言在开发微机应用系统的过程中,尤其是在控制系统中,通常会遇到在Windows环境下对具有特定功能的硬件设备(如数据采集卡)

3、,进行直接访问和控制的问题。因为在Windows操作系统下,CPU运行于保护模式,并且统一管理硬件资源,执行于用户态的应用程序不能直接访问硬件,而是通过调用执行于核心态的设备驱动程序提供的各种服务间接地对硬件资源进行访问,这一机制确保了系统的安全。所以,以前在Dos和Windows 98下可以很容易完成的I/O端口读写,在Windows 2000/XP下必须编写驱动程序,才能够实现。由于各种操作系统结构的不同影响了设备驱动程序的兼容性,为此微软公司在1997提出了一种全新的Windows驱动程序模型(WDM),并在推出Windows 2000操作系统时正式引入了这一技术。WDM以Windows

4、 NT4.0的内部结构为基础,同时引入了Windows 9x的即插即用特性,为存在于Windows 9x和Windows 2000操作系统中的设备驱动程序提供了一个统一的参考框架1。在Windows 98/Me,Windows 2000和更高版本的操作系统上运行的设备驱动必须是WDM驱动4。2 WDM驱动程序的基本结构可以把一个完整的WDM驱动程序看作一个容器,其中包含了许多子例程,操作系统调用这个容器中的例程来执行针对IRP(I/O请求包)的各种操作,图1表示了这一概念。基本驱动程序 I/O控制 分发例程DrvierEntryAddDeviceStartIoAdapterControlOnI

5、nterruptDpcForIsrDispatchPnpDispatchPowerDispatchWmiDispatchReadDispatchWriter 必须的驱动例程 处理排队请求应包括StartIo 如果设备有中断应包括OnInerrupt和DpcForIsr 对DMA操作应包括AdapterControl 可选的分发例程图1 WDM驱动程序可执行包中的内容2在每一个驱动程序中,都包括DriverEntry、AddDevice和几种IRP分发例程。需要对IRP排队的驱动程序一般都有StartIo例程;执行DMA传输的驱动程序应有一个AdaperControl例程;大部分能产生硬件中断的

6、设备,需要有一个中断服务例程(Interrupt Service Routine,ISR)和一个延迟过程调用(Deferred Procedure Call,DPC)例程。多数的驱动程序都还有几个支持不同类型IRP的分发例程。WDM开发人员的任务之一就是选择自己特定驱动中需要的例程2。3. 设备的创建和初始化驱动程序向操作系统显露名为DriverEntry的函数,DriverEntry例程只在驱动程序第一次被装入时执行一次,但是一个驱动程序可以被多个实际设备利用,所以WDM驱动程序有一个特殊的AddDevice函数,PnP管理器为每个设备实例调用该函数。创建设备可以在AddDevice函数中实

7、现,它的主要任务是为建立和启用的设备,建立一个符号链接名或者注册设备接口,将当前驱动程序添加到设备栈中。4. 硬件的访问PnP管理程序调用的AddDevice函数只初始化设备(及设备扩展)对象,并没有接触硬件,硬件资源的保留和配置在接受专门的IRP函数(和子函数)代码时执行。当驱动程序接收到PnP子码IRP_MN_START_DEVICE时,IRP堆栈列表内的两个字段AllocatedResourcesTranslated和AllocatedResources,列出分配的资源。用来描述这些资源的结构是CM_PARTIAL_RESOURCE_LIST类型,它包括一个CM_PARTIAL_RESO

8、URCE_DESCRIPTOR结构的计数数组,如图2所示。VersionRevisionCountTypeShareDispositionFlaguTypeShareDispositionFlagPartialDescriptors0PartialDescriptors1u图 2 部分资源列表数据结构2数组中每一个资源描述符都有一个Type成员,它表示所代表的资源的类型。主要有4个重要的共同体类型是Port(端口)、Interrupt(中断),Memory(内存),Dma(直接内存访问)。在接收到资源列表之后,应该存储资源信息,以便后面的使用。程序实现的部分代码如下:for (i = 0; i

9、 Count; i+, resource+, resourceTrans+) switch (resource-Type) case CmResourceTypePort: deviceInfo-PortWasMapped = FALSE; deviceInfo-PortBase = (PVOID)resourceTrans-u.Port.Start.LowPart; /I/O端口地址的基地址 deviceInfo-PortCount = resourceTrans-u.Port.Length; /端口长度 break;case CmResourceTypeMemory: 得到了设备的I/O地

10、址,就可以对设备进行读取了,在读写端口地址和内存时应该使用标准的内核读取例程,在WDM中应使用HAL宏,如:READ_PORT_UCHAR, WRITE_PORT_UCHAR等。这样就可以不用考虑不同操作平台的特性,也可以更好的适应Windows 2000多任务,多进程环境的要求。例如如果我们要写端口201h,端口资源的基地址是200h,实现程序可以如下:WRITE_PORT_UCHAR( (PUSHORT)(ULONG_PTR)pLDI-PortBase + nPort), *(PUSHORT)pIOBuffer ); /向端口写一个字节数据5. 硬件资源的分配硬件资源是在驱动程序装入时,根

11、据安装文件进行分配的,所以在要使驱动正常工作必须编辑自己的安装文件,安装文件是以inf为扩展名的文件,它包含了WDM设备驱动程序的制造商信息、要复制的文件列表、要创建的注册表项等。笔者编写的驱动用到的硬件资源占用240h243h的端口地址。所以在安装文件中,资源分配节如下:PortIO_Inst.NTCopyFiles=PortIO.CopyFilesLogConfig=PortIO.LC0 ;指向资源分配节PortIO.LC0 ;资源分配节ConfigPriority=DESIRED IOConfig=240-243INF安装文件向操作系统添加了硬件资源,硬件驱动的安装方法和其他的驱动(如:

12、声卡等)安装方法类似。当驱动程序收到“启动设备”(IRP_MJ_PNP的IRP_ MN_START_DEVICE的子码)时,驱动程序获得设备的硬件资源。6. 与应用程序的接口待添加的隐藏文字内容2物理设备驱动程序(.sys)动态链接库(.dll)应用程序(.exe)用户态的程序在访问驱动程序时,需要用到一些专用的API函数,由于这些函数参数比较多,所以可以开发一个动态链接库,使用户开发应用程序涉及不到底层驱动设备的操作,和使用普通API函数一样操作硬件。这样整个系统的结构如下:图3 系统软件结构 应用这分层的结构,用户程序可以通过dll读写设备。Dll提供给应用程序的接口函数,包括初始化设备,

13、关闭设备,读写端口等。初始化就是创建设备,并得到设备句柄,可以在dll中导出如下函数:extern C _declspec(dllexport) bool InitialIoport()hndFile = CreateFile( .IODev, GENERIC_WRITE, FILE_SHARE_WRITE, NULL,OPEN_EXISTING, 0, NULL); 关闭设备,只要关闭返回的句柄,如下:extern C _declspec(dllexport) void CloseIoport()CloseHandle(hndFile);写端口函数声明如下,函数调用DeviceIoContr

14、ol可见MSDN:extern C _declspec(dllexport) bool outportb(int address,int value)IoctlResult = DeviceIoControl(hndFile, IoctlCode &InputBuffer ,DataLength, NULL, 0, &ReturnedLength, NULL); /写端口命令处理读端口时,与上类似,不再祥述。extern C _declspec(dllimport) unsigned char inportb(int address)这样,在应用程序中加入自己的动态链接库后,就可以像在Wind

15、ows 98中使用函数_inp, _outp一样使用inportb, 和outportb, 来操作端口了。7. 结束语基于WDM驱动模型设计的驱动程序支持即插即用功能,可以稳定地在Windows 2000下运行,它是在PC机下进行数据采集的基础。Windows操作系统提供了良好的网络和数据库功能,所以在Windows下开发的控制系统可以更好的实现分布式的数据监测和控制,而且控制界面更容易设计。笔者应用此驱动程序在开发选路板驱动中得到应用。应用本文提出的方法可以实现接口友好的任意微机端口驱动。参考文献:1 尤晋元,史美林等。Windows操作系统原理。北京:机械工业出版社,2001。2 美 Walter Oney。 Programming the Windows Driver Model。 北京:北京大学出版社,2000。3 Microsoft cop.。How to Write a Windows XP Driver。2001。4 Microsoft cop.。DDK document。2001。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 建筑/施工/环境 > 项目建议


备案号:宁ICP备20000045号-2

经营许可证:宁B2-20210002

宁公网安备 64010402000987号