文档章节

Windows CE下流驱动的动态加载

sinlinx
 sinlinx
发布于 2014/07/09 12:23
字数 1545
阅读 27
收藏 0

我想很多WinCE的开发人员,尤其是刚入门并且做驱动开发的工程师,都曾碰到这样一个问题,要编写一个外围设备的驱动,拿最简单的GPIO驱动来说,编写驱动本身可能只花了一会儿功夫,可要把编译生成的DLL打包到先前做好的操作系统映像当中,最简单也得MakeImg一下,还要修改BIB文件、注册表文件,以让系统启动的时候就加载该驱动,所有工作都做完了,还得花几分钟下载整个操作系统到内存去运行,这也得要个好几分钟。能力强的人一次成功,不走回头路也就算了。

         如果驱动编写得有问题,那又得改代码,重新编译,把刚刚所做的事情再做一遍。说出来不怕大家笑话,我刚开始做驱动时就这样,反反复复,半天下来,才调试好一个简单的驱动。而事实上很大一部分时间都浪费在重复操作上。这种调试驱动的方法实在效率太低了。想到Linux下面的驱动调试,多方便!直接INSMOD一下,应用程序就可以调用,出现问题就RMMOD,根本无须来回倒腾操作系统的映像文件。那么,WinCE下难道就没有这么简便的方法嘛?答案是肯定的。
      

         闲话少说,进入正题。查找EVC的帮助,发现函数ActivateDevice()可用来加载驱动程序。而这个函数的使用是相当简单的。我就不多说了,贴上一段帮助最能说明问题。当然,你也可以用ActivateDeviceEx()。

         HANDLE ActivateDevice (

         LPCWSTR lpszDevKey,

         DWORD dwClientInfo

         );

         Parameters

         lpszDevKey

         [in] Pointer to the registry path string of the device's driver key under HKEY_LOCAL_MACHINE. A driver key contains the DLL name, the device prefix, friendly name, and other device information.

         dwClientInfo

         [in] Data that will be stored in the device's Active key in the ClientInfo value. The registry path to the driver's Active key is passed in as the context parameter to the device's XXX_Init function. The value in dwClientInfo is stored in the registry before XXX_Init is called.

         Return Values

         On success, ActivateDevice returns a handle to the device that can be used in subsequent calls to DeactivateDevice.

         Remarks

         This function is superseded by ActivateDeviceEx.

         ActivateDevice loads a device driver. ActivateDevice reads the registry key specified in lpszDevKey to get the DLL name, device prefix, index, and other values. Next it adds the device to the active device list in the registry branch HKEY_LOCAL_MACHINE\Drivers\Active, and stores the relevant values there. If no device index was specified in the key named in lpszDevKey, then it assigns a free index. Then it loads the device driver DLL in the process space of the Device Manager. Then it broadcasts a WM_DEVICECHANGE message for the new device and triggers a NOTIFICATION_EVENT_DEVICE_CHANGE event in the application notification system to notify applications of the presence of the new device.

         从上面的描述中可以看到,在使用该函数时,我们只要给出第一个参数就可以,而这个参数是注册表中的一个路径字符串。所以,要想很方便的动态加载任意一个驱动,我们还要了解一下有关注册表的内容。但其中最核心的就是一条,把你驱动的相关注册表信息放到HKEY_LOCAL_MACHINE下,主要内容包括Prefix、DLL、Index、Order等信息。这里就不展开说明了。

       自己起初费了那么多冤枉时间,实在很郁闷。原理摸清后就做了一个小工具,实现动态加载流驱动,以提高开发效率,也能方便后来人。下面就详细介绍这个小工具的使用过程,让大家体验一下动态加载流驱动是多么畅快的一件事情。

       我们假设已经做好一个简单的流驱动DrvDemo.dll,其对应的注册表文件为DrvDemo.reg,用来测试驱动的应用程序DrvDemo.exe。我们把这三个文件和驱动调试助手(DM.exe)都拷贝到WinCE系统上,如下图所示。

        首先运行DrvDemo.exe,点击打开设备,或者其他按钮,我们发现打开设备失败,很正常,此时DrvDemo.dll还没有工作呢。

       运行驱动调试助手软件DM.exe,点击“驱动调试”菜单——选择“导入注册表”,

