最近有一些同学发邮件问我,驱动调试助手到底能动态加载哪些驱动,为什么在加载USB 设备驱动时总是失败。要解释这个问题,首先得弄清楚WinCE 中驱动的相关概念。本文将主要介绍WinCE 下驱动程序的分类。

驱动程序是介于操作系统和设备之间的一个代码层,它的主要作用是为操作系统提供一个接口,以操作不同的硬件,包括物理的和虚拟的设备。虽然驱动程序有很多种,但从编程的角度来看,无非是往一个固定的框架中添加相应的代码。这里的框架指的是一个接口,面向操作系统。代码实现的宗旨是,在正确的时间往正确的寄存器中写正确的值。

驱动程序的分类,从不同的角度有不同的分法。拿串口驱动来说,你可以说它是一个分层驱动,你也可以说它是一个流驱动,你还可以说它是开机时自动加载的驱动……这似乎有点乱。如果你也这么认为,那建议往下看。如果这些你都了如指掌,那就不浪费时间了,当然,您愿意找茬,我会很感谢!

先说本地驱动(Native Drivers)和流驱动(Stream Drivers)。WinCE下的驱动都可以归类到这两个里面,二者必居其一。这是从驱动程序提供给操作系统的接口来区分的。流驱动为操作系统提供了流接口函数,如XXX_Init()、XXX_Open()、XXX_Read()、XXX_Write()、XXX_Close()等等。这一类的驱动由Device Manager来管理,它调用ActivateDeviceEx()函数来加载流驱动。ActivateDeviceEx()的参数是注册表中相应的键,用来设定加载流驱动的属性,如Index、Order、Prefix等等。流驱动的注册表配置信息一般存放在[HKEY_LOCAL_MACHINE\Drivers\BuiltIn]下。流驱动加载成功后,应用程序通过调用CreateFile()、ReadFile()、WirteFile()等来访问流驱动的设备。流驱动可以动态管理,驱动调试助手就是用来帮助调试这一类驱动的。

与流驱动相反,本地驱动提供给操作系统的不是标准的流接口,而是事先约定好的特定接口。不同的设备,接口也不一样。WinCE中,常见的本地驱动有LCD显示驱动、触摸屏驱动、鼠标和键盘驱动及打印机驱动等。可以看到,本地驱动主要是人机界面相关的驱动。它们由GWES管理,在系统启动时加载。他们在注册表中也有各自相应的配置信息。如键鼠的注册表配置如下:

