首页 > 文章中心 > 驱动程序

驱动程序范文精选

驱动程序范文第1篇

WIND

OMEGA驱动是一款针对ATI显卡的著名第三方驱动,相信很多读者都不会对其感到陌生。它的自动超频功能和简易的软改显卡功能受到了许多DIYer的追捧。加上不输官方驱动的性能和稳定性,甚至还可以提供比官方驱动更好的硬件兼容性而广受好评。其实,OMEGA驱动除了集成官方驱动以外,还提供了一些“副业”,善用这些“副业”可以让你在日常应用中更加事半功倍,比如在Windows系统下备份显卡B10S、随时监控硬盘温度以及监控系统硬件状态等多种实用的功能。

笔者在此就以0MEGA 3 8 23l版驱动为例进行讲解。注意,本文所介绍的功能需在安装并开启驱动程序附带的ATI TRAY TOOLS(下简称ATT)后方可使用。

提取显卡BIOS

实用指数:

作用:备份、刷新显卡BloS,显卡BIOS损坏后的还原。

不少显卡B10S修改软件都需要在纯DOs的环境下提取B10S,且不说命令行操作效率低,单是切换系统的时间就够你等待。有了OMEGA驱动就没这么麻烦啦!因为它在驱动中就集成了保存显卡BIOS的功能。

当ATT的功能开启后,在右下角的系统托盘中会出现一个红色的立方体标志。右键点击该标志,从弹出的菜单中依次选择“T001s&Options”“Dump V1deo B10S”,在指定了BlOS备份文件的保存路径之后,我们就可以将现有的B10S文件提取并储存下来了。

保存桌面图标的位置

实用指数:

作用:快速恢复你熟悉的桌面图标 这个功能可以看作“Ghost”备份。我们都习惯使用自定义的桌面图标设置,而这些图标的位置被打乱无疑是一件让人很郁闷的事情。所以,在你定义好自己的桌面图标之后,右键点击ATT的标志,依次选择“Tools&0ptIOnS”“Save Desktop Icon POSltlOnS”,确定后就完成了桌面图标的保存(图2、3)。当图标被打乱后,依次选择“Tools&Dptions”“Restore Desktop Icon Posltlons”,就可以将桌面设置还原到保存之前的状态了(图4)。

即时显示FPS

实用指数:

作用:即时显示游戏运行状况,可以作为游戏相关硬件性能测试的一个指标。

该功能在运行ATT后再运行需要调用DirectX或ODenGL的程序时,就会自动调用。当功能被调用之后,我们nr以看到在右上角会有黄色的数字,这就是显示出的FPS值,当这个数值低于25时会变成红色(图5)。

当然,如果你觉得它分散了你的注意力的话,也可以把它关掉。只需依次点击“Tools&Options”“On Screen Display”“Hide”(图6),就可以去掉在游戏中显示FPS的功能了。

显示硬盘温度

实用指数:

作用:监控并显示硬盘温度,防止硬盘过热产生故障。

监视硬盘的温度也是附加功能之一,我们可以在“Plugins”“Run Time Plug-ins”中进行监控选项的相关配置(图7)。

在弹出的窗口中找到“HDD Temperature”,选中后单击下方的“Enable”按钮后,再点击“Start”就可以开启这项功能了(图8)。

此时在系统托盘中会出现如图9所示的数字。以笔者的系统为例,我们可以看到其中一块硬盘的温度为38℃,另一块则无法检测(笔者估计是那块硬盘太老造成的),显示为0。

如果不想显示硬盘温度,点击图8中的“Stop”就行了,彻底关闭服务就直接选择“Disable”(原Enable的位置)即可。顺便说一下,在同一窗口中还可以设置CPU负载监视,即“CPU Load Meter”,不过这项功能不如Windows自带的任务管理器好用,就不多介绍了。

自定义快捷键

实用指数:

作用:一键运行特定的应用程序

和NVIDIA显卡驱动一样,通过OMEGA驱动我们也同样可以自定义快捷键。依次选择“Hot Keys”“Customize”可以进人陕捷键控制台。

要启用快捷键功能,需勾选上方的“Enable Hot Keys”,然后添加快捷键。点击下方的“Add”按钮,会弹出一个所示的窗口。

我们可以在左边看到一些诸如“载入预设方案“、。超频”以及“风扇控制”等很有意思的功能。不过作用最大的还是快捷运行应用程序功能,在此就以它来讲解。

