设备驱动程序开发流程_设备驱动程序开发流程图

       设备驱动程序开发流程是一个非常重要的话题,可以从不同的角度进行思考和讨论。我愿意与您分享我的见解和经验。

1.linux配置网卡信息空白怎么回事linux配置网卡信息

2.HAL的开发过程

3.电脑驱动程序的工作原理

4.如何构造一个简单的USB过滤驱动程序

5.使用微型pe工具箱注入驱动程序详细步骤

设备驱动程序开发流程_设备驱动程序开发流程图

linux配置网卡信息空白怎么回事linux配置网卡信息

       linux如何用命令恢复网卡配置文件?

       可以通过命令netconfig来恢复网卡配置文件。

       linux网卡驱动开发流程?

       网卡驱动不涉及网络编程,所谓驱动就是硬件和OS通信的桥梁。想学linux驱动,自己网上买块开发板,买本linux设备驱动程序的书,然后从最简单的key驱动开始,然后触屏驱动,由浅入深。

       Linux配置网卡时怎么设置默认路由?

       添加路由

       routeadd-net192.168.0.0/24gw192.168.0.1

       routeadd-host192.168.0.1dev192.168.0.1

       删除路由

       routedel-net192.168.0.0/24gw192.168.0.1

       add增加路由

       del删除路由

       -net设置到某个网段的路由

       -host设置到某台主机的路由

       gw出口网关IP地址

       dev出口网关物理设备名

       增加默认路由

       routeadddefaultgw192.168.0.1

       默认路由一条就够了

       route-n查看路由表

       Linux网卡配置文件路径是什么?

       都放在/etc目录下。

但具体位置不同。IP,网关记录在/etc/sysconfig/network-scripts下的ifcfg-eth0这个文件里。DNS记录在/etc下的resolv.conf这个文件里。域名在/etc下的named.conf这里

       linux判断网卡是否接了网线?

       具体代码如下

       1.查看网卡是否连接网线

       #mii-tool

       2.查看指定网卡是否连接网线

       #mii-tooleth0

       eth0:negotiated100baseTx-FD,linkok

       3.给网卡配置ip地址,然后ping这个ip地址即可。

       4.#ethtooleth1

       Settingsforeth1:

       Supportedports:

       Supportedlinkmodes:10baseT/Half10baseT/Full

       100baseT/Half100baseT/Full

       1000baseT/Half1000baseT/Full

       Supportsauto-negotiation:Yes

       Advertisedlinkmodes:10baseT/Half10baseT/Full