或者从“驱动列表”中激活.

       其余的操作跟上面讲的完全一样了,不再重复。

        怎么样,这种方法就很类似于Linux下的Insmod和Rmmod了吧?

       其实,如果在注册表中已经有了相应的键,你甚至可以直接选中它,然后在“驱动调试”中选择“激活驱动”,如果一切正常,也可以达到上面两种方法的效果,但这样就连导入文件都省了。有兴趣的同志可以自己试一下。

       好了,我相信到这里,大家应该对动态加载流驱动的原理和方法都了解了,也能从此摆脱不断MakeImg和Download的梦魇,节省很多宝贵的开发时间。

       最后,针对驱动调试助手简单说明一下几个要注意的地方。

       1.   在调试驱动时,加载完驱动后,千万不要关闭驱动调试助手,最小化就行,否则,它会在关闭时自动卸载掉你所加载的驱动。

       2.   在WinCE4.2中,有关中断的驱动是无法直接用此方法来动态加载的,而在5.0和6.0中不会有此限制。这是因为WinCE4.2中的中断处理机制所致。

       3.   驱动调试助手可以同时加载几个驱动,这时候建议将所有注册表信息写到一个文件中,并导入。剩下的工作就是从驱动列表中选择加载你所需要的驱动了。

       4.   驱动调试助手中的注册表编辑功能经过几番修改,已基本完善,编辑、导入、导出都没有问题。如果系统支持HIVE-REG,在退出驱动调试助手时,可以选择保存此次的注册表修改。

       5.   上面的截图是在WinCE6.0的模拟器上面做的,应该算是内核态的驱动,至于用户态的驱动也可以通过该方法加载,但是需要设定相应的注册表信息。

 

© 著作权归作者所有

sinlinx
粉丝 0
博文 14
码字总数 13077
作品 0
保定
高级程序员
私信 提问
wince注册表结构

与桌面Windows一样,Windows CE也使用注册表(Registry)来保存应用程序、驱动程序和用户的设定以及其他一些配置信息。Windows CE注册表也采用树形结构来管理配置信息,由于Windows CE注册表...

技术小胖子
2017/11/16
0
0
[转]“我再也不用Windows CE或者嵌入式Windows XP了”

"我再也不用Windows CE或者嵌入式Windows XP了" 原文:http://www.windowsembedded.com.cn/aboutwindowsembedded1.asp 编者注: 指出常见的开发者为何使用嵌入式Windows的原因 摘录自Mike Ha......

夏春涛
2007/11/02
0
0
原创翻译 通过拨号上网的Windows CE6.0 GPRS连接II

介绍 Windows Embedded CE可以通过CellCore架构(蜂窝无线通信系统TAPI服务提供者)和Telephony API(TAPI 2.0 Unimodem 驱动)提供GPRS通信。CellCore架构是一个高级特性的架构,它对GSM调制...

wang15959099
2011/06/14
0
0
现在用windows ce嵌入式的人好像很少?

学windows ce是不是对学破解有用,windows ce主要学些什么,会不会增进对WDK驱动的理解? 现在学windows ce的人为什么少,不如linux吗?

个性签名
2015/02/22
173
0
GDAL for WINCE编译与配置

目前,GDAL导出为Windows CE平台并不是很容易,编译配置比起桌面版的要稍微复杂一点。 从GDAL1.40版本开始,开始支持winCE,但是据说,后面的版本也不支持windows CE的库,在windows CE上面的...

长平狐
2013/12/25
126
0

没有更多内容

加载失败,请刷新页面

加载更多

Spring使用ThreadPoolTaskExecutor自定义线程池及实现异步调用

多线程一直是工作或面试过程中的高频知识点,今天给大家分享一下使用 ThreadPoolTaskExecutor 来自定义线程池和实现异步调用多线程。 一、ThreadPoolTaskExecutor 本文采用 Executors 的工厂...

CREATE_17
今天
5
0
CSS盒子模型

CSS盒子模型 组成: content --> padding --> border --> margin 像现实生活中的快递: 物品 --> 填充物 --> 包装盒 --> 盒子与盒子之间的间距 content :width、height组成的 内容区域 padd......

studywin
今天
7
0
修复Win10下开始菜单、设置等系统软件无法打开的问题

因为各种各样的原因导致系统文件丢失、损坏、被修改,而造成win10的开始菜单、设置等系统软件无法打开的情况,可以尝试如下方法解决 此方法只在部分情况下有效,但值得一试 用Windows键+R打开...

locbytes
昨天
8
0
jquery 添加和删除节点

本文转载于:专业的前端网站➺jquery 添加和删除节点 // 增加一个三和一节点function addPanel() { // var newPanel = $('.my-panel').clone(true) var newPanel = $(".triple-panel-con......

前端老手
昨天
8
0
一、Django基础

一、web框架分类和wsgiref模块使用介绍 web框架的本质 socket服务端 与 浏览器的通信 socket服务端功能划分: 负责与浏览器收发消息(socket通信) --> wsgiref/uWsgi/gunicorn... 根据用户访问...

ZeroBit
昨天
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部