点击左边最下面“Miscel[aneous”前面的“+”号,选择下方的“Start anapplication”,然后在右边的“H0t key”文本框中填入用于执行命令的组合键(或单键)。如果对设定的按键不满意,可以按键盘上的“Backspace”米清除。注意,在“Select Application”选项中需要填的就是你想要以此快捷键运行的程序,“Parameter”中可以填入应用程序是否需要以附加参数运行,如sw等。一切设置完成后,点“OK”就可以生效了。

屏幕截图

实用指数:

作用:抓取屏幕截圈

OMEGA驱动中还集成了截图功能。先要在“Tools&Options”“Gene ral Options”中进人“ScreenShOtS”选项卡设置储存路径和储存格式,再到“HotKeys”中进行快捷键设置。在添加快捷键的窗¨左边选择“Miscellaneous”“Make Screenshot'’,在右边空格中填入快捷键,点击“OK”后就可以使用定义好的快捷键截图了。

监视系统

实用指数:

作用:监控系统硬件状况 这是一个又好用又好玩的“副业”,我们可以通过这个功能来察看电脑应用过程的系统资源消耗以及硬件状况,从而可以直观地看出哪一部分的资源消耗最多,找到PC性能的瓶颈。

右键点击ATT图标,选择“Hardware”“Monitoring Graphs”,会弹出一个空白的窗口。

点击下方的"Add”按钮,添加一个视图,在这一页中可以设置折线图的资料。最为关键的设置是在“Sources”的选项卡里,我们可以看到各种可以监视的项目,如CPU时钟频率、内存频率、FPS以及空闲的显存容量等。

为了观察方便,我们还是针对每一个选项都设置一个图表比较好,同时监视多项的话,可以添加多个图表。在每一项后面有一个色块,点击它可以更换该折线的颜色。点“OK”就可以添加这个图表了,所示。

如果我们把鼠标移到图标中,可以查看相应时间轴的数值。要配置选项就在图表上点右键选择“Configure”进行设置,要删除该图表就选择“Delete"即可。

驱动程序范文第2篇

由于工作关系,我经常涉及PC机与设备接口的工作,从PC机这方面要做的工作看来,主要是通过接口处理设备的中断,通过I/O端口或内存地址与外设互相传递数据。从计算机原理的角度看,所要达到的目的很简单,那么如何编写程序完成上述功能呢?

目前国内流行的PC操作系统有三种:DOS,Win95/98系列,WindowsNT。DOS是单用户、单任务操作系统,由于PC机硬件处理速度不断提高,基于单用户、单任务的操作系统越来越不能充分发挥硬件的功能,现在只应用于一些老式PC及其它个别场合,有逐渐被淘汰的趋势;Win95/98系列和WindowsNT属于多任务操作系统,不论从其原理还是界面上看,这两种操作系统都比DOS有着无可比拟的优越性,这两种操作系统虽然在界面和操作上及其相似,但其内部实现的诸多方面有许多区别,有些区别是本质上的。Win95/98设计目标是针对一般家庭用户,安全性及可靠性存在许多薄弱环节,就可靠性而言,Win95/98系列不能很好的防止多任务环境中某个进程的非法操作导致系统中其它程序甚至整个系统的崩溃,而WindowsNT在这方面及其它诸多方面设计的相当严谨。这两种操作系统是Microsoft公司同一时期的产品,但针对不同的使用群,所以在一些重要场合及生产实践中应该选择WindowsNT作为计算机的操作系统,此外,从发展趋势来看,WindowsNT已经成为定型产品,具有相对稳定性。

在不同操作系统下编写驱动程序是有很大区别的,在DOS平台上,应用程序和设备驱动程序之间没有标准的接口,它们在外部表现为一个扩展名为EXE的文件,驱动程序的作用被柔和在应用程序中,这样,应用程序为了使用不同厂商的同一类设备,必须了解这些设备在接口上具体的硬件实现,同时,对于一个特定型号的硬件产品,所有支持它的应用软件中对于控制整个设备动作的这部分代码,可能被多次重写。这种情况不适应硬件及应用软件的飞速发展。Windows系统在这方面,进行了根本性改进,把控制设备动作的这部分代码独立出来,提出了设备驱动程序的概念,驱动程序是应用程序和硬件设备之间的一个桥梁,应用程序与驱动程序之间有明确的接口,应用程序通过与驱动程序交换信息,达到控制外设的目的。接口定义的操作是面向设备的,这就是说,在应用程序的设计中,并不用关心对外设操作的具体硬件实现,只是对驱动程序发出一系列指令既可;驱动程序接受来自上层应用程序的指示,具体操纵实际硬件,完成用户功能。具体实现上,Win95/98系列与WindowsNT又有所区别,WindowsNT是严格按照上述思路设计的;而Win95/98系列不那么严格,其支持上述思路,但同时应用程序也可以绕过驱动程序直接访问实际物理I/O,这样做,增加程序设计的灵活性,但同时,对系统可靠性造成一定隐患。这也正是Win95/98系列可靠性低于WinNT的原因之一。

WindowsNT设备驱动程序的组成原理

WindowsNT操作系统结构分为用户模式和内核模式,用户模式下的编程为应用程序的设计,而开发设备驱动程序,则属于内核模式下的编程,内核模式组件包括NTExecutive(ExXxx),内核(KeXxx),硬件抽象层(HalXxx)。其层次如图2-1所示,其中NTExecutive包括几个独立的软件组件,它们是系统服务接口(ZwXxx),对象管理器(ObXxx),配置管理器,进程管理器(PsXxx),安全监视器(SeXxx),虚拟空间管理器(MemXxx),本地进程调用,I/O管理器(IoXxx)。内核模式的系统服务并不是全部公开的,而是提供了一系列开发设备驱动程序需要的函数(上文括号内为函数形式,函数手册参见[2]Kernel-ModeDrivers-Reference章节),换言之,这些函数功能是所有内核模式的系统服务功能的子集。

驱动程序由一系列相对独立的函数组成,由I/O管理器根据需要调用这些函数,对于一个需要处理中断的最简单的驱动程序也需要由以下几个函数构成:

1.DriverEntry()运行于PASSIVE_LEVEL

驱动程序入口点,当驱动程序被手动或自动装入系统后,驱动程序从这点开始执行,主要用于定位硬件资源,建立指向其它驱动程序函数的指针等其它初始化工作。

2.XxUnload()运行于PASSIVE_LEVEL

用于驱动程序从系统卸出之前,释放由驱动程序占用的所有系统资源。

3.XxIsr()运行于DIRQL

中断服务程序。

4.XxDpcForIsr()运行于DISPATCH_LEVEL

中断服务程序后处理程序,以排队方执行不太关键代码的执行,由于排队机制及优先级,不会造成代码拥塞从而提高中断服务程序的响应并且提高系统总体I/O吞吐率。

5.XxOpen()运行于PASSIVE_LEVEL

处理应用程序Win32函数CreateFile()请求。

6.XxClose()运行于PASSIVE_LEVEL

处理应用程序Win32函数CloseHandle()请求。

7.XxDispatch()运行于PASSIVE_LEVEL

处理应用程序Win32函数DeviceIoControl()请求,通过一系列自定义命令,驱动程序与应用程序交换特定的信息。

WindowsNT使用一个抽象化的CPU优先级方案,IRQL代表中断请求级,任一时刻CPU总处在某一级上,这个数越大,表示当前的任务重要性越大,如表2-1所示,从上至下IRQL越来越小。所有上述驱动程序的函数及内核模式函数都必须运行于各自的IRQL级上,如果违反这一调用规定,会造成系统崩溃。例如,中断服务程序(XxIsr)运行于DIRQL及上,那幺在编写中断服务程序时,只能调用允许在这一级运行的内核模式函数(并不是所有内核模式函数都能运行于DIRQL级)。至于每个内核模式函数运行级别的说明,详见[2]Kernel-ModeDrivers-Reference章节。

WindowsNT是一多任务系统,许多设备的驱动程序同时存在系统中,这样各个设备所占用的资源(中断,I/O及RAM地址空间)很有可能冲突,如果设备驱动程序在运行之前不进行‘探测’而使用自己硬件设备的资源,有可能和系统内其它设备占用的资源冲突,后果不堪设想。WindowsNT通过注册表管理硬件资源的占用信息,作为内核模式信任的组件,驱动程序使用硬件资源之前必须遵循‘查询-申请-使用-释放’的原则

WindowsNT设备驱动程序的编写步骤与实例

现以一实际例子简要说明设备驱动程序的开发步骤,本例以CINRAD天气雷达测试卡实际应用为原型,加以简化、抽象。

第一步,了解被控设备的接口情况。

本例为一ISA卡,占用PC机9号中断,I/O地址360H及RAM地址D0228H分别一个字空间。

第二步,确定驱动程序的功能。

驱动程序每当9号中断达到时,检查运行标志变量RunFlag(为一BOOL变量),如果等于TRUE,中断累积计数器counter(为一unsignedshort变量)增一,把这个值写入RAM地址D0228H,再从这个地址读出,如果读出值等于写入值,把这个值写入I/O地址360H,这个地址的内容会驱动板卡上的LED显示,把写入值显示出来;如果读出值不等于写入值,设置运行标志变量FALSE。如果运行标志变量等于FALSE,什幺也不做,返回。

第三步,定义驱动程序与应用程序的软件接口。

本例定义两个接口命令:

IOCTL_IOCardA_START:应用程序设置驱动程序内部的运行标志变量等于TRUE。

IOCTL_IOCardA_READ:应用程序查询驱动程序内部的中断累积计数器的值。

第四步,画流程图。这里列举本例实现的几个主要流程图,(图略)。

系统传给驱动程序入口函数系统定义的‘设备驱动对象’DrObj,通过初始化这个对象的一些成员变量,把驱动程序其它函数与这个对象联系起来。

ISA卡为非即插即用设备,事先把资源占用信息手工添加注册表如下:

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\IOCardA\parameters]

"IRQ"=dword:00000009

"IOSPAN"=dword:00000004

"IOAdd"=dword:00000360

"RAMAdd"=dword:000d0228

"RAMSPAN"=dword:00000002

其中IOCardA以下各子键及其值为自定义,设备驱动程序利用相应函数检索出这些值。