HAL的开发过程

       linux驱动程序如何调用?

       linux驱动程序按以下方法调用:

       1、进入到Ubuntu桌面后,打开终端,快捷键为ctrl+alt+T。

       2、然后创建一个文件夹来存放编写的脚本文件。

       3、找到要打开的执行程序的路径,这里以火狐为例。在/usr/bin下有火狐的执行程序。

       4、输入cd/usr/local/myShell进入刚刚创建的文件夹。

       5、如果你希望程序是在后台执行,可以在终端按ctrl+C退出程序,重新输入./openFireFox.sh,这样就能在后台运行程序,终端也可以继续使用。

       如何实现Linux下的U盘驱动?

       插入U盘。

       输入fdisk-l/dev/sda查看输出结果

       看了上面的输出就知道U盘所在的设备了,/dev/sdb1,接着便是挂载了,假设将U盘挂载到/mnt/usb目录中,就是

       mount-tmsdos/dev/sdb1/mnt/usb

       如果是fat16就使用下面的命令

       mount-tmsdos/dev/sdb1/mnt/usb

       如果是fat32

       mount-tvfat/dev/sdb1/mnt/usb

       如果是ext2格式,就用命令:

       mount-text2/dev/sda1/mnt/usb

       4.打开/mnt/usb就可以看到U盘里的东西了!

       cd/mnt/usb

       5.卸载命令则为:umount/mnt/usb。

       需要注意的是,当执行完这个命令后,U盘上的指示灯可能仍然亮着,这不是卸载失败。Linux对U盘的管理是内核模块式,只要usb设备的内核模块没有移除,卸载完后指示灯还是应该发亮。

       Ubuntu怎么安装驱动?

       一、ubuntu自带显卡驱动安装方式

       因为Ubuntu8.04LTS(HardyHeron)自带了大量的驱动程序,因此可通过“受限驱动管理器”来进行显卡驱动安装。本方式所安装的驱动也就是Ubuntu8.04LTS(HardyHeron)中带的受限驱动。

       1)系统=>系统管理=>受限驱动管理器

       2)输入用户密码

       3)Ubuntu8.04LTS(HardyHeron)的受限驱动管理器会列出你的显卡,在“已启用”选项上打勾,这时,在你选中“已启用”后就会弹出一窗口询问你是否要启用你所选择的驱动,点击Enable(启用驱动)。

       4)Ubuntu将自动下载并安装NVIDIA显卡驱动程序并安装。安装完成后点击close(关闭)。

       5)驱动安装完成后Ubuntu会提示你重启动计算机,点击右上角的重启图标即可重启计算机。

       在重新启动计算机后,驱动即安装完成。是不是很简单?

       接下来介绍第二种方法。

       二、下载官方驱动安装

       1、去nVidia官方网站下载最新Linux驱动

       2、安装libc6-dev(sudoapt-getinstalllibc6-dev);在安装官方驱动时,会提示安装KernelInterface,问是否去官方ftp下载KernelInterface;如果你确定能从官方上下载下来,可以跳过这一步,否则就要提供libc6-dev供编译。

       3、关闭XServer(/etc/init.d/gdmstop)

       4、清除之前的相关驱动(sudoapt-getremove_purgenvidia-glxnvidia-glx-new)及相关配置信息(清空/lib/linux-restricted-modules/目录及/etc/init.d/nvidia-glx和/etc/init.d/nvidia-kernel两个文件),避免无所谓的冲突

       5、禁用其他驱动模块(用sudovi/etc/default/linux-restricted-modules-common命令编辑DISABLED_MODULES=”",在引号之间添加nvnvidia_new)

       6、安装驱动(终于开始了),就是执行shXXX,XXX就是你下载的官方驱动文件,一步确认下去就OK了)

       7、启动XServer(/et

       linux网卡驱动开发流程?

       网卡驱动不涉及网络编程,所谓驱动就是硬件和OS通信的桥梁。想学linux驱动,自己网上买块开发板,买本linux设备驱动程序的书,然后从最简单的key驱动开始,然后触屏驱动,由浅入深。

电脑驱动程序的工作原理

       微软认识到了这一点并尝试做一个很小的底层,以隐藏不同机器间的差异,这一层被称为硬件抽象层HAL。

       HAL的作用是将操作系统的其余部分表示为抽象的硬件设备,特别是去除了真正硬件所富含的瑕疵和特质。这些设备表现为操作系统的其它部分和设备可以使用的独立于机器的服务的形式(函数调用和宏)。通过使用HAL服务和间接硬件寻址,当移植到新的硬件上时,驱动程序和核心只需做很少的改动。移植HAL本身是直接的,因为所有的机器相关代码都集中在一个地方,并且移植的目标是充分定义的,即实现所有的HAL服务。

       选择HAL中的服务是和主板上的芯片相关的,因为这些芯片从一个机器到另一个机器的变化是具有可预见限度的。换句话说,设计它是为了隐藏不同厂商主板之间的差别,而不是X86和Alpha之间的差别。HAL服务包括对设备寄存器的访问、总线独立的设备寻址、中断处理和复位、DMA传输、定时器和实时时钟的控制、底层的自旋锁(Spin Lock)和多处理机同步、BIOS接口以及CMOS配置内存。HAL没有提供对特殊I/O设备(如键盘、鼠标、硬盘和内存管理单元)的抽象或服务。

       举一个例子来说明硬件抽象层的功能。考虑内存映射I/O和I/O端口的对比。一些机器具有前者,一些机器具有后者。驱动程序该怎样编写?是否使用内存映射呢?强制选择会使驱动程序无法移植到另一种实现方式的机器上,为此,硬件抽象层专为驱动程序的编写者提供了三个读设备寄存器的函数和另外三个写寄存器的函数:

       uc=READ_PORT_UCHAR(port); WRITE_PORT_UCHAR(port, uc)

       us=READ_PORT_USHORT(port); WRITE_PORT_USHORT(port, us)

       ul=READ_PORT_ULONG(port); WRITE_PORT_LONG(port, ul)

       这些函数分别读写无符号8位、16位、32位的证书到特定的端口。由HAL决定是否需要内存映射I/O,这样,一个驱动程序可以不被修改而在具有不同设备寄存器实现的机器间移植。

       驱动程序常由于各种原因而访问特定的I/O设备。在这个硬件层上,一个设备的某个总线上会有一个或多个地址。由于现代计算机常有多种总线(PCI、PCI-E、SCSI、USB等),很可能两个或更多设备具有相同的总线地址,因此需要通过某种方式来区分它们。HAL提供了一个服务,该服务通过将总线相连的设备地址映射到系统范围内的逻辑地址来识别设备。这样,驱动程序就不需要知道哪条总线上有哪个设备了。这些逻辑地址与操作系统为用户程序提供的指向文件和其他系统资源的句柄是类似的。这种机制也使总线结构的属性和寻址方式对于高层不可见。

       中断也存在类似的问题——它们也是总线相关的。同样,在这里,HAL为系统范围内的中断提供命名服务,并允许驱动程序以可移植的方法将中断服务例程和中断联系起来而不用知道哪个中断向量对应于哪条总线。此外,中断请求级别管理也在HAL处理。

       HAL提供的另一项服务是以一种设备独立的方式设置并管理DMA传输。系统范围内的DMA引擎与特定I/O卡上的DMA引擎都可以操作。对设备的访问是通过其逻辑地址进行的。HAL还实现了软件的分散、聚集(scatter/gather)(对非连续的物理存储块进行写或读)。

       此外,HAL还以一种可移植的方式管理时钟与定时器。时间记录以100ns为单位(起始于1601年1月1日),这样就比以2s为单位(起始于1980年1月1日)的MS-DOS事件记录精确得多,HAL还为许多发生于17.18.19世纪的计算机相关事件的记录提供了致贺词。这种时间服务将驱动程序从始终运行的实际频率中分离出来。

       内核组件(Kernel Component)有时需要在非常低的层次上同步,特别是为了避免多处理机系统中的竞争状态。HAL提供了一些原子方法来管理这种同步,如自旋锁——一个CPU仅仅等待一个由其他CPU占用的系统资源被释放,尤其是在资源只被几条机器指令所占用的情况下。

       最后,当系统启动以后,HAL与BIOS进行对话,并检查CMOS配置内存(如果有的话),以查明该系统包含了哪些总线和I/O设备,以及他们是如何配置的。之后这个信息会被存入注册表,这样,其他系统组件就能够查询它,而不必了解BIOS或配置内存如何工作。

       由于HAL高度依赖于机器,它必须与其所装入的系统完全匹配,因此,Windows的安装光盘上提供了许多种版本的HAL。系统安装时,选择一种合适的HAL并以hal.dll为名复制到硬盘上的系统目录windows\system32或winnt\system32下。之后所有的启动都使用该版本的HAL,删除这个文件将导致系统无法启动。

如何构造一个简单的USB过滤驱动程序

       资料来源: /view/1048.htm一、什么是驱动程序

       根据百度百科:驱动程序,英文名为“Device Driver”,全称为“设备驱动程序”, 是一种可以使计算机和设备通信的特殊程序,可以 说相当于硬件的接口,操作系统只有通过这个接口,才能控制硬件设备的工作,假如某设备的驱动程序未能正确安装,便不能正常工作。 因此,驱动程序被誉为“ 硬件的灵魂”、“硬件的主宰”、和“硬件和系统之间的桥梁”等。

       刚安装好的系统操作系统,很可能驱动程序安装得不完整。硬件越新,这种可能性越大。菜菜熊之前看到的“图标很大且颜色难看”就是没有安装好驱动的原因。

       在软件测试中:在自底向上测试中,要编写称为测试驱动的模块调用正在测试的模块。测试驱动模块以和将来真正模块同样的方式挂接,向处于测试的模块发送测试用例数据,接受返回结果,验证结果是否正确。

       二、驱动程序的作用

       随着电子技术的飞速发展,电脑硬件的性能越来越强大。驱动程序是直接工作在各种硬件设备上的软件,其“驱动”这个名称也十分形象的指明了它的功能。正是通过驱动程序,各种硬件设备才能正常运行,达到既定的工作效果。

       硬件如果缺少了驱动程序的“驱动”,那么本来性能非常强大的硬件就无法根据软件发出的指令进行工作,硬件就是空有一身本领都无从发挥,毫无用武 之地。这时候,电脑就正如古人所说的“万事俱备,只欠东风”,这“东风”的角色就落在了驱动程序身上。如此看来,驱动程序在电脑使用上还真起着举足轻重的 作用。

       从理论上讲,所有的硬件设备都需要安装相应的驱动程序才能正常工作。但像CPU、内存、主板、软驱、键盘、显示器等设备却并不需要安装驱动程序也可以正常工作,而显卡、声卡、网卡等却一定要安装驱动程序,否则便无法正常工作。这是为什么呢?

       这主要是由于这些硬件对于一台个人电脑来说是必需的,所以早期的设计人员将这些硬件列为BIOS能直接支持的硬件。换句话说,上述硬件安装后就 可以被BIOS和操作系统直接支持,不再需要安装驱动程序。从这个角度来说,BIOS也是一种驱动程序。但是对于其他的硬件,例如:网卡,声卡,显卡等等 却必须要安装驱动程序,不然这些硬件就无法正常工作。

       三、驱动程序的界定

       驱动程序可以界定为官方正式版、微软WHQL认证版、第三方驱动、发烧友修改版、Beta测试版。

       1、官方正式版

       官方正式版驱动是指按照芯片厂商的设计研发出来的,经过反复测试、修正,最终通过官方渠道发布出来的正式版驱动程序,又名公版驱动。通常官方正 式版的发布方式包括官方网站发布及硬件产品附带光盘这两种方式。稳定性、兼容性好是官方正式版驱动最大的亮点,同时也是区别于发烧友修改版与测试版的显著 特征。因此推荐普通用户使用官方正式版,而喜欢尝鲜、体现个性的玩家则推荐使用发烧友修改版及Beta测试版。

       2、微软WHQL认证版

       WHQL是Windows Hardware Quality Labs的缩写,是微软对各硬件厂商驱动的一个认证,是为了测试驱动程序与操作系统的相容性及稳定性而制定的。也就是说通过了WHQL认证的驱动程序与Windows系统基本上不存在兼容性的问题。

       3、第三方驱动

       第三方驱动一般是指硬件产品OEM厂商发布的基于官方驱动优化而成的驱动程序。第三方驱动拥有稳定性、兼容性好,基于官方正式版驱动优化并比官 方正式版拥有更加完善的功能和更加强劲的整体性能的特性。因此,对于品牌机用户来说,笔者推荐用户的首选驱动是第三方驱动,第二选才是官方正式版驱动;对 于组装机用户来说,第三方驱动的选择可能相对复杂一点,因此官方正式版驱动仍是首选。

       4、发烧友修改版

       发烧友令笔者首先就联想到了显卡,这是为什么呢?因为一直以来,发烧友很常都被用来形容游戏爱好者。笔者的这个想法也正好和发烧友修改版的诞生 典故相符的,因为发烧友修改版的驱动最先就是出现在显卡驱动上的,由于众多发烧友对游戏的狂热,对于显卡性能的期望也就是比较高的,这时候厂商所发布的显 卡驱动就往往都不能满足游戏爱好者的需求了,因此经修改过的以满足游戏爱好者更多的功能性要求的显卡驱动也就应运而生了。如今,发烧友修改版驱动又名改版 驱动,是指经修改过的驱动程序,而又不专指经修改过的驱动程序。

       5、Beta测试版

       测试版驱动是指处于测试阶段,还没有正式发布的驱动程序。这样的驱动往往具有稳定性不够、与系统的兼容性不够等bug。尝鲜和风险总是同时存在的,所以对于使用Beta测试版驱动的用户要做好出现故障的心理准备。

       四、驱动程序介绍

       驱动程序(Device Driver)全称为“设备驱动程序”,是一种可以使计算机和设备通信的特殊程序,可以说相当于硬件的接口,操作系统只能通过这个接口,才能控制硬件设备的工作,假如某设备的驱动程序未能正确安装,便不能正常工作。

       正因为这个原因,驱动程序在系统中的所占的地位十分重要,一般当操作系统安装完毕后,首要的便是安装硬件设备的驱动程序。不过,大多数情况下,我们并不需要安装所有硬件设备的驱动程序,例如硬盘、显示器、光驱、键盘、鼠标等就不需要安装驱动程序,而显卡、声卡、扫描仪、摄像头、Modem等就需要安装驱动程序。另外,不同版本的操作系统对硬件设备的支持也是不同的,一般情况下版本越高所支持的硬件设备也越多,例如笔者使用了Windows XP,装好系统后一个驱动程序也不用安装。

       设备驱动程序用来将硬件本身的功能告诉操作系统,完成硬件设备电子信号与操作系统及软件的高级编程语言之间的互相翻译。当操作系统需要使用某个硬件时,比如:让声卡播放音乐,它会先发送相应指令到声卡驱动程序,声卡驱动程序接收到后,马上将其翻译成声卡才能听懂的电子信号命令,从而让声卡播放音乐。

       所以简单的说,驱动程序提供了硬件到操作系统的一个接口以及协调二者之间的关系,而因为驱动程序有如此重要的作用,所以人们都称“驱动程序是硬件的灵魂”、“硬件的主宰”,同时驱动程序也被形象的称为“硬件和系统之间的桥梁”。

       驱动程序即添加到操作系统中的一小块代码,其中包含有关硬件设备的信息。有了此信息,计算机就可以与设备进行通信。驱动程序是硬件厂商根据操作系统编写的配置文件,可以说没有驱动程序,计算机中的硬件就无法工作。操作系统不同,硬件的驱动程序也不同,各个硬件厂商为了保证硬件的兼容性及增强硬件的功能会不断地升级驱动程序。如:Nvidia 显卡芯片公司平均每个月会升级显卡驱动程序2-3次。驱动程序是硬件的一部分,当你安装新硬件时,驱动程序是一项不可或缺的重要元件。凡是安装一个原本不属于你电脑中的硬件设备时,系统就会要求你安装驱动程序,将新的硬件与电脑系统连接起来。驱动程序扮演沟通的角色,把硬件的功能告诉电脑系统,并且也将系统的指令传达给硬件,让它开始工作。

       当你在安装新硬件时总会被要求放入“这种硬件的驱动程序”,很多人这时就开始头痛。不是找不到驱动程序的盘片,就是找不到文件的位置,或是根本不知道什么是驱动程序。比如安装打印机这类的硬件外设,并不是把连接线接上就算完成,如果你这时候开始使用,系统会告诉你,找不到驱动程序。怎么办呢?参照说明书也未必就能顺利安装。其实在安装方面还是有一定的惯例与通则可寻的,这些都可以帮你做到无障碍安装。

       在Windows系统中,需要安装主板、光驱、显卡、声卡等一套完整的驱动程序。如果你需要外接别的硬件设备,则还要安装相应的驱动程序,如:外接游戏硬件要安装手柄、方向盘、摇杆、跳舞毯等的驱动程序,外接打印机要安装打印机驱动程序,上网或接入局域网要安装网卡、Moden甚至ISDN、ADSL的驱动程序。说了这么多的驱动程序,你是否有一点头痛了。下面就介绍Windows系统中各种的不同硬件设备的驱动程序,希望能让你拨云见日。

       在Windows 9x下,驱动程序按照其提供的硬件支持可以分为:声卡驱动程序、显卡驱动程序、鼠标驱动程序、主板驱动程序、网络设备驱动程序、打印机驱动程序、扫描仪驱动程序等等。为什么没有CPU、内存驱动程序呢?因为CPU和内存无需驱动程序便可使用,不仅如此,绝大多数键盘、鼠标、硬盘、软驱、显示器和主板上的标准设备都可以用Windows自带的标准驱动程序来驱动,当然其它特定功能除外。如果你需要在Windows系统中的DOS模式下使用光驱,那么还需要在DOS模式下安装光驱驱动程序。多数显卡、声卡、网卡等内置扩展卡和打印机、扫描仪、外置Modem等外设都需要安装与设备型号相符的驱动程序,否则无法发挥其部分或全部功能。驱动程序一般可通过三种途径得到,一是购买的硬件附带有驱动程序;二是Windows系统自带有大量驱动程序;三是从Internet下载驱动程序。最后一种途径往往能够得到最新的驱动程序。

       供Windows 9x使用的驱动程序包通常由一些.vxd(或.386)、.drv、.sys、.dll或.exe等文件组成,在安装过程中,大部分文件都会被拷贝到“Windows\ System”目录下。

       五、驱动程序的开发

       驱动程序的开发工作是很具挑战性的,因为必须配合著硬件与软件上相当明确与高级的平台技术。由于大多数的驱动程序(device drivers)运行在内核模式(kernel mode),软件的错误经常造成系统严重的不稳定,例如蓝屏(blue screen),这跟过去的用户模式(user mode)下的程序设计(例如Delphi、VB、Java)有明显的差异性。

       Windows平台

       为了大量减轻驱动程序开发人员的负担,微软不断的改进驱动程序的开发软件与架构,从早期复杂深晦的VxD,到Windows XP上的Windows Driver Model(以下简称WDM)开发架构,如今Windows Driver Foundation(以下简称WDF)已成为新一代的Windows平台驱动程序发展架构,这个架构大量简化了驱动程序的开发流程,更符合面向对象的精神,此架构包含了UserMode Driver Framework 与 Kernel Mode DriverFramework两种开发模式。在开发Windows平台上的驱动程序之前,必须先安装DDK包,目前DDK最新版本为5600,同时支持WDM与WDF两种架构。

       Linux平台

       Linux作为UNIX的一个变种,继承了UNIX的设备管理方法,将所有的设备是具体的文件,通过文件系统层对设备进行访问。 这种设备管理方法可以很好地做到“设备无关性”,可以根据硬件外设的更新进行方便的扩展。

       Linux中的设备大致可以分为三类:字符设备,块设备,网络设备。

       字符设备没有缓冲区,以字节为单位顺序处理数据,不支持随机读写。常见的字符设备如普通打印机、系统的串口、终端显示器、嵌入式设备中的简单按键、手写板等。

       块设备是指在输入输出时数据处理以块为单位的设备,一般都采用缓冲技术,支持数据的随机读写。典型的块设备有硬盘、光驱等。

       字符设备和块设备面向的上一层是文件系统层。对用户来说,块设备和字符设备的访问接口都是一组基于文件的系统调用,如read, write等。

       网络设备与块设备和字符设备不同,网络设备面向的上一层是网络协议层。设备文件是一个唯一的名字(如eth0),在文件系统中不存在对应的节点项。内核和网络驱动程序之间的通信使用的是一套和数据包传输相关的函数,而不是read, write等。

       每一个设备都有一对主设备号、次设备号的参数作为唯一的标识。主设备号标识设备对应的驱动程序;次设备号用来区分具体驱动程序的实例。主设备号的获取可以通过动态分配或指定的方式。在嵌入式系统中外设较少,一般采用指定的方式。

       n [编辑本段]驱动程序的一般安装顺序  驱动程序安装的一般顺序:主板芯片组(Chipset)→显卡(VGA)→声卡(Audio)→网卡(LAN)→无线网卡(Wireless LAN)→红外线(IR)→触控板(Touchpad)→PCMCIA控制器(PCMCIA)→读卡器(Flash Media Reader)→调制解调器(Modem)→其它(如电视卡、CDMA上网适配器等等)。不按顺序安装很有可能导致某些软件安装失败。

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

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

       第三步,安装DirectX驱动。这里一般推荐安装最新版本,目前DirectX的最新版本是DirectX 9.0C。可能有些用户会认为:“我的显卡并不支持DirectX 9,没有必要安装DirectX 9.0C”,其实这是个错误的认识,把DirectX等同为了Direct3D。DirectX是微软嵌在操作系统上的应用程序接口(API),DirectX由显示部分、声音部分、输入部分和网络部分四大部分组成,显示部分又分为Direct Draw(负责2D加速)和Direct 3D(负责3D加速),所以说Direct3D只是它其中的一小部分而已。而新版本的DirectX改善的不仅仅是显示部分,其声音部分(DirectSound)——带来更好的声效;输入部分(Direct Input)——支持更多的游戏输入设备,并对这些设备的识别与驱动上更加细致,充分发挥设备的最佳状态和全部功能;网络部分(DirectPlay)——增强计算机的网络连接,提供更多的连接方式。只不过是DirectX在显示部分的改进比较大,也更引人关注,才忽略了其他部分的功劳,所以安装新版本的DirectX的意义并不仅是在显示部分了。当然,有兼容性问题时另当别论。

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

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

       这样的安装顺序就能使系统文件合理搭配,协同工作,充分发挥系统的整体性能。

       另外,显示器、键盘和鼠标等设备也是有专门的驱动程序,特别是一些品牌比较好的产品。虽然不用安装它们也可以被系统正确识别并使用,但是安装上这些驱动程序后,能增加一些额外的功能并提高稳定性和性能 [编辑本段]Windows中的inf文件  Windows怎样知道安装的是什么设备,以及要拷贝哪些文件呢?答案在于.inf文件。.inf是从Windows 95时代开始引入的一种描述设备安装信息的文件,它用特定语法的文字来说明要安装的设备类型、生产厂商、型号、要拷贝的文件、拷贝到的目标路径,以及要添加到注册表中的信息。通过读取和解释这些文字,Windows便知道应该如何安装驱动程序。目前几乎所有硬件厂商提供的用于Windows 9x下的驱动程序都带有安装信息文件。事实上,.inf文件不仅可用于安装驱动程序,还能用来安装与硬件并没有什么关系的软件,例如Windows 98支持“Windows更新”功能,更新时下载的系统部件就是利用.inf文件来说明如何安装该部件的。

       在安装驱动程序时,Windows一般要把.inf文件拷贝一份到“Win-dows\Inf”或“Windows\Inf\Other”目录下,以备将来使用。Inf目录下除了有.inf文件外,还有两个特殊文件Drvdata.bin和Drvidx.bin,以及一些.pnf文件,它们都是Windows为了加快处理速度而自动生成的二进制文件。Drvdata.bin和Drvidx.bin记录了.inf文件描述的所有硬件设备,也许朋友们会有印象:当我们在安装某些设备时,经常会看到一个“创建驱动程序信息库”的窗口,此时Windows便正在生成这两个二进制文件。

       Windows 9x专门提供有“添加新硬件向导”(以下简称硬件向导)来帮助使用者安装硬件驱动程序,使用者的工作就是在必要时告诉硬件向导在哪儿可以找到与硬件型号相匹配的.inf文件,剩下的绝大部分安装工作都将由硬件安装向导自己完成。

       给硬件设备安装驱动程序对Windows 9x用户来说并不是一件陌生事,在安装或重装Windows时需要安装驱动程序,在购买了某些新硬件之后也需要安装驱动程序。如果驱动程序安装不正确,系统中某些硬件就可能无法正常使用。虽然Windows 9x支持即插即用,能够为用户减轻不少工作,但由于PC机的设备有非常多的品牌和型号,加上各种新产品不断问世,Windows不可能自动识别出所有设备,因此在安装很多设备时都需要人工干预。 资料来源: /view/1048.htm

使用微型pe工具箱注入驱动程序详细步骤

       本文分三部分来介绍如何构造一个简单的USB过滤驱动程序,包括“基本原理”、“程序的实现”、“使用INF安装”。此文的目的在于希望读者了解基本原理后,可以使用除DDK以外最流行也最方便的驱动开发工具DriverStudio来实现一个自己的过滤驱动,并正确地安装。

       一、基本原理

       我们知道,WDM(和KDM)是分层的,在构造设备栈时,IO管理器可以使一个设备对象附加到另外一个初始驱动程序创建的设备对象上。与初始设备对象相关的驱动程序决定的IRP,也将被发送到附加的设备对象相关的驱动程序上。这个被附加的驱动程序便是过滤驱动程序。如右图,过滤驱动可以在设备栈的任何层次中插入。IO管理器发出的IRP将会沿着右图的顺序从上往下传递并返回。因此,我们可以使用过滤驱动程序来检查、修改、完成它接收到的IRP,或者构造自己的IRP。

        上面这种文字是很枯燥的,好在“前人”已经写过一些范例以供我们更好地理解这些概念。读过Waltz Oney的《Programming Windows Driver Mode》一书的读者大概都知道Waltz Oney提供的范例中有一个关于USB过滤器(第九章)的例子,而在此基础上,《USB Design By Example》()的作者John Hyde实现了一个USB键盘过滤驱动程序,即给此程序增加了一个“拦截(Intercept)”功能来处理USB键盘的Report以实现特定的功能:当驱动程序在IRP_MJ_INTERNAL_DEVICE_CONTROL设置的完成例程从USB设备拦截到一个Get_Report_Descriptor时,拦截程序将此Descriptor中的USAGE值从“Keyboard”改为“UserDefined”,再返回给系统。

       我们可以从这个例子中获得一些灵感,比如,在Win2k下,键盘是由OS独占访问的,我们可以通过这种方式使之可以让用户自由访问;我们也可以拦截其他Report_Descriptor,将部分键重新定义,以满足特殊的要求;如果你愿意再做一个用户态的程序,你还可以将你拦截到的键值传递给你的用户态程序,以实现象联想、实达等国内电脑大厂出品的那些键盘上的各种实用的功能。

       二、程序的实现

       Waltz Oney和John Hyde的例子已经写得很详细了,读者可以不用修改一个字节便顺利地编译生成一个过滤驱动程序。本文的目的在于使用DriverStudio组件Driverworks来实现同样的功能。

       相信读者读到这篇文章时,已经对DriverStudio有了很多的了解。DriverStudio作为一个以C++为基础的“快速”驱动开发工具,它封装了基本上所有的DDK的函数,其集成在VC++中的DriverWizard,可以很方便地引导你完成设备驱动程序开发的全过程,能根据你的硬件种类自动生成设备驱动程序源代码,并提供了很多范例程序。当然,这些例子中便包含一个USB Filter驱动程序的框架。在不侵犯版权的前提下,充分利用现有共享的、免费的、授权的代码是我们的一贯作法。我们下面便以此范例为基础来作修改。

       我们的目的是做一个HID小驱动程序hidusb.sys的Lower Filter,它附加在“人机接口设备” ,通过拦截USB的Get_Report_Descriptor来修改其返回值,当它发现该Descriptor的Usage 为“Keyboard”时,将其改为“UserDefined”,如此我们便可以完全控制这只键盘。具体做法是,拦截IRP_MJ_INTERNAL_DEVICE_CONTROL,并检查其IOCTL代码及URB,如果满足IOCTRL功能代码为IOCTL_INTERNAL_USB_SUBMIT_URB以及URB功能代码为URB_FUNCTION_GET_DESCRIPTOR_FROM_INTERFACE的条件,即上层驱动发来Get_Report_Descriptor请求时,设置一个完成例程,在这个完成例程中,我们将判断Usage的值,将Usage由“6(Keyboard)”时,将其改为“0(UserDefined)”。

       打开C:\Program Files\NuMega\DriverStudio\DriverWorks\Examples\wdm\usbfilt目录(具体目录依你的DriverStudio所安装的目录不同而不同) ,再打开工程文件usbfilt.dsw,我们先看一下代码。

       程序由两个类组成,一个是Driver类,一个是Device类。Driver类包括:

        入口函数DriverEntry:

       DECLARE_DRIVER_CLASS(UsbFilterDriver, NULL)

       /////////////////////////////////////////////////////////////////////

       // Driver Entry

       //

       NTSTATUS UsbFilterDriver::DriverEntry(PUNICODE_STRING RegistryPath)

       {

        T << "UsbFilterDriver::DriverEntry\n";

        m_Unit = 0;

        return STATUS_SUCCESS;

        // The following macro simply allows compilation at Warning Level 4

        // If you reference this parameter in the function simply remove the macro.

        UNREFERENCED_PARAMETER(RegistryPath);

       }

        AddDevice函数

       NTSTATUS UsbFilterDriver::AddDevice(PDEVICE_OBJECT Pdo)

       {

        T << "UsbFilterDriver::AddDevice\n";

        UsbFilterDevice * pFilterDevice = new (

        static_cast<PCWSTR>(NULL),

        FILE_DEVICE_UNKNOWN,

        static_cast<PCWSTR>(NULL),

        0,

        DO_DIRECT_IO

        )

        UsbFilterDevice(Pdo, m_Unit);

        if (pFilterDevice)

        {

        NTSTATUS status = pFilterDevice->ConstructorStatus();

        if ( !NT_SUCCESS(status) )

        {

        T << "Failed to construct UsbFilterDevice"

        << (ULONG) m_Unit

        << " status = "

        << status

        << "\n";

        delete pFilterDevice;

        }

        else

        {

        m_Unit++;

        }

        return status;

        }

        else

        {

        T << "Failed to allocate UsbFilterDevice"

        << (ULONG) m_Unit

        << "\n";

        return STATUS_INSUFFICIENT_RESOURCES;

        }

       }

        这两段代码基本上和自动生成的代码差不多。AddDevice的作用是构造一个过滤器的实例。

       关键的代码在Device类。在这个类里,我们把过滤器插入设备栈,并拦截IRP,用自己的完成例程来实现特定的功能。

       Device构造函数

       UsbFilterDevice::UsbFilterDevice(PDEVICE_OBJECT Pdo, ULONG Unit) :

        KWdmFilterDevice(Pdo, NULL)

       {

        T << "UsbFilterDevice::UsbFilterDevice\n";

        // Check constructor status

        if ( ! NT_SUCCESS(m_ConstructorStatus) )

        {

        return;

        }

        // Remember our unit number

        m_Unit = Unit;

        // initialize the USB lower device

        m_Usb.Initialize(this, Pdo);

        NTSTATUS status = AttachFilter(&m_Usb); //Attach the filter

        if(!NT_SUCCESS(status))

        {

        m_ConstructorStatus = status;

        return;

        }

        SetFilterPowerPolicy();

        SetFilterPnpPolicy();

       }

       在DDK中,我们用IoAttachDevice将设备对象插入设备栈中。DriverStudio封装了这个函数。在DriverStudio中,其他驱动程序需要用Initialize来初始化设备对象和接口,对于过滤驱动,我们关键是需要Attachfilter将其附加在堆栈中。

       对于大部分如IRP_MJ_SYSTEM_CONTROL等IRP,我们所做的只需用PassThrough(Irp)将其直接往设备栈下层传递,不需要做任何工作。这些代码我们就不一一列举了。下面的部分才是本文的关键。

        我们知道,HIDUSB.SYS是使用内部IOCTRL发出URB给USB类驱动程序(USBD)读取数据的,那么,HIDUSB首先必须构造一个IRP_MJ_INTERNAL_DEVICE_CONTROL,它的IOCTL功能码为IOCTL_INTERNAL_USB_SUBMIT_URB(发出URB的内部IOCTL)。另外,因为我们要检查并修改的是USB键盘某个接口的报告描述,那么这个URB应该是URB_FUNCTION_GET_DESCRIPTOR_FROM_INTERFACE,如下:

       NTSTATUS UsbFilterDevice::InternalDeviceControl(KIrp I)

       {

        T << "UsbFilterDevice::InternalDeviceControl\n";

        // Pass through IOCTLs that are not submitting an URB

       //不是我们感兴趣的IOCTL不要理它

        if (I.IoctlCode() != IOCTL_INTERNAL_USB_SUBMIT_URB)

        return DefaultPnp(I);

        PURB p = I.Urb(CURRENT); // get URB pointer from IRP

       //不是我们感兴趣的URB,也不要理它,

        if (p->UrbHeader.Function !=

       URB_FUNCTION_GET_DESCRIPTOR_FROM_INTERFACE)

        return DefaultPnp(I);

       //符合要求的IRP才被设置完成例程

        return PassThrough(I, LinkTo(DeviceControlComplete), this);

       }

       在设置好条件以后,再来实现完成例程。所有的检查、修改等动作都是在完成例程里面完成的。

       NTSTATUS UsbFilterDevice::DeviceControlComplete(KIrp I)

       {

        PURB p = I.Urb(CURRENT);

        if(p)

        {

       //拦截到设备返回的描述表,

        char* DescriptorBuffer = (char*)p->UrbControlDescriptorRequest.TransferBuffer;

       //指向第三个字节,表示设备Usage属性的值

        DescriptorBuffer += 3;

       //如果值为6则改成0,6表示hid键盘,0表示未知设备

       //在设备管理器里面,原来的hid兼容键盘就不复存在了,取而代之的则是hid兼容设备

        if ((*DescriptorBuffer&0xff) == 6)

        *DescriptorBuffer = 0;

        }

        return I.Status();

       }

       读者可以对照DriverWorks中的例子,直接替换掉(或者修改)上面这两个函数,再编译一下,便可以得到一个完整的键盘过滤器驱动程序。

       其实,只要弄清楚了我们需要做些什么动作,在DriverStudio里面只需要写少量的关键代码,便可实现我们的要求,其余的大部分工作,或有范例可供参考,或有Driver Wizard自动生成。

        从上面可以看出,我们只需要修改这两个函数,拦截合适的IRP,便可以在完成例程里面实现我们特定的要求。正如开头所说,我们也可以拦截其他的IRP,拦截其他的URB,或者拦截特定键盘的按键键值,将之传递到用户态,以方便实现联想、实达等随机配备的多功能键盘的功能。

       三、使用INF安装驱动

        在完成了驱动以后,还必须把它安装到系统里面,驱动程序才会起作用。一般来说,我们都必须为我们的驱动程序提供一个inf文件,以便于用户安装或者维护。对于新手来说,过滤驱动程序的inf或许有些棘手。所以,针对本文所描述的驱动,我们提供一个Win98下的安装范例usbkey.inf,范例中“;”后的文字是注解,以方便读者理解。

       ; usbkey.INF

       ; Installs Lower Level Filter for a HID keyboard device

       ; (c) Copyright 2001 SINO Co., Ltd.

       ;

       [Version]

       ;”CHICAGO”表示Win9x平台

       Signature="$CHICAGO$"

       ;键盘所属类名

       Class=HID

       ClassGUID={745a17a0-74d3-11d0-b6fe-00a0c90f57da}

       ;驱动程序提供者,此信息会显示在设备属性的“常规”页

       Provider=%USBDBE%

       LayoutFile=layout.inf

       ;显示在驱动程序文件详细资料窗口

       DriverVer=11/12/2001,4.10.2222.12

       ;[ControlFlags]

       ;ExcludeFromSelect = *

       ;驱动程序安装目录,inf会将我们的驱动程序安装到如下目录

       ;记得Destinationdir后面一定要带一个“s”

       [DestinationDirs]

       DefaultDestDir = 10,system32\drivers

       ;要增加的注册表项

       [ClassInstall]

       Addreg=HIDClassReg

       [HIDClassReg]

       HKR,,,,%HID.ClassName%

       HKR,,Icon,,-20

       ;制造商

       [Manufacturer]

       %USBDBE%=USBDBE

       [USBDBE]

       ;我们所要附加过滤驱动程序的设备ID。这个ID可以从IC的规范上得来,也可以

       ;用hidview.exe读出,或者从注册表HKLM\Enum\hid和usb项找出

       %HID.DeviceDesc% = Keypad_Inst, USB\VID_05AF&PID_0805&MI_00

       ;要安装的文件和需要修改的注册表项

       ;Install usbkey driver

       [Keypad_Inst]

       CopyFiles=Keypad_Inst.CopyFiles

       AddReg=Keypad_Inst.AddReg

       [Keypad_Inst.CopyFiles]

       hidusb.sys

       hidparse.sys

       hidclass.sys

       usbfilt.sys

       [Keypad_Inst.AddReg]

       HKR,,DevLoader,,*ntkern

       HKR,,NTMPDriver,,"hidusb.sys"

       [Keypad_Inst.HW]

       AddReg=Keypad_Inst.AddReg.HW

       ;Lowerfilters表示是低层过滤驱动,如果是上层过滤驱动,则必须改为upperfilters

       [Keypad_Inst.AddReg.HW]

       HKR,,"LowerFilters",0x00010000,"usbfilt.sys"

       ;HID设备所需要安装的文件和注册表中需要修改的地方

       ;Install USBHIDDevice

       [USBHIDDevice]

       CopyFiles=USBHIDDevice.Copy

       AddReg=USBHIDDevice.AddReg

       [USBHIDDevice.Copy]

       hidclass.sys

       hidusb.sys

       hidparse.sys

       [USBHIDDevice.AddReg]

       HKR,,DevLoader,,*ntkern

       HKR,,NTMPDriver,,"hidusb.sys"

       ;以下定义需要在上面某些地方使用时替换的字符串

       [strings]

       USBDBE = "SINO Co., Ltd."

       HID.DeviceDesc = "SINO USB MultiKeyboard"

       HID.HIDDeviceDesc = "Human Interface Devices"

       HID.DefaultDevice = "HID Default Device"

       HID.ClassName = "Human Input Devices (HID)"

       HID.SvcDesc = "Microsoft HID Class Driver"

       其实最简单的写inf的方式,是找一些类似设备的inf文件或范例来修改。在不侵权的前提下,充分利用现有资源是我们的一贯原则。

       如果计算机中的驱动程序丢失,我们将无法正常运行硬件设备。我们可以在使用微型pe工具箱安装系统时添加驱动程序。让我们看看小编是如何操作的。

       使用微型pe工具箱注入驱动程序详细步骤

       1、进入“boot”选项,将U盘移到第一项。

       2、选择11、2、3进入PE系统。

       3、打开PE系统中的“Dism++”软件。

       4、点击左侧栏的“驱动管理”。

       5、点击右下角的“添加驱动”,找到预先准备好的驱动程序。

       6、等待驱动注入完成即可。

       好了,关于“设备驱动程序开发流程”的话题就到这里了。希望大家通过我的介绍对“设备驱动程序开发流程”有更全面、深入的认识,并且能够在今后的实践中更好地运用所学知识。