当前位置:首页 > 编程开发

Windows CE下流驱动的动态加载

webgou16年前 (2011-04-28)编程开发205
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系统上,如下图所示。
来源:http://www.360doc.com/content/10/1009/15/3810344_59602098.shtml

扫描二维码推送至手机访问。

版权声明:本文由知了博客发布,如需转载请注明出处。

本文链接:https://www.webgou.info/?id=461

标签: wince
分享给朋友:

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

Android文件系统深入剖析

用过Linux的朋友可能对开源的系统有一个非常好的印象。那么在日益成熟的手机操作系统中,有没有一款像Linux一样的开源系统呢?谷歌公司就退出了一款基于Linux平台的Android 操作系统来满足人们的需求。在这里大家可以先来了解一下Android文件系统的相关内容。1、Android文件系统的结…

2410 Wince Eboot 流程

 2410 Wince Eboot 流程 对于嵌入式系统来说,一般都需要一个bootloader来下载和引导操作系统,常用的bootloader有eboot,uboot以及vivi等,对于windows ce来说最理想的bootloader当然是eboot(我也做了利用uboot下载和引导…

How do I update Ubuntu Linux softwares?

Q. I have latest version of Ubuntu Linux. How do I update Ubuntu Linux for security and application fix or upgrades? A. Ubuntu Linux can be upgraded u…

ServerSocketChannel

http://diary.51.com/diary/diary_add.php?groupid=103706呵呵,我来告诉你吧,至于例子代码在我的回答记录中有。你自己翻来去看,是用nio给一个学生写的BBS聊天室。在用nio通讯的过程我用以下情景给你模拟: 1. 学校(ServerSocketCha…

模态对话框和非模态对话框的区别

模态对话框就是指那种:显示出来就不可以点选位于其下面的对话框的对话框;反之的就是非模态对话框。 两者的区别:一. 非模态对话框的模板必须具有Visible风格(Visible=True),否则对话框将不可见,而模态对话框则无需设置该项风格。在实际编程中更加保险的办法是调用CWnd::ShowWind…

apache+tomcat+mysql 负载平衡和集群

apache+tomcat+mysql 负载平衡和集群前言:公司开发了一个网站,估计最高在线人数是3万,并发人数最多100人。开发的网站是否能否承受这个压力,如何确保网站的负荷没有问题,经过研究决定如下:(1) 采用负载平衡和集群技术,初步机构采用Apache+Tomcat的机群技术。(2) 采用压…

发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。