(3)每个设备驱动程序可以创建若干系统定义的‘设备对象’,本例根据需要只创建了一个‘设备对象’Dev。‘设备对象’其中一个成员变量为指向一非分页的物理内存块DeviceExtension,这块内存大小及内容为用户自定义,由于Dev或DeviceExtension对象会被系统传给驱动程序的其它函数,这样驱动程序各函数通过访问这块内存区,实际上达到互相传递信息的功能。本例在这里存储设备硬件资源信息及RunFlag和中断计数器counter,这些数值在DriverEntry()初始化后,供驱动程序的其它函数使用。

图3-2为中断服务程序IOCardAIsr()流程图。操作系统接受中断,连同DeviceExtension等参数传给中断服务程序,中断服务程序利用这些参数,实现要求功能。

图3-3为IOCardADispatch()流程图,这个函数用于处理来自上层应用程序的命令。上层应用程序通过以下程序段设置驱动程序中RunFlag值为TRUE,从而启动中断服务程序开始计数。

BOOLcmd=TRUE;

hTest=CreateFile(...);//打开设备

DeviceIoControl(hTest,//设备句柄

IOCTL_IOCardA_START,//命令

&cmd,sizeof(BOOL),//输入缓冲区地址及大小

NULL,0,&c,NULL);

CloseHandle(hTest);//关闭设备

上层应用程序通过以下程序段查询当前的中断计数器的值并存于变量w中。

unsignedshortw;

hTest=CreateFile(...);

DeviceIoControl(hTest,

IOCTL_IOCardA_READ,//命令

NULL,0,

&w,sizeof(unsignedshort),//输出缓冲区地址及大小

&c,NULL);

CloseHandle(hTest);

其中DeviceIoControl()执行后,操作系统调用IOCardADispatch()函数,如流程图所示,这个函数内部通过一个开关语句,根据命令执行相应的分支。驱动程序与应用程序通过此函数接换数据时,操作系统提供4种可选数据缓冲方式,本例由于数据I/O量比较小,故选用‘缓冲I/O’(METHOD_BUFFERED)。过程是,I/O管理器首先分配一个非分页池,它的大小为调用者输入缓冲区和输出缓冲区的较大者,第一段程序为sizeof(BOOL),第二段程序为sizeof(unsignedshort),它的地址存到IRP(I/O请求包)的AssociatedIrp.SystemBuffer域中,然后把输入数据拷贝到这个池中,在第一段程序中cmd的值TRUE被拷贝到池中,这样驱动程序通过RtlCopyBytes()函数再把池中的值拷贝到驱动程序的RunFlag中。IOCardADispatch()函数执行完,I/O管理器把池中的内容拷贝到调用者的输出缓冲区,在第二段程序中,驱动程序通过RtlCopyBytes()函数把counter的值拷贝到池中,从而最终传递到应用程序变量w中。

第五步,编程。在编写设备驱动程序的同时,要编写一个简单的应用程序用于测试设备驱动程序的一些功能。

第六步,驱动程序的载入。

驱动程序C语言源程序经过编译、连接生成扩展名为SYS的文件,本例为IOCardA.sys,把这个文件拷贝到\WINNT\system32\drivers\系统目录下,同时手工添加如下信息到注册表:

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\IOCardA]

"ErrorControl"=dword:00000001

"Start"=dword:00000003

"Type"=dword:00000001

要保证IOCardA子键名与驱动程序文件名一致,其中Type=1表示此驱动程序为内核模式驱动程序,Start=3表示此驱动程序手动载入,ErrorControl=1表示当驱动程序发生错误时,日志记录错误并显示一个消息框。这样当Windows重新启动后,通过使用控制面板中的Device小应用程序,从列表中找到IOCardA设备名,按Start按钮,于是,设备驱动程序就驻留内存并在底层开始工作了。

第七,调试。设备驱动程序没有界面,完全在系统底层运行,为了观察驱动程序的运行状态,WindowsNTDDK提供windbj.exe程序用于设备驱动程序的调试,调试设备驱动程序需要两台CPU体系结构完全相同的计算机,一台为‘宿主机’,运行windbj.exe程序,另一台为‘目标机’,运行设备驱动程序,两台计算机用串口线连好,进行一系列软件设置(参见[1]第17章),就可以开始调试了,从‘宿主机’可以控制及观察‘目标机’上驱动程序的运行情况。最常用的调试手段是在驱动程序中必要的位置加入DbgPrint()函数,这个函数可以把指定信息输出到‘宿主机’windbg.exe窗口中,通过分析这些信息,可以了解驱动程序当前的运行情况。

结束语

WindowsNT是一个复杂而严密的系统,驱动程序的开发不可避免的涉及现代操作系统理论及其它许多计算机理论,内涵相当广泛,本文围绕着开发实践从一定深度探讨了WindowsNT设备驱动程序开发最基本的知识及一般方法,希望对读者有所帮助,对于复杂,特殊应用的实现及编程技巧,有待于读者在各自实际应用中不断探索。

参考文献

驱动程序范文第3篇

关键词:TCD142D;驱动;CCD

中图分类号:TP311.1 文献标识码:A文章编号:1007-9599 (2010) 06-0000-01

TCD142D Driver Program Design

Xu Jing,Liang Hua

(Electronic&Information Institute of Nanchang Technology College,Nanchang330044,China)

Abstract:This research is mainly about the driver problems of TCD142D device using MCU.We use the KEIL software programs to compile and debug the program,achieving a better effect.

Keywords:TCD142D;Driver;CCD

一、绪论

TCD142D是一种电荷耦合器件(CCD,Charge Coupled Deviee),是一种以电荷包的形式存储和传递信息的固体成像器件。CCD作为一种光电转换器件,由于其具有精度高、分辨率好、性能稳定等特点,目前广泛应用于图像传感和非接触式测量领域。在CCD应用技术中,最关键的两个问题是CCD驱动时序的产生和CCD输出信号的处理。本文主要研究其驱动时序的产生问题。

由于在CCD应用系统中,一般都要用到微处理器,所以若采用“软件驱动”法,则无需增加硬件,在电路结构上最为简单,系统成本也最低,本文主要利用单片机,通过程序编程直接在I/O口上输出所需的各路驱动脉冲信号,是由程序指令的延时或者定时器中断产生,这种驱动时序产生方法的特点是调节时序灵活方便,编程简单,可在线调整驱动频率。

二、系统的设计

该系统由4部分组成:电源模块、单片机控制模块、电平转换模块、TCD142D电路。其中,电源系统在设计上选用常用的LM78/79系列三端稳压块来实现。单片机则选用常用的ATMEL公司生产的AT89S51单片机,对整个系统进行时序控制,编程输出的时序信号送入电平转换及驱动模块,该模块完成对TTL电平的转换,使得输出信号满足TCD142D的输入要求,该模块由高速驱动芯片DS0026来实现。TCD142D则只要负责接收前级输出的信号,并输出像元数据。

(一)TCD142D简介

TCD142D的驱动电路有4路脉冲,即SH、Ф1、Ф2、RS四路。SH是光电荷转移脉冲,其下跳沿即每幅图象输出的起始点。Ф1、Φ2为两相交变脉冲电压(相位差为90°),它们将转换到移位寄存器上的光电荷向输出极传递。RS为输出极复位脉冲,它可清除输出极输出一个单元的电荷后所剩电荷,以保证下一个单元的电荷电压的正确输出。

