WinCE 流驱动一步一步来(理论基础)
在WinCE.net中,最简单的一个驱动程序莫过于一个内置(Built-in)设备的流接口驱动。对于一个不支持热拔插的设备,最快捷的方法就是为其实现一个内置的流接口的驱动。
对于这样一类驱动程序,我们只需要按一种特定的规则实现一个动态库,其中实现对所有的硬件功能的调用,再将这个动态库加入系统中,然后设置相关的注册表项,使得在系统启动时设备管理器能识别并且加载这个设备即可。
1. 实现动态链接库
此动态链接库与应用程序层所用的库并不很大差别,源文件可以是C、C++、甚至汇编,只是它要实现以下函数。
u DllEntry(HINSTANCE DllInstance, INT Reason, LPVOID Reserved )
这个函数是动态链接库的入口,每个动态链接库都需要输出这个函数,它只在动态库被加载和卸载时被调用,也就是设备管理器调用LoadLibrary而引起它被装入内存和调用UnloadLibrary将其从内存释放时被调用,因而它是每个动态链接库最早被调用的函数,一般用它做一些全局变量的初始化。
参数:
DllInstance:DLL的句柄,与一个EXE文件的句柄功能类似,一般可以通过它在得到DLL中的一些资源,例如对话框,除此之外一般没什么用处。
Reason:
一般我们只关心两个值:DLL_PROCESS_ATTACH与DLL_PROCESS_DETACH,Reason等于前者是动态库被加载,等于后者是动态库被释放。
所以,我们可以在Reason等于前者是初始化一些资源,等于后者时将其释放。
u
u
u
u
u
u
u
2. 注册表的设置
系统启动时启动设备管理程序,设备管理程序读取HKEY_LOCAL_MACHINE\Drivers\BuiltIn键的内容并加载已列出的流接口驱动程序。因此注册表对于驱动的加载有着关键作用。下面我们以设备名是“STR”来举一个例子:
[HKEY_LOCAL_MACHINE\Drivers\BuiltIn\STR]
"Prefix"="STR"
"Dll"="MyDev.Dll"
"Order"=dword:1
其中 "Prefix"="STR" 表示流接口的前缀,我们以后可以通过Creatfile 函数来实现对这个流接口的操作,实现如下:HANDLE hStr = CreateFile(TEXT("str1:"), GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, 0) 。其中“str1:”中的表示设备好“1”是必需的,不管你的设备当中是不是刚好只有一个,不然的话会出现打开不了这个设备的情况。
"Dll"="MyDev.Dll" 指的是“STR”设备调用的驱动程序 DLL。
HKEY_LOCAL_MACHINE\Drivers\BuiltIn\SampleDev 表示该注册表存在于CE系统注册表的 HKEY_LOCAL_MACHINE\Drivers\BuiltIn\SampleDev 目录下。
3. 创建Makefile和Sources和.def文件
这三个文件主要是来控制编译的,Makefile 和 .def 文件实现比较简单,Sources 文件相对比较复杂。
Makefile 只需要这样一行!INCLUDE $(_MAKEENVROOT)\makefile.def ,具体的实现什么任务还不知道。
.def 文件定义需要输出的函数,这些函数能够被其它代码用动态加载的方法调用。
Sources 这个文件很重要,内容也多,最基本的一个文件该有如下内容。
TARGETNAME=MyDev(指定要生成的动态库的名称)
TARGETTYPE=DYNLINK(指定要生成的是一个动态库)
TARGETLIBS=$(_COMMONSDKROOT)\lib\$(_CPUINDPATH)\coredll.lib \
$(_COMMONOAKROOT)\lib\$(_CPUINDPATH)\ceddk.lib
(下面两项指定需要与哪些动态库链接,一般要第一项就足够了)
DLLENTRY=DllEntry(指定动态库的入口函数)
SOURCES= (请在这写上你所有源文件的名字,它们将会被编译)
转载于:https://www.cnblogs.com/gmh915/archive/2009/01/08/1945444.html