欢迎来到天天文库
浏览记录
ID:23881940
大小:56.00 KB
页数:6页
时间:2018-11-11
《windows2000设备驱动程序的研制开发》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、Windows2000设备驱动程序的研制开发引言:由于工作关系,我经常涉及PC机与外围设备接口的工作,从PC机这方面要做的工作看来,主要是通过接口处理外围设备的中断,通过I/O端口或内存地址与外设互相传递数据。从计算机原理的角度看,所要达到的目的很简单,那么如何编写程序完成上述功能呢?目前国内流行的PC操作系统有三种:DOS,odeDrivers-Reference章节),换言之,这些函数功能是所有内核模式的系统服务功能的子集。驱动程序由一系列相对独立的函数组成,由I/O管理器根据需要调用这些函数,对于一个需要处理中断的最简单的驱动程序也需要由以下几个函数构成:1.DriverEntry()
2、运行于PASSIVE_LEVEL驱动程序入口点,当驱动程序被手动或自动装入系统后,驱动程序从这点开始执行,主要用于定位硬件资源,建立指向其它驱动程序函数的指针等其它初始化工作。2.XxUnload()运行于PASSIVE_LEVEL用于驱动程序从系统卸出之前,释放由驱动程序占用的所有系统资源。3.XxIsr()运行于DIRQL中断服务程序。4.XxDpcForIsr()运行于DISPATCH_LEVEL中断服务程序后处理程序,以排队方执行不太关键代码的执行,由于排队机制及优先级,不会造成代码拥塞从而提高中断服务程序的响应并且提高系统总体I/O吞吐率。5.XxOpen()运行于PASSIVE_
3、LEVEL处理应用程序Win32函数CreateFile()请求。6.XxClose()运行于PASSIVE_LEVEL处理应用程序Win32函数CloseHandle()请求。7.XxDispatch()运行于PASSIVE_LEVEL处理应用程序Win32函数DevicEioControl()请求,通过一系列自定义命令,驱动程序与应用程序交换特定的信息。Windo.第二步,确定驱动程序的功能。驱动程序每当9号中断达到时,检查运行标志变量RunFlag(为一BOOL变量),如果等于TRUE,中断累积计数器counter(为一unsignedshort变量)增一,把这个值写入RAM地址D02
4、28H,再从这个地址读出,如果读出值等于写入值,把这个值写入I/O地址360H,这个地址的内容会驱动板卡上的LED显示,把写入值显示出来;如果读出值不等于写入值,设置运行标志变量FALSE。如果运行标志变量等于FALSE,什幺也不做,返回。第三步,定义驱动程序与应用程序的软件接口。本例定义两个接口命令:IOCTL_IOCardA_START:应用程序设置驱动程序内部的运行标志变量等于TRUE。IOCTL_IOCardA_READ:应用程序查询驱动程序内部的中断累积计数器的值。第四步,画流程图。这里列举本例实现的几个主要流程图,(图略)。系统传给驱动程序入口函数系统定义的‘设备驱动对象’DrO
5、bj,通过初始化这个对象的一些成员变量,把驱动程序其它函数与这个对象联系起来。ISA卡为非即插即用设备,事先把资源占用信息手工添加注册表如下:[HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesIOCardAparameters]"IRQ"=dd=TRUE;hTest=CreateFile(...);//打开设备DevicEioControl(hTest,//设备句柄IOCTL_IOCardA_START,//命令cmd,sizeof(BOOL),//输入缓冲区地址及大小NULL,0,c,NULL);CloseHandle(hTest
6、);//关闭设备上层应用程序通过以下程序段查询当前的中断计数器的值并存于变量p;p;c,NULL);CloseHandle(hTest);其中DeviceIoControl()执行后,操作系统调用IOCardADispatch()函数,如流程图所示,这个函数内部通过一个开关语句,根据命令执行相应的分支。驱动程序与应用程序通过此函数接口交换数据时,操作系统提供4种可选数据缓冲方式,本例由于数据I/O量比较小,故选用‘缓冲I/O’(METHOD_BUFFERED)。过程是,I/O管理器首先分配一个非分页池,它的大小为调用者输入缓冲区和输出缓冲区的较大者,第一段程序为sizeof(BOOL),第二
7、段程序为sizeof(unsignedshort),它的地址存到IRP(I/O请求包)的AssociatedIrp.SystemBuffer域中,然后把输入数据拷贝到这个池中,在第一段程序中cmd的值TRUE被拷贝到池中,这样驱动程序通过RtlCopyBytes()函数再把池中的值拷贝到驱动程序的RunFlag中。IOCardADispatch()函数执行完,I/O管理器把池中的内容拷贝到调用者的输出缓冲区,
此文档下载收益归作者所有