(二)TCD142D驱动脉冲的实现

在单片机89S51产生ΦSH、Φ1、Φ2、ΦRS四路驱动脉冲的作用下,TCD142D输出OS信号。显然,可以用单片机89C51的一个8位锁存输出口取其中的4位按照波形要求变化输出数据,这四位是1或者是0就决定了它们是高电平还是低电平,从而产生这四路驱动信号。

图1驱动信号波形的六个状态

图1中TCD142D 驱动信号波形图中把一个周期分为6个状态,在图中用虚线把各个状态转变点标记出来。可以看到,每经过1/6周期或者是1/3周期,单片机就要输出新的数据.既然使用单片机来驱动CCD,那么就要考虑单片机的输出脉冲频率与CCD工作脉冲的匹配问题.TCD142D的时钟范围是0.1~20MHz,可以看出时钟频率的最小值要求是0.1MHz。AT89S51单片机的最高工作频率是24MHz,可达到设计要求。仔细研究CCD时序的一个周期中的六次状态变化,安排好单片机口输出与CCD信号的对应关系。设计了如下的程序:

LOP:MOV P1,#0EH

NOP

NOP

NOP

CLR P1.1

MOV P1,#0BH

NOP

NOP

JBC P1.1,LOP

在程序中,执行完第一条指令后P1口输出时长为2μs的数据0EH,在其后的循环程序较多的使用了单机器周期指令和空操作指令,最后一条指令是双机器周期指令,这条指令既输出两个机器周期的0BH,又返回了循环程序。由TCD142D时序图可知,1061个移位脉冲周期后就要脱离循环,而进入下一过程,因此在程序中可以采用中断技术。把单片机内部的定时/计数器置成计数方式,计数初值设为1061,把Φ1的输出接至计数器输入端,对Φ1信号的下降沿进行计数。在计数器计满1061后便自动向单片机申请中断。

三、总结

用单片机产生的CCD驱动信号,在硬件设计上只需要在单片机的一个口的四位输出加上电平转换电路后接往CCD对应管脚.结构简单、可靠。其软件设计由于采用了循环程序及中断技术,总共只需要30多条指令,十分简单,这样产生的移位脉冲频率可达到200kHz左右,符合线阵TCD142D的工作要求。对于不同型号的线阵CCD,只要适当调整时序及程序即可得到需要的驱动时序。

参考文献:

驱动程序范文第4篇

对于使用大厂家芯片如Realtek、NVIDIA制造的硬件,这些厂商会定期将通过认证的驱动发送到微软服务器上,因此我们只要使用设备管理器或者自动更新组件即可升级驱动。比如要更新网卡驱动,只要在设备管理器中打开网卡属性设置窗口,然后点击“更新驱动程序”,接着在打开的窗口点击“自动搜索更新的程序软件”,如果微软更新服务器上有新的驱动文件,系统就会自动下载更新。

优点:安全性高,可以获得通过

微软认证的WHQL驱动

使用专业软件自动更新

系统自带的更新只能一个个进行,如果你要批量更新驱动,还可以借助驱动精灵2013来完成,它可以自动扫描、一键完成下载更新。由于这里升级的是官方驱动,不仅驱动程序主文件得到升级,而且扩展硬件的功能。比如同方K420自带的无线网卡是RTL8187芯片,默认在Windows 8即可使用,但通过上述方法升级到Realtek官方驱动后,就能轻松地在图形化界面下将网卡模拟为热点,只要在管理程序中勾选“Soft Enable”即可。

优点:操作简单,可批量更新本机所有驱动,极大地扩展硬件的性能

什么是微软的WHQL认证

由于硬件驱动程序运行在系统底层,如果其设计不当很容易导致系统崩溃。为了保证系统的稳定性,微软推出一项基准有偿认证制度,即WHQL(Windows Hardware Quality Lab,微软操作系统硬件质量实验室认证),主要对硬件厂商提供的驱动与Windows的兼容性和稳定性进行测试。要查看安装的驱动是否通过认证,可查看驱动程序文件的详细信息,通过认证的驱动文件前面都有Designed for Windows标志,数字签名者是微软公司。

驱动程序范文第5篇

这归结于优化的功效,很多玩家都可以有针对性地对游戏进行优化设置,调整系统、优化资源,同时对游戏进行设置上的更改,寻找最佳的平衡点。

现在,我们来尝试针对NVIDIA及ATI两种主流显卡品牌的驱动程序进行优化说明,来看看它们有什么秘密吧!

ATI 提高《Doom》运行速度有技巧

如果你想玩《Doom》一类采用OpenGL的游戏,尤其是当你的电脑使用ATI显卡时,你必定会感到很烦恼。OpenGl性能不强使得ATI的显卡在以《Doom》为首的OpenGL游戏中一向表现不佳。因此,针对OpenGL部分的调节非常必要,尽可能提高这方面的性能是优化ATI显卡驱动程序的重要方向之一。

切换到ATI催化剂驱动程序的OpenGL选项卡上,选中“主要设置”的“自定义设置”,然后进行细节调整。将“纹理选项”和“Mipmap”的拉杆向左拉到“性能”上,这样可以保证在不明显降低画面质量的情况下使OpenGL游戏速度得到保证,同时将“等待垂直同步信号”调整成“始终为关”。

要想将ATI显卡的潜力进行最大化的挖掘,还要进行自定义设置。勾选“使用自定义设置”项后,再点击“自定义”按钮就可切换到自定义设置页面。在其中“消除混叠”其实就是指全屏抗锯齿,在这里,如果你的显卡是低于X1000系列的,那么最好选择2×或者干脆关闭。但是,最高级的显卡也不要妄想开启6×,这时根本无法体验游戏乐趣了。

NVIDIA 让秘密大白于天下

相比之下,NVIDIA的优化设置更为科学,不仅有预置的优化方案,也有适合高级玩家的细节调整。

先说简单的方法,在NVIDIA的ForceWare驱动程序中提供了很多游戏、应用程序的优化设置方案,当你想运行某个游戏前,只要在驱动控制面板中选中相应的优化方案就可以了。驱动中的方案会不定期进行调整、添加,即便很多新的游戏,也会在短期内拥有相应的预置优化方案。

当然,还是有很多玩家不会满足于预置方案,自主优化是另外一种选择。其中最能影响性能及兼容性的选项莫过于“Anisotropic filtering”,即各向异性过滤了。这个选项在开启时会让画面更加精细,但是,它还带来了性能大幅度下降、兼容性不佳的“副作用”,所以,如果你的显卡并不是非常新,但又想玩新游戏,不如把这个选项关闭,以获得更好的运行速度。

驱动程序范文第6篇

Q:我有一台旧的台式机,一块闪存盘不管是插入机箱前置插口还是后置插口,都无任何反应,打开设备管理器发现USB设备项旁边都是黄色感叹号。请问,这该如何解决?

A:出现这样的问题后,可以先考虑将黄色感叹号的USB设备项全部删除,让系统自动重新搜索并安装这些设备驱动,看是否能够解决问题。另外,也有因为主板上的电子元件出现老化等问题而导致无法识别的,或者是USB接口堆积灰尘过多,或者供电不足等,也有可能导致这样的问题出现,这类硬件故障,对于没有经验的用户来说,只能是送专业维修点维修了。

修改应用商店程序的默认安装位置