[HKEY_LOCAL_MACHINE"System"CurrentControlSet"Control"Layouts"00000409]

"Layout File"="kbdmouse.dll"

"Layout Text"="US"

"PS2_AT"="kbdmouse.dll"

"Matrix"="kbdmouse.dll"

本地驱动由操作系统调用,应用程序不能访问。对于这类驱动,驱动调试助手是无能为力的,只能老老实实的编译、下载、验证。

WinCE驱动中经常会听到MDD(Model Device Driver)和PDD(Platform Dependent Driver)的概念,这是从驱动代码实现的结构来区分的。WinCE的驱动可以是单层的,也可以是PDD+MDD。这没有硬性规定,一个驱动程序可以采用分层结构,也可以采用单层结构。一般来说,单层结构的驱动执行效率更高,而分层结构的驱动方便代码维护和移植。拿串口驱动来说,完全可以采用单层结构。而把它分为PDD和MDD,作为一般的开发者,我们只需实现PDD层就可以了,MDD层由微软实现。这样,驱动开发的工作量少很多,而代码的可靠性则有了更好的保证。至于采用哪一种结构的驱动,主要看你的需求。

WinCE 6.0引入了内核态驱动和用户态驱动的概念。在WinCE5.0及先前的版本中,驱动工作在用户态。从代码方面看,内核态驱动和用户态驱动没太大差别。如果驱动中没有采用什么特别的技术,内核态驱动和用户态驱动甚至是二进制兼容的。我曾经试过将一个DLL分别加载到内核态和用户态,都工作得很好。内核态驱动被加载到内核空间,用户态驱动被加载到特定的用户进程空间中。从执行效率来看,内核态的驱动效率比用户态的驱动高。从稳定性方面考虑,用户态的驱动不会对系统产生致命影响,而内核态的驱动相对危险。同样,采用哪一种类型的驱动,也是看你的需求。

从驱动加载的时间来看,可分为两种:系统启动时加载和需要时加载。一般来说本地驱动都是在启动时加载的,所以这里说的主要是流驱动。如果想要驱动在系统启动时加载,只需将它的注册表配置信息放到[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\]下,如[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\Battery],系统启动时,Device Manager会自动加载它。需要时加载,顾名思义,就是想加载就加载,想卸载就卸载,很灵活。这里很有必要说一下USB设备的驱动加载,如USB摄像头驱动,它也属于需要时加载的驱动。从驱动的接口来看,它属于流驱动,但相对普通的流驱动,它增加了几个函数:USBDeviceAttach()、USBInstallDriver()、USBUnInstallDriver()等。USB摄像头驱动的加载在USBDeviceAttach()中完成。所以,它无须,也不能,用驱动调试助手加载。需要时加载的驱动还有一个作用,在无法修改系统的情况下,应用程序中动态加载该驱动,以完成对硬件的操作。

综上所述,WinCE驱动的分类,主要有以下几种分法:

按驱动接口分,可分为本地驱动和流驱动;

按驱动结构分,可分为单层驱动和分层驱动;

按驱动加载的空间分,可分为内核态驱动和用户态驱动;

按驱动加载的时间分,可分为启动时加载和需要时加载两种。

驱动调试助手,是用来动态管理流驱动。本地驱动和USB驱动不再它的控制范围之内,各位在使用时注意这一点。

文中有失当之处,敬请留言指正。如果还有什么问题,也欢迎留言,大家一起讨论。

WinCE驱动程序的分类相关推荐

  1. VxWorks设备驱动程序开发指南---驱动程序的分类

    8D Spaces Reliability & Stability & Efficiency 目录视图 摘要视图 订阅 VxWorks设备驱动程序开发指南(三)---驱动程序的分类 2 ...

  2. Windows驱动程序的分类

    有两类Windows驱动程序: 用户态驱动程序 运行在用户态,它们经常提供Win32程序.核心态驱动(或其它系统组件)之间的接口.比如打印机驱动就是由用户态和核心态驱动组成的. 核心态驱动程序 运行在 ...

  3. WINCE驱动程序快速入门

    有人也许和我一样比较心急,想尽快知道如何去写一个具体的驱动程序,这里,假设您对驱动程序已经有比较好的了解,告诉大家一个快速上路的方法.当然,如果您有足够的时间我建议在动手之前还是深入了解一下CE整个系 ...

  4. 图解WinCE6.0下的内核驱动和用户驱动

    图解WinCE6.0下的内核驱动和用户驱动 在<WinCE驱动程序的分类>中曾提到,WinCE6.0的流驱动既可以加载到内核态也可以加载到用户态.下面通过一组图片简单说明一下这两种驱动的关 ...

  5. WinCE平台USB摄像头驱动开发

    (转载)http://tech.e800.com.cn/articles/2009/116/1257487620781_1.html 由于良好的性能.低廉的价格和灵活方便的特性,USB 摄像头正被广泛 ...

  6. 浅谈WinCE平台USB摄像头驱动开发流程

    转自http://tech.e800.com.cn/articles/2009/116/1257487620781_1.html 由于良好的性能.低廉的价格和灵活方便的特性,USB 摄像头正被广泛的集 ...

  7. 系统安装操作优化:chapter5 安装驱动程序与检测电脑

    目录: 前言 认识硬件驱动程序 驱动程序的功能 前言 安装完操作系统后,还要为硬件安装驱动程序,这样才能使电脑中的各个硬件有条不紊地进行工作.另外还可以使用工具软件对电脑硬件的性能进行检测,了解硬件配 ...

  8. 【学习笔记】JDBC:java提供的专门操纵数据库的API JDBC驱动程序的类型 JDBC常用的类与接口

    JDBC技术 JDBC的全称是Java DataBase Connectivity,是一套面向对象的应用程序接口,指定了统一的访问各种关系型数据库的标准接口,JDBC是一种底层的API,因此访问数据库 ...

  9. WDM内核驱动程序模型分析

    WDM内核驱动程序模型分析  WDM驱动程序是Windows 2000操作系统重要的组成部分,它的正常工作需要有Windows 2000其它内核组件的支持,同时大部分的内核组件也必须同WDM驱动程序交 ...

最新文章

  1. 阿里云推荐码:8N6TBT
  2. python【蓝桥杯vip练习题库】BASIC-3字母图形
  3. memcached企业面试题
  4. 法学教授:洋文凭情结是对教育体制的嘲弄
  5. 企业实战_23_MyCat SQL防火墙
  6. python中的索引从几开始计数_计算机为什么要从 0 开始计数?
  7. sql server 常用语句
  8. python oop示例_python 面向对象oop
  9. VS Code Java 开发指南!
  10. html基础内容样式
  11. Win2003 Server磁盘配额揭密启用篇
  12. CAD文件查看器Acme CAD Converter V 8.10.2.1536【轻松查看CAD】
  13. 夸计算机老师的成语,赞美老师的成语句子
  14. java工程师英文简历_软件工程师英文简历
  15. EPIC的服务器稳定吗,epic国内有服务器吗(epic服务器在哪)
  16. 相机去畸变软件OCamCalib的使用方法
  17. PHP版本美团闪购开放平台sdk
  18. 联想T460p加装固态硬盘
  19. MentorGraphicsMAJIC-LT的使用
  20. Java 自动类型转换,强制类型转换

热门文章

  1. 基于PLC网关的远程泵站监控解决方案
  2. 电脑“C盘”快满了,怎么清理?
  3. 【C语言】如何很好的实现复数类型
  4. HR面试“六西格玛黑带”时都会聊些什么问题?
  5. 最新各大apk加固特征库
  6. 一些常用的语音特征提取算法
  7. 信息安全风险评估流程
  8. 计算机OS修订版本,ibms系统简介(最新版-修订).pdf
  9. 轻量简洁的图片查看软件irfanview
  10. 树莓派zerow文件服务器,树莓派 Zero W 带USB板( ssh配置 WiFi连接 ) 上手个人配置...