我想许多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文件自身来加载驱动的办法。先把刚刚加载的驱动卸载了。