Q:Windows 8系统中,通过应用商店下载安装的程序都被默认安装到C:\Program Files\WindowsApps,我想将其安装到其他分区中。请问这该如何设置?

A:首先按Win+R键调出运行对话框,输入“regedit”并回车,打开注册表编辑器,定位到HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Appx,然后右击“Appx”项,在“权限”选项中先赋予当前账户的修改权限,再将其右侧的“PackageRoot”值修改成你需要指定的其他分区,作为新的安装位置即可。

找回Windows 8的桌面“回收站”

Q:我平时删除文件时习惯将文件直接拖放到桌面的回收站中,今天发现桌面上的回收站图标不见了。请问,如何找回桌面的回收站图标?

A:只要右击桌面空白处,选择“个性化”,然后在打开的窗口中选择“更改桌面图标”,在打开的窗口中勾选“回收站”选项,确认即可。

64位系统如何选择软件

Q:我安装的是64位的Windows 8系统,在选择软件时,据说有的软件选择32位的比64位的更稳定,而有的则需要选择64位的。请问,64位系统到底该如何选择软件?

A:正常情况下,如果软件本身没有额外的插件程序,64位系统下使用64位版本的软件效果可能更好些。不过有些软件会有很多第三方插件程序(如Office、播放器、浏览器等软件),而这些第三方插件程序的开发商各不同,使用的规则也不相当,如果平时喜欢使用第三方插件程序,那就考虑选用32位版本,避免因为插件版本跟不上而导致各种故障。

用SSD硬盘总是死机

Q:我有一块64位的SSD硬盘,只安装了Windows 8系统,但最近在每天早晨开机时,都会不定时死机,只有强制关机后再开才能恢复正常。请问这是什么原因?

驱动程序范文第7篇

第一步,安装操作系统后,首先应该装上操作系统的ServicePack(SP)补丁。我们知道驱动程序直接面对的是操作系统与硬件,所以首先应该用SP补丁解决操作系统的兼容性问题,这样才能尽量确保操作系统和驱动程序的无缝结合。

第二步,安装主板驱动。主板驱动主要用来开启主板芯片组内置功能及特性,主板驱动里一般是主板识别和管理硬盘的IDE驱动程序或补丁,比如Intel芯片组的INF驱动和VIA的4in1补丁等。如果还包含有AGP补丁的话,一定要先安装完IDE驱动再安装AGP补丁,这一步很重要,也是很多造成系统不稳定的直接原因。

第三步,安装DirectX驱动。这里一般推荐安装最新版本,目前DirectX的最新版本是DirectX9.0C。可能有些用户会认为:“我的显卡并不支持DirectX9,没有必要安装DirectX9.0C”,其实这是个错误的认识,把DirectX等同为了Direct3D。DirectX是微软嵌在操作系统上的应用程序接口(API),DirectX由显示部分、声音部分、输入部分和网络部分四大部分组成,显示部分又分为DirectDraw(负责2D加速)和Direct3D(负责3D加速),所以说Direct3D只是它其中的一小部分而已。

而新版本的DirectX改善的不仅仅是显示部分,其声音部分(DirectSound)――带来更好的声效;输入部分(DirectInput)――支持更多的游戏输入设备,并在这些设备的识别与驱动上更加细致,充分发挥设备的最佳状态和全部功能;网络部分(DirectPlay)――增强计算机的网络连接,提供更多的连接方式。只不过是DirectX在显示部分的改进比较大,也更引人关注,才忽略了其他部分的功劳,所以安装新版本的DirectX的意义并不仅是在显示部分了。当然,有兼容性问题时另当别论。

第四步,这时再安装显卡、声卡、网卡、调制解调器等插在主板上的板卡类驱动。

第五步,最后就可以装打印机、扫描仪、读写机这些外设驱动。

驱动程序范文第8篇

关键词:TMS320DM642;DSP/BIOS;类/微型驱动模型;GIO;帧视频模块

中图分类号:TP391 文献标识码:B 文章编号:1004373X(2008)1517404

Development of Video Port Driver Based on DSP/BIOS Device Driver Model

YAN Xinzhong,LIU Zhe

(School of Electronic Information and Automation,Tianjin University of Science & Technology,Tianjin,300222,China)

Abstract:This paper takes TMS320DM642 DSP for example and introduces a method of programming the device driver,which based on DSP/BIOS Class/Mini driver model.The Class/Mini driver model is divided into two layers.One is device-independent layer and the other is device-specific layer.This architecture makes it easier to program the device driver.The application uses class driver API to call the mini driver function indirectly in order to control the peripheral pared with the traditional software development,the driver development based on the two-layer device driver model improves efficiency and increases compatibility and portability.

Keywords:TMS320DM642;DSP/BIOS;class/mini driver model;GIO;frame video model

通过给外部设备编写驱动程序是一种有效的控制外设的方法。随着DSP的应用越来越广泛,DSP实时系统的日趋复杂及新技术的出现,DSP处理器所连接的外部设备也是种类繁多,各不相同,而每一个外设都需要一个特定的驱动程序来支持外设的正常工作,这就要为每一个外设编写驱动程序,这是一项十分繁杂的工作。如何能够使系统开发人员从这些编写繁杂的驱动程序工作中解脱出来,进而能够专心投入到应用程序的开发中呢?TI公司提出了基于DSP/BIOS的设备驱动模型,该模型分为两层:类驱动即与硬件不相关的层和微型驱动即与硬件相关的层。使用这种结构,应用程序只需调用类驱动的API函数,通过类驱动使用微型驱动,用微型驱动来控制外设。这种结构,将驱动程序合理分层,使得驱动程序模块化,可移植性、复用性大大增强,缩短了驱动程序的开发时间。

1 DSP/BIOS设备驱动模型

1.1 类/微型驱动模型

DSP/BIOS是TI公司所设计开发的一个尺寸可裁剪的实时多任务操作系统内核,通过使用DSP/BIOS提供的丰富的内核服务,开发者能快速地创建满足实时性能要求的精细复杂的多任务应用程序。为了使开发设备驱动更加简单方便,提出了DSP/BIOS Device Driver Kit,定义了标准的设备驱动模型,一种将设备驱动分为与硬件无关和与硬件相关的双层结构,这样就使开发驱动程序不像以前那样复杂了,为开发者提供了便利。这两层结构称为“类/微型驱动模型”[1],它们每一层都有各自通用的接口,所以相似设备驱动程序的主要部分可以复用,驱动代码的移植成为可能,使开发驱动的过程大大简化。

与硬件无关的层称为类驱动(Class Driver),它处在应用程序与微型驱动之间,提供对多线程I/O请求的串行化和同步,并且维护设备数据缓冲区,向上提供API接口供应用程序调用,向下通过适配层与微型驱动相连,实现API接口函数到微型驱动层的映射。

与硬件相关的层称为微型驱动(Mini-driver),它处在类驱动与芯片支持库(Chip Support Library)之间,对于类驱动的接口是统一的,即每一个微型驱动都为类驱动和DSP/BIOS设备驱动管理提供了标准接口。微型驱动采用芯片支持库(CSL)管理设备的寄存器、内存和中断资源[2]。但由于硬件是千差万别的,所以微型驱动对底层硬件的操作是根据硬件的不同而不同的。对于完成同样功能的不同外设,只需稍加修改微型驱动,而不需重新编写驱动程序,就可以实现驱动程序的移植与复用,使驱动程序的开发过程大大简化。类/微型驱动模型结构如图1所示。

