Chinaunix首页 | 论坛 | 博客
  • 博客访问: 444817
  • 博文数量: 50
  • 博客积分: 2635
  • 博客等级: 少校
  • 技术积分: 760
  • 用 户 组: 普通用户
  • 注册时间: 2008-03-16 14:02
文章分类

全部博文(50)

文章存档

2013年(3)

2012年(18)

2011年(7)

2009年(1)

2008年(21)

我的朋友

分类: WINDOWS

2008-09-04 11:22:40

流接口驱动

Windows CE.Net 支持四种驱动模型:本地驱动、流驱动、USB、NDIS。本文只针对流驱动进行介绍。

1 流接口驱动体系结构

流驱动将设备抽象为文件进行操作,它体系结构如图1所示。应用程序使用文件API对设备进行访问,文件API被操作系统转发到FileSys.exe进程中;然后FileSys.exe发现是对设备进行操作,就会把执行交给设备管理器;接着设备管理器根据具体的请求,调用不同的流接口驱动程序中暴露的接口;最终驱动程序负责与硬件交互。

图1流接口驱动的体系结构

2 流接口函数

流接口驱动程序是动态连接库,由设备管理程序的特殊程序加载、管理和卸载,与具有单独目的接口的内部驱动程序相比,流接口驱动程序使用同一个接口并调用同一个函数集-流接口函数[4]。Windows CE.Net 系统规定流接口的入口点如表1,对应着直接或者间接调用流接口函数的系统组件或文件API函数。生成一个DLL后,就用设备文件名前缀替换入口点名字中的XXX。

表1 流接口入口函数

流接口函数

功能描述

调用流接口对象

XXX_Init()

初始化设备

系统设备管理器

XXX_Denit()

卸载设备

系统设备管理器

XXX_Open()

打开设备进行读写操作

文件API函数CreateFile()

XXX_Close()

关闭设备

文件API函数CloseHandle()

XXX_Read()

读取设备数据

文件API函数ReadFile()

XXX_Write()

向设备写数据

文件API函数WriteFile()

XXX_IOControl()

对设备进行各种操作

文件API函数DeviceIOControl()

XXX_Seek()

移动设备数据的指针位置

文件API函数SetFilePointer()

XXX_PowerDown()

使设备休眠

系统电源管理器

XXX_PowerUp()

恢复设备电源

系统电源管理器

3 流接口驱动工作原理

在流驱动工作原理中需要包括几个重要的工作实体:硬件、流接口驱动驱动程序、系统注册表、设备管理器、应用程序。整个驱动程序工作原理如图2所示。

图2 流驱动工作原理顺序图

流驱动的工作顺序如下:

1)加载驱动。在当系统启动时,设备管理器搜寻注册表的HKEY_LOCAL_MACHINE\Driver\BuiltIn键下面的子键,并逐一加载子键下的每个驱动,此过程叫BusEnum。

2)设备管理器从注册表的dll键值中获取驱动程序所在的DLL文件名。

3)设备管理器调用LoadDriver()函数把DLL加载到自己的虚拟地址空间内。

4)设备管理器在注册表的HKEY_LOCAL_MACHINE\Driver\Active下面,记录所有已经加载的驱动程序[2]

5)设备管理器调用驱动中的XXX_Init()函数。

6)在XXX_Init()中,通常对硬件进行一些基本的初始化操作。通过以上6步,流接口驱动被成功加载。

7)应用程序使用该设备。首先它调用CreateFile()打开设备。CreateFile()是在FileSys.exe中实现的。但是FileSys.exe只作简单判断,如果发现打开的设备驱动程序而不是一个文件,那么就重新把主动权交还给设备管理器。

8)设备管理器调用驱动程序中的XXX_Open()函数打开设备。在XXX_Open()中,驱动程序可能会对硬件进行一些额外的初始化工作,使硬件进入工作状态。

9)XXX_Open()函数把打开设备的结果返回给设备管理器。

10)设备管理器把XXX_Open()返回的结果,再返回给应用程序的CreateFile()函数调用。通过7-10步,设备已被成功打开,至此就可以对设备进行读写和控制操作。

11)应用程序使用第7步CreateFile()函数返回的句柄作为 ReadFile() / WriteFile()的第一个参数,向设备发送读请求。同样ReadFile() / WriteFile()要经过FileSys.exe转发给设备管理器。

12)设备管理器调用驱动程序中的XXX_Read() / XXX_Write() 函数,读取设备的数据信息或向设备写信息。

13)在流驱动程序中,XXX_Read() / XXX_Write() 函数可与硬件交互,从硬件中读取必要的信息或向硬件写必要的信息。然后返回给设备管理器,再返回给应用程序。

当应用程序不再使用该设备时,它可调用CloseHandle()将设备关闭。当系统不再使用设备时,应用程序可调用DeactivateDevice()函数把该驱动程序卸载。


阅读(4062) | 评论(4) | 转发(0) |
给主人留下些什么吧!~~

nacichan2009-05-25 23:34:00

这两个函数是在系统睡眠与唤醒的过程被调用的。 当然需要做下面两件事情, 首先,在驱动的注册表中增加扶持PM的ICLASS值。 然后,在XXX_IOControl()函数中编写与PM相关的几个操作码。

chinaunix网友2009-05-20 11:00:12

你好,请问powerup 与powerdown 函数是何时调用,我通过串口观察没有发现有被调用到

nacichan2009-03-13 21:21:31

请仔细阅读下文中的流驱动的工作顺序,自然可以找到答案。

chinaunix网友2009-03-08 08:37:32

您好,想问一下,我现在写了一个驱动,内核编译完之后,我用viewbin确实也在内核里看到了我写的dll。 现在问题是,我不知道怎么测试这个dll 如何调用这个dll呢?? 还请指教。 我的邮箱:yolon3000@163.com