wince驱动学习之基本知识

来源:互联网 发布:紫砂壶淘宝店推荐 编辑:程序博客网 时间:2024/06/08 18:21

一 wince将驱动分为三类:本机驱动(native)、总线驱动(bus)和流接口驱动(stream interface)。

本机驱动是那些被硬件所需且由OEM创建的驱动(问题:流接口驱动是否是本机驱动的一种呢?),它们有键盘、触摸屏和音频,一般没有通用的接口(如init函数)。

总线驱动管理系统总线,如PCI总线;在wince中,PCMCIA、CompactFlash和SDIO也被认为是总线。它负责询问总线上的硬件来确定安装了何种硬件并分配资源。

流接口驱动可由第三方提供来支持其硬件。

二 驱动的装载过程:

1 device.exe搜索[HKEY_LOCAL_MACHINE\Drivers]下是否存在RootKey,该值表示系统启动时需要装载的驱动列表,一般为BuildIn(问题:如果没有,怎么办?)。同时还会检查DLL是否存在,若存在,则用这个DLL来装载所有的驱动,否则则用regenum.dll来装载所有的驱动。我们称这个dll为register enumerator。

2 device.exe使用register enumerator来读取RootKey中的所有驱动,在每个驱动中有四个键,分别为DLL,Order,Prefix和Index。当然可能还有一些驱动程序所需的配置信息。

3 当DLL被装载时,register enumerator会创建一个Active键并调用ActivateDevice或ActivateDeviceEx来注册驱动的dll。

4 ActivateDevice会在[HKEY_LOCAL_MACHINE\Drivers\Active]下创建一个键并初始化(使用上一步创建的Active键),然后调用RegisterDevice来完成装载过程。

5 RegisterDevice调用LoadDevice函数将驱动装载进RAM。

6 LoadDevice将整个dll装入RAM并锁住内存页。

7 RegisterDevice试图得到dll提供的10个API函数,它们是Init,Deinit,Open,Close,Read,Write,Seek,IOControl,PowerUp和PowerDown。一旦得到了这些函数指针,RegisterDevice调用驱动的Init函数初始化驱动,若返回非0,则RegisterDevice将其加入设备链并返回;否则,RegisterDevice卸载驱动并报告驱动初始化失败。

上述过程是一个标准化的装载过程,但这个过程可以用下面两种方法来改变:

1 增加一个Flag到注册表中,这个Flag的有效值有DEVFLAGS_UNLOAD、DEVFLAGS_LOADLIBRARY、DEVFLAGS_NOLOAD和DEVFLAGS_NAKEDENTRIES。

2 第二种方法是增加一个Entry到注册表中,如果有这个键,在第3步时register enumerator不再调用ActivateDevice而调用这个Entry函数;当有这个键时,另外一个名为Keep的键也应该增加,它将防止dll被卸载。(个人认为,这个方法可用于装载纯资源的dll)。

另外,application也可以直接调用ActivateDeviceEx函数来加载驱动。

三 列出所有已加载的驱动

1 使用函数FindFirstFileEx和FindNextFile来列出所有已加载的驱动。

2 使用注册表函数直接查询[HKEY_LOCAL_MACHINE\Drivers\Active]来列出所有已加载的驱动。

四 读写设备驱动

对流接口驱动而言,使用文件系统的函数OpenFile、ReadFile、WriteFile和CloseHandle来操作驱动,当然也使用DeviceIoControl函数来操作驱动。