1.2 类驱动

通过将应用软件,驱动程序分层之后,可以看到,位于顶层的应用程序并不直接与微型驱动产生联系,而是通过类驱动与微型驱动连接。每一种类驱动向上层应用程序提供一个API接口,并且与微型驱动接口进行通信。

DSP/BIOS定义了三种类驱动:流输入输出模块(SIO),管道管理模块(PIP),通用输入输出模块(GIO)。其中,SIO和PIP分别需要使用适配器DIO和PIO来与微型驱动进行通信。SIO/DIO是基于流的I/O模型,使用异步方式来操作I/O,对于数据的读写、处理可以同时进行。PIP/PIO是基于管道的I/O模型,每个管道维护着一个被划分为多个大小相同的帧的缓冲区。GIO类驱动采用基于流的同步I/O数据传输模式,适合大流量数据的传输,更适合文件系统。与SIO/DIO和PIP/PIO不同,GIO包含内置的IOM(I/O Manager输入输出管理)适配层,可以直接与微型驱动进行通信。

GIO模块与其他两个模块相比,有一个很重要的特性,就是可以扩展API函数支持新的应用领域,这样就实现了对GIO类驱动的扩展。这种可扩展API的特性正好可以用在视频驱动开发方面。例如这种扩展可以满足视频设备存储区的需要。另外,在提供了视频驱动和应用程序之间的视频数据同步机制之后,这种扩展也能够允许使用一个单独的调用来“交换”视频缓冲区。这种交换缓冲区的机制对于实时视频信号的采集与显示是十分重要的。所以,在视频驱动中,我们采用通用输入输出模块GIO。应用程序可以直接地调用GIO API函数和IOM微型驱动程序进行交互,这些GIO API就可以看作是类驱动。GIO类驱动接口如图

2所示。

GIOcreate会为一个特定的IOM通道实例创建一个GIO对象,这是类驱动使用微型驱动的第一步,首先创建对象及IOM通道,然后在此通道上进行数据传输工作。其结构体类型为GIOObj:

Typedef struct GIOObj{

IOMFxn *fxns;//指向IOM函数表fxn

Uns mode;//通道的使用模式 IOMINPUT IOM

OUTPUT IOMINOUT三种模式

Uns timeout;//模块调用所用时间

IOMPacket syncPacket;//只用于同步操作的IOMPacket

QUEObj freeList;//用于异步操作,存放在类与微型驱动

之间使用的任何IOMPacket

Ptr syncObj;//同步对象的隐性指针

Ptr mdChan;//微型驱动通道对象指针

}GIOObj,*GIOHandle;

1.3 微型驱动

微型驱动主要通过一些函数来完成对外部设备的直接控制。只要微型驱动创建了规定的函数,应用程序就可以方便地通过DIO适配模块、PIO适配模块或(和)GIO类驱动调用[2]。

例如:GIOcreate被调用时,会运行mdCreateChan来创建一个通道。

这些微型驱动函数包括:mdBindDev/mdUBindDev(绑定/删除通道函数):在程序建立接口时调用,完成设备的初始化硬件设备/在程序结束时调用,卸载设备。mdCreateChan/mdDeleteChan(创建/删除通道):需要在应用程序与设备实例之间创建一个逻辑通信通道,用于交换驱动数据。应用程序可创建一个或多个逻辑通道,微型驱动用通道对象来代表这些通道。这两个函数就是用来分配和释放通道对象。mdSubmitChan(递交I/O请求):该函数处理传递给它的IOMPacket结构体中的命令代码(cmd),根据命令代码,完成相应的处理或返回错误代码。ISR(服务设备中断并完成I/O操作):IOM微型驱动在中断的ISR中将以处理完的IOMPacket请求出队,启动下一次传输或服务请求,调用类驱动的回调函数与应用程序进行同步,并返回出队的IOMPacket。mdControlChan(控制设备):用来操作外部设备。

这些微型驱动的函数入口放在接口表(IOMFxns)中,供适配模块或GIO类驱动调用。

2 TMS320DM642视频驱动

下面以TMS320DM642芯片为例,介绍有关TMS320DM642视频采集与显示的驱动程序的开发。通过编写驱动程序,完成视频信号的实时采集与显示功能。TMS320DM642是TI公司推出的一款专门用于视频/图像处理的定点数字信号处理器,它基于C64x内核,带有3个可配置的视频端口,与视频采集芯片直接相连,无需外加逻辑电路或FIFO缓存,只需编写相关解编码芯片的驱动程序,就可以完成视频信号的采集与显示。在这里使用的解码、编码芯片分别为PHILIPS SAA7115和SAA7105。

2.1 视频类驱动

在视频驱动程序结构中,为了最大程度地提高视频驱动代码的复用性和通用性,将类驱动又划分为两层结构[3],其中上层为FVID模型,它是在DSP/BIOS GIO类驱动之上的简单封装,下层是GIO类驱动程序。GIO类驱动提供独立的、一般的API函数集并且为微型驱动提供广泛的服务,而上层的FVID模型向上层的视频采集、显示结构提供定制的API函数。

在视频驱动中,主要是通过调用FVID模块函数来完成类驱动代码的编写工作。FVID主要有以下几个API函数:FVIDcreate:分配并初始化通道对象;FVIDcontrol:向微型驱动发送控制命令;FVIDalloc:向应用程序分配视频端口缓冲区;FVIDexchange:交换缓冲区;FVIDfree:释放缓冲区;FVIDdelete:删除通道对象。

在配备视频接口的设备驱动时,至少指定它要开设3个以上的视频缓冲区(FVID模型中,默认分配3个缓冲区)[4],帧缓冲区通过FVIDalloc(),FVIDfree(),FVIDexchange()三个函数在应用程序与驱动之间交换。

2.2 视频微型驱动

视频微型驱动也分为两层结构[3],上层为通用视频端口层部分,下层为指定编解码芯片微驱动层部分,它们通过外部设备控制接口(External Device Control,EDC)实现对芯片的操作。这种微驱动结构的好处是,当使用不同的芯片时,只需修改指定编解码芯片微驱动那一部分,不需将整个微驱动重新编写,使得驱动的复用性大大增强。

视频驱动程序模型如图3所示。

2.3 TMS320DM642视频驱动设计步骤

2.3.1 注册微型驱动

由于应用程序、类驱动最终都是要通过微型驱动的函数来完成对外部设备的直接控制,所以驱动程序设计的第一步就是要在DSP/BIOS Config中的Input/Output->Device Drivers->User-Defined Devices项目添加设备并注册微驱动,进行属性的设置[5],并指明IOMFxns函数表地址和设备参数地址,如图4所示。

DSP/BIOS会在内部维护一个“设备表”,其中包含User-Defined Devices对象进行配置的设备实例。

2.3.2 编写类驱动代码

FVID函数会在设备表中查找已注册的微驱动,并调用微驱动函数完成对外部设备的操作控制。

通常,首先利用FVIDcreate函数完成分配并初始化通道对象,返回值为设备实例句柄,这个句柄用于后续其他FVID函数调用这个已经创建的通道。然后调用FVIDcontrol函数向微型驱动发送控制命令,如配置编解码器,发送开始采集或显示图像的控制命令。然后利用FVIDalloc分配缓冲区,接着应用程序将缓冲区的数据进行复制的搬移工作,当应用程序完成对缓冲区数据的采集后,调用FVIDexchange来交换缓冲区,保证视频数据能够实时地、源源不断地供应用程序使用。

