Windows CE下流驱动的动态加载

    我想很多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,点击“驱动调试”菜单——选择“导入注册表”,浏览到我们准备好的注册表文件DrvDemo.reg,选中并点击OK按钮,这样,DrvDemo.reg中的内容就已经导入到系统中了,相应的信息能在“操作信息回显”中看到。

     此时你可以直接点击“驱动调试”菜单下的“激活驱动”,当然你也可以打开“驱动调试”——“驱动列表”,进而选择激活该驱动。正常情况下,操作回显中就会提示你“加载驱动成功”。

     这时,再到DrvDemo.exe点击打开设备,就完全没有问题了。

如果在测试时,发现驱动有问题,那么你可以选择“卸载驱动”,然后将修改好的新的驱动拷贝过来,再点击“激活驱动”菜单。如此往复,直至调试成功。

至此,我们采用了通过导入注册表文件的方法激活驱动。下面再说说在没有注册表文件时直接通过浏览DLL文件本身来加载驱动的方法。先把刚刚加载的驱动卸载了。

运行驱动调试助手软件,点击“驱动调试”菜单——选择“浏览DLL文件”,浏览到我们准备好的DrvDemo.dll文件。在弹出的对话框中设置正确的Prefix、Order、Index信息,点击“确定”。

同样,此时你可以直接通过“驱动调试”下的“激活驱动”直接激活该驱动,或者从“驱动列表”中激活.

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

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

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

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

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

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

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

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

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

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

6.       做这样一个小工具,主要是想提高自己的工作效率。现在贴出来,希望也能为同道中人所用。在使用该程序时有任何问题,请发邮件到 wince.he@gmail.com,我会尽力解决。本篇中的视频录像和最新版的驱动调试助手可以在http://files.cnblogs.com/we-hjb/WINCEDM.rar下载到。

上面所讲的并不是新鲜或者高深的技术,但相信对某些技术人员还是有一定的帮助。当然,文中有不尽如人意处,还请你见谅。以后争取多写一点东西,跟大家一起学习Windows Embedded。

最后,希望不要被认为是“广告性质的文章”。^_^

时间: 2024-11-10 10:42:03

Windows CE下流驱动的动态加载的相关文章

wince-WinCE6.0下AddFontResource动态加载黑体字库,导致CE系统的汉字消失,怎么解决?

问题描述 WinCE6.0下AddFontResource动态加载黑体字库,导致CE系统的汉字消失,怎么解决? WinCE6.0下AddFontResource动态加载黑体字库,导致CE系统的汉字消失,怎么解决? 解决方案 以下测试在模拟器上进行在我们的真机也是同样现象1. 首先打开模拟器2. 运行测试程序测试程序为新建一个MFC基于对话框的工程添加一个按钮caption是测试并且添加按钮按下的代码C/C++ codevoid CTestFont2Dlg::OnBnClickedButton1(

VC中动态加载ODBC解决方法

在使用 VC. VB. Delphi等高级语言编写数据库应用程序时,往往需要用户自己在控制面板中配置 ODBC数据源.对于一般用户而言,配置 ODBC数据源可能是一件比较困难的工作.      而且,在实际应用中,用户往往要求在同一个应用程序中访问不同的数据源,因此采用一般的加载方法就有了无法克服的缺陷.为能在程序中完成这一工作,方便应用程序的使用,本文以 VC为开发环境介绍两种在应用程序中动态加载 ODBC系统数据源的方法. 方法一:修改注册表 设计思路 一般情况下,当用户在控制面板中配置好

js的动态加载、缓存、更新以及复用(一)

使用范围: OA.MIS.ERP等信息管理类的项目,暂时不考虑网站. 遇到的问题: 完成一个项目,往往需要引用很多js文件,比如jQuery.js.easyUI等.还有自己写的一些列js文件,那么这些文件如何方便的加载,如果文件有变化如何才能让客户端及时更新缓存?如果能够提高点运行效率,那就更好了. 目标: 1.  可以方便的引用js文件. 2.  尽量使用各种缓存,避免频繁从服务器读取文件. 3.  如果js文件有更新或者增加.减少几个减少js文件,需要客户端能够自动.立刻更新. 4.  Js

MapObjects2.2 在C#中的应用(动态加载地图)

object|动态|加载 MapObjects2.2 在C#中的应用(动态加载地图) 关键字:MapObjects 2.2 C# 本篇文章实现了动态加载地图的功能,废话少说,功能实现见代码. 加载过程代码: using System; using System.Drawing; using System.Collections; using System.ComponentModel; using System.Windows.Forms; using System.Data; namespac

发现一个.Net中动态加载控件时关于焦点方面的Bug

动态|加载|控件 今天写一个系统框架的时候用到了动态加载,调试的时候发现程序经常会出现死锁的情况,而且死锁的时候还会打开一个"WindowsFormsParkingWindow"后台进程,跑到网上查了半天关于WindowsFormsParkingWindow的资料,结果中文的一篇没找到,蝇文的倒有几篇,对着金山词霸费了九牛二虎之力还没看出个道道来.后来干脆新建了一个项目,只写了几行代码,结果运行的时候发现还是会有死缩的情况: 1.新建一个windows应用程序 2.添加一个UserCo

如何动态加载控件以及插件编程思想(C#)

编程|动态|加载|控件 关键词:动态加载,控件,插件 控件,在实现快速开发中起着非常重要的作用,它可以将某一特定功能封装起来,供可户程序员调用,更重要的是它还可以实现插件式开发,使软件的灵活性.可扩充性大大增强.在网络上,也有很多动态加载控件.动态调用类成员等的资料.下面,我就将动态加载控件总结一下,以供大家参考.(不过由于本人水平有限,不一定有参考价值,写出来一方面是为了总结自己,以求提高,另一方面也希望各为朋友看到我的不足,给我提出宝贵意见)一.动态加载控件 动态加载,最基本用到的就是反射机

Visual Basic .NET 中动态加载类(一)

visual|动态|加载 Visual Basic .NET 中动态加载类 · ··Microsoft 摘要:理想情况下,编写软件系统之前我们就应该知道此软件系统需要完成哪些操作.但实际情况并非如此,因此我们的系统应该是可以调整的. 最能体现这种适应性的是动态集成新功能的能力.例如,在 Windows 窗体应用程序中,这种能力是指加载编译原始应用绦蚝芫靡院蟠唇ǖ拇疤宓哪芰Α?/P> 这种操作在 Microsoft Visual Basic 6.0 中几乎是不可能的,但是在 Visual Basi

Visual Basic .NET 中动态加载类 (二)

visual|动态|加载 Microsoft 步骤 3:创建配置文件以存放可用窗体 应用程序在运行时需要的某些信息可能在编译时无法提供,这些信息通常放置在配置文件中.在 Visual Basic 6.0 中,配置文件应该是 INI 文件或 Windows 注册表.而在 .NET 中,则使用基于 XML 的配置文件. 我们无法详细介绍配置文件,因为这个主题非常复杂.但是,您应该知道,Windows 窗体应用程序的配置文件与应用程序的 EXE 启动文件在同一个目录中.配置文件的名称与程序的 EXE

Visual Basic .NET 中动态加载类 (三)

visual|动态|加载 ··Microsoft 步骤 8:用新的窗体信息更新配置文件 现在,我们已经创建了一些新窗体,还需要在配置文件中引用它们.请用以下代码行替换 FormsOnTheFly.exe.config 中的占位符信息: <add key="First Form" value="C:\NewForms\FirstForm.dll~FirstForm.Form1"></add><add key="Second Fo