过程的流程图如图5所示。

下面是简单的视频采集显示驱动的部分实现代码:

FVIDHandle disChan;//定义显示句柄

FVIDHandle capChan;//定义采集句柄

capChan = FVIDcreate("/VP0CAPTURE/A/0",

IOMINPUT,&status,(Ptr)&EVMDM642vCapParamsChan,NULL);//创建采集通道

disChan = FVIDcreate("/VP2DISPLAY",

IOMOUTPUT,&status,(Ptr)&EVMDM642vDisParamsChan,NULL);//创建显示通道

FVIDcontrol(disChan,VPORTCMDEDCBASE + EDCCONFIG,

(Ptr)&EVMDM642vDisParamsSAA7105);

驱动程序范文第9篇

论文摘要:在目前流行的windows操作系统中,设备驱动程序是操纵硬件的最底层软件接口。为了共享在设备驱动程序设计过程中的经验,给出设备驱动程序通知应用程序的5种方法,详细说明每种方法的原理和实现过程,希望能够给设备驱动程序的设计者提供一些帮助。

为了保证操作系统的安全性和稳定性以及应用程序的可移植性,windows操作系统不允许应用程序直接访问系统的硬件资源,而是必须借助于相应的设备驱动程序。设备驱动程序可以直接操作硬件,如果应用程序和设备驱动程序之间实现了双向通信,也就达到了应用程序控制底层硬件设备的目的。它们之间的通信包括两个方面:一方面是应用程序传送给设备驱动程序的数据;另一方面是设备驱动程序发送给应用程序的消息。前者的实现较容易,通过createfile()函数获取设备驱动程序的句柄后,就可以使用win32函数,如deviceiocontrol()、readfile()或writefile()等实现应用程序与设备驱动程序之间的通信。后者的实现远比前者复杂,同时介绍这方面情况的文章较少。这不等于说它不重要,相反,它在有些应用场合发挥着重要的作用。设备驱动程序完成数据的采集工作后,需要马上通知应用程序,以便应用程序能够及时将数据取走并进行处理。诸如此类情况,不一而足。

鉴于设备驱动程序通知应用程序的重要性,本人结合一些经验,对它进行了总结,归纳出5种方法:异步过程调用(apc)、事件方式(vxd)、消息方式、异步i/o方式和事件方式(wdm)。下面分别说明这几种方式的原理,并给出实现的部分源代码。

1 异步过程调用(apc)

win32应用程序使用createfile()函数动态加载设备驱动程序,然后定义一个回调函数backfunc(),并且将回调函数的地址&backfunc()作为参数,通过deviceiocontrol()传送给设备驱动程序。设备驱动程序获得回调函数的地址后,将它保存在一个全局变量(如callback)中,同时调用get_cur_thread_handle()函数获取它的应用程序线程的句柄,并且将该句柄保存在一个全局变量(如appthread)中。当条件成熟时,设备驱动程序调用_vwin32_queueuserapc()函数,向win32应用程序发送消息。这个函数带有三个参数:第一个参数为回调函数的地址(已经注册);第二个参数为传递给回调函数的消息;第三个参数为调用者的线程句柄(已经注册)。win32应用程序收到消息后,自动调用回调函数(实际是由设备驱动程序调用)。回调函数的输入参数是由设备驱动程序填入的,回调函数在这里主要是对消息进行处理。

2 事件方式(vxd)

首先,win32应用程序创建一个事件的句柄,称其为ring3句柄。由于虚拟设备驱动程序使用事件的ring0句柄,因此,需要创建ring0句柄。用loadlibrary()函数加载未公开的动态链接库kernel32.dll,获得动态链接库的句柄。然后,调用getprocaddress(), 找到函数openvxdhandle()在动态链接库中的位置。接着,用openvxdhandle()函数将ring3事件句柄转化为ring0事件句柄。win32应用程序用createfile()函数加载设备驱动程序。如果加载成功,则调用deviceiocontrol()函数将ring0事件句柄传给vxd;同时,创建一个辅助线程等待信号变成有信号状态,本身则可去干其它的事情。当条件成熟时,vxd置ring0事件为有信号状态(调用_vwin32_setwin32event()函数),这马上触发对应的ring3事件为有信号状态。一旦ring3事件句柄为有信号状态,win32应用程序的辅助线程就对这个消息进行相应的处理。

3 消息方式

win32应用程序调用createfile()函数动态加载虚拟设备驱动程序。加载成功后,通过调用deviceiocontrol()函数将窗体句柄传送给vxd,vxd利用这个句柄向窗体发消息。当条件满足时,vxd调用shell_postmessage()函数向win32应用程序发送消息。要让该函数使用成功,必须用#define来自定义一个消息,并且也要照样在应用程序中定义它;还要在消息循环中使用on_message()来定义消息对应的消息处理函数,以便消息产生时,能够调用消息处理函数。shell_postmessage()函数的第一个参数为win32窗体句柄,第二个参数为消息id号,第三、四个参数为发送给消息处理函数的参数,第五、六个参数为回调函数和传给它的参数。win32应用程序收到消息后,对消息进行处理。

4 异步i/o方式

win32应用程序首先调用createfile()函数加载设备驱动程序。在调用该函数时,将倒数第2个参数设置为file_attribute_normal|file_flag_overlapped,表示以后可以对文件进行重叠i/o操作。当设备驱动程序文件创建成功后,创建一个初始态为无信号、需要手动复位的事件,并且将这个事件传给类型为overlapped的数据结构(如overlapped)。然后,将overlapped作为一个参数,传给deviceiocontrol()函数。设备驱动程序把这个i/o请求包(irp)设置为挂起状态,并且设置一个取消例程。如果当前irp队列为空,则将这个irp传送给startio()例程;否则,将它放到irp队列中。设备驱动程序做完这些工作后,结束这个deviceiocontrol()的处理,于是win32应用程序可能不等待irp处理完,就从deviceiocontrol()的调用中返回。通过判断返回值,得到irp的处理情况。如果当前irp处于挂起状态,则主程序先做一些其它的工作,然后调用waitforsingleobject()或waitformultipleobject()函数等待overlapped中的事件成为有信号状态。设备驱动程序在适当的时候处理排队的irp,处理完成后,调用iocompleterequest()函数。该函数将overlapped中的事件设置为有信号状态。win32应用程序对这个事件马上进行响应,退出等待状态,并且将事件复位为无信号状态,然后调用getoverlappedresult()

函数获取irp的处理结果。

5 事件方式(wdm)

win32应用程序首先创建一个事件,然后将该事件句柄传给设备驱动程序,接着创建一个辅助线程,等待事件的有信号状态,自己则接着干其它事情。设备驱动程序获得该事件的句柄后,将它转换成能够使用的事件指针,并且把它寄存起来,以便后面使用。当条件具备后,设备驱动程序将事件设置为有信号状态,这样应用程序的辅助线程马上知道这个消息,于是进行相应的处理。当设备驱动程序不再使用这个事件时,应该解除该事件的指针。

6 结语

在目前流行的windows操作系统中,设备驱动程序是操纵硬件的最底层软件接口。它向上提供与硬件无关的用户接口,向下直接进行i/o、硬件中断、dma和内存访问等操作。它将应用程序与硬件细节屏蔽开来,使软件不依赖于硬件并且可在多个不同的平台之间移植。本文介绍了5种设备驱动程序通知应用程序的方法,其中前3种方法主要用于vxd中,后2种方法主要用于wdm。这5种方法都经过实际测试。测试结果表明,它们都能够达到设备驱动程序通知应用程序的目的。

参考文献:

[1]欧青立,徐建波,李方敏,等. 虚拟设备驱动程序vxd的研究与开发. 计算机工程,2003

驱动程序范文第10篇

为了保证操作系统的平安性和稳定性以及应用程序的可移植性,windows操作系统不答应应用程序直接访问系统的硬件资源,而是必须借助于相应的设备驱动程序。设备驱动程序可以直接操作硬件,假如应用程序和设备驱动程序之间实现了双向通信,也就达到了应用程序控制底层硬件设备的目的。它们之间的通信包括两个方面摘要:一方面是应用程序传送给设备驱动程序的数据;另一方面是设备驱动程序发送给应用程序的消息。前者的实现较轻易,通过createfile()函数获取设备驱动程序的句柄后,就可以使用win32函数,如deviceiocontrol()、readfile()或writefile()等实现应用程序和设备驱动程序之间的通信。后者的实现远比前者复杂,同时介绍这方面情况的文章较少。这不等于说它不重要,相反,它在有些应用场合发挥着重要的功能。设备驱动程序完成数据的采集工作后,需要马上通知应用程序,以便应用程序能够及时将数据取走并进行处理。诸如此类情况,不一而足。

鉴于设备驱动程序通知应用程序的重要性,本人结合一些经验,对它进行了总结,归纳出5种方法摘要:异步过程调用(apc)、事件方式(vxd)、消息方式、异步i/o方式和事件方式(wdm)。下面分别说明这几种方式的原理,并给出实现的部分源代码。

1 异步过程调用(apc)

win32应用程序使用createfile()函数动态加载设备驱动程序,然后定义一个回调函数backfunc(),并且将回调函数的地址%26amp;backfunc()作为参数,通过deviceiocontrol()传送给设备驱动程序。设备驱动程序获得回调函数的地址后,将它保存在一个全局变量(如callback)中,同时调用get_cur_thread_handle()函数获取它的应用程序线程的句柄,并且将该句柄保存在一个全局变量(如appthread)中。当条件成熟时,设备驱动程序调用_vwin32_queueuserapc()函数,向win32应用程序发送消息。这个函数带有三个参数摘要:第一个参数为回调函数的地址(已经注册);第二个参数为传递给回调函数的消息;第三个参数为调用者的线程句柄(已经注册)。win32应用程序收到消息后,自动调用回调函数(实际是由设备驱动程序调用)。回调函数的输入参数是由设备驱动程序填入的,回调函数在这里主要是对消息进行处理。

2 事件方式(vxd)

首先,win32应用程序创建一个事件的句柄,称其为ring3句柄。由于虚拟设备驱动程序使用事件的ring0句柄,因此,需要创建ring0句柄。用loadlibrary()函数加载未公开的动态链接库kernel32.dll,获得动态链接库的句柄。然后,调用getprocaddress(), 找到函数openvxdhandle()在动态链接库中的位置。接着,用openvxdhandle()函数将ring3事件句柄转化为ring0事件句柄。win32应用程序用createfile()函数加载设备驱动程序。假如加载成功,则调用deviceiocontrol()函数将ring0事件句柄传给vxd;同时,创建一个辅助线程等待信号变成有信号状态,本身则可去干其它的事情。当条件成熟时,vxd置ring0事件为有信号状态(调用_vwin32_setwin32event()函数),这马上触发对应的ring3事件为有信号状态。一旦ring3事件句柄为有信号状态,win32应用程序的辅助线程就对这个消息进行相应的处理。

3 消息方式

win32应用程序调用createfile()函数动态加载虚拟设备驱动程序。加载成功后,通过调用deviceiocontrol()函数将窗体句柄传送给vxd,vxd利用这个句柄向窗体发消息。当条件满足时,vxd调用shell_postmessage()函数向win32应用程序发送消息。要让该函数使用成功,必须用#define来自定义一个消息,并且也要照样在应用程序中定义它;还要在消息循环中使用on_message()来定义消息对应的消息处理函数,以便消息产生时,能够调用消息处理函数。shell_postmessage()函数的第一个参数为win32窗体句柄,第二个参数为消息id号,第三、四个参数为发送给消息处理函数的参数,第五、六个参数为回调函数和传给它的参数。win32应用程序收到消息后,对消息进行处理。

4 异步i/o方式

win32应用程序首先调用createfile()函数加载设备驱动程序。在调用该函数时,将倒数第2个参数设置为file_attribute_normal|file_flag_overlapped,表示以后可以对文件进行重叠i/o操作。当设备驱动程序文件创建成功后,创建一个初始态为无信号、需要手动复位的事件,并且将这个事件传给类型为overlapped的数据结构(如overlapped)。然后,将overlapped作为一个参数,传给deviceiocontrol()函数。设备驱动程序把这个i/o请求包(irp)设置为挂起状态,并且设置一个取消例程。假如当前irp队列为空,则将这个irp传送给startio()例程;否则,将它放到irp队列中。设备驱动程序做完这些工作后,结束这个deviceiocontrol()的处理,于是win32应用程序可能不等待irp处理完,就从deviceiocontrol()的调用中返回。通过判定返回值,得到irp的处理情况。假如当前irp处于挂起状态,则主程序先做一些其它的工作,然后调用waitforsingleobject()或waitformultipleobject()函数等待overlapped中的事件成为有信号状态。设备驱动程序在适当的时候处理排队的irp,处理完成后,调用iocompleterequest()函数。该函数将overlapped中的事件设置为有信号状态。win32应用程序对这个事件马上进行响应,退出等待状态,并且将事件复位为无信号状态,然后调用getoverlappedresult()

函数获取irp的处理结果。

5 事件方式(wdm)

win32应用程序首先创建一个事件,然后将该事件句柄传给设备驱动程序,接着创建一个辅助线程,等待事件的有信号状态,自己则接着干其它事情。设备驱动程序获得该事件的句柄后,将它转换成能够使用的事件指针,并且把它寄存起来,以便后面使用。当条件具备后,设备驱动程序将事件设置为有信号状态,这样应用程序的辅助线程马上知道这个消息,于是进行相应的处理。当设备驱动程序不再使用这个事件时,应该解除该事件的指针。

6 结语

在目前流行的windows操作系统中,设备驱动程序是操纵硬件的最底层软件接口。它向上提供和硬件无关的用户接口,向下直接进行i/o、硬件中断、dma和内存访问等操作。它将应用程序和硬件细节屏蔽开来,使软件不依靠于硬件并且可在多个不同的平台之间移植。本文介绍了5种设备驱动程序通知应用程序的方法,其中前3种方法主要用于vxd中,后2种方法主要用于wdm。这5种方法都经过实际测试。测试结果表明,它们都能够达到设备驱动程序通知应用程序的目的。

参考文献摘要:

[1欧青立,徐建波,李方敏,等. 虚拟设备驱动程序vxd的探究和开发. 计算机工程,2003