《设备管理器.ppt》由会员分享,可在线阅读,更多相关《设备管理器.ppt(19页珍藏版)》请在三一文库上搜索。
1、设备管理器,设备管理器简介 设备的初始化 设备的管理,设备管理器简介,Device.exe是Windows CE中的设备管理器(Device Manager)。负责对几乎所有的外设驱动程序进行管理。 设备管理器的功能 为驱动程序(DLL文件)提供宿主进程; 管理驱动程序,负责加载、初始化、卸载驱动程序; 在特殊驱动事件发生时对其他应用程序发出通知; 实现并暴露设备管理相关的API函数; 提供电源管理的接口; 负责对I/O资源进行管理。,设备的初始化,设备初始化的两个阶段 Device.exe本身的初始化; 外设的枚举和加载。,Device.exe本身的初始化,NK根据注册表HKEY_LOCAL
2、_MACHINEinit 下的内容启动进程Device.exe,Device.exe初始化本身的一些数据结构,Device.exe初始化I/O资源管理器和电源管理器,Device.exe加载BusEnum.dll,控制权就交给了 BusEnum.dll,Device.exe本身的初始化结束,外设的枚举和加载,这个阶段也称为总线枚举(Bus Enumeration),此阶段的绝大部分工作是由总线枚举器(BusEnum.dll),由它负责加载和初始化所有的内置外设。 它的源代码是公开的,在%_WINCEROOT%PUBLICCOMMONOAKDRIVERSBUSENUMBUSENUM下,总线枚举的
3、过程,内核,Device.exe,BusEnum.dll,加载,加载,BusEnum.dll (加载ISA设备驱动),BusEnum.dll,加载,NE2000.dll,XXX.dll,加载PCI设备驱动,总线枚举器的位置,Device.exe会在注册表HKEY_LOCAL_MACHINEDriversRootKey下面读取总线枚举器的位置。RootKey的值是总线递归遍历的“根”。如果RootKey的值为DriversBuildIn,那么总线枚举器的信息就存放在HKEY_LOCAL_MACHINEDriversBuiltIn下。,ActivateDeviceEx,ActivateDevice
4、Ex负责加载驱动程序,并将驱动程序的注册值添加到注册表的Active项中。 ActivateDevice函数根据注册表的信息,把对应的驱动DLL加载到Device.exe的地址空间内;然后在注册表HKEY_LOCAL_MACHINEDriversActive键下面添加一个子键,来记录已经加载的驱动程序。 HANDLE ActivateDeviceEx ( LPCWSTR lpszDevKey, /注册表的路径 LPCVOID lpRegEnts, /要添加到注册表Active中的附加信息 DWORD cRegEnts, /lpRegEnts的个数 LPVOID lpvParam /附加信息,会
5、被作为参数传递给驱动的xxx_Init );,设备的管理,设备驱动程序被设备管理器加载后,设备管理器负责对设备进行一系列管理,主要涉及: 设备的枚举 通过名称访问设备 对应用程序的通知,设备的名称管理,应用程序访问驱动最常用的方法:通过文件系统API函数(例如CreateFile(),将文件I/O函数的调用转化为对设备相应函数的访问。 如果用CreateFile()函数打开某个设备驱动,则CreateFile()函数的第1个参数是设备的名字。 设备的命名方式 传统设备命名:3个大写的英文字母+09 设备挂载点命名:$device+ 3个大写的英文字母+数字 总线挂载点命名: $bus+总线名称
6、、总线号、设备号和功能号,应用程序的通知,在编写应用程序时,如果需要用到某个设备,则经常要知道某个设备是否就绪。驱动程序和设备就绪时,向应用程序发送通知。 设备管理器提供了专门的函数,负责向应用程序发送驱动通知: HANDLE RequestDeviceNotifications( const GUID* devclass, /设备的IClass HANDLE hMsgQ, /消息队列的句柄 BOOL fAll /是否发送所有通知 ); BOOL StopDeviceNotifications( HANDLE h / RequestDeviceNotifications打开的句柄 );,接口类
7、(Interface Class),驱动程序的接口有以下特征 每一个Iclass有一个GUID,一个名字 GUID描述类设备接口 Name 描述接口的实例 COM1:, DSK1: 等等 提供一个驱动接口 在注册表中的Iclass子键 驱动程序发布接口 AdvertiseInterface 应用程序访问接口 RequestDeviceNotifications 每个已有的接口的预定义GUID A32942B7-920C-486b-B0E6-92A702A99B35,驱动的加载过程,当Device.exe对设备驱动程序进行安装时将在注册表的HKEY_LOCAL_ MACHINEDrivers项下
8、检查一个字符串,其值为 RootKey,传统地,其名字为 BuiltIn 。 然后设备管理器在进行初始化时使用注册信息检查器为它需要安装的各个驱动读取值为RootKey的键。,驱动的加载过程,驱动的加载过程,安装DLL,给每一个驱动创建一个Active 键,然后调用ActivateDevice 或者 ActivateDeviceEx将DLL注册为系统中的一个设备驱动程序。 ActivateDevice在 HKEY_LOCAL_MACHINEDriversActive下创建一个新的键值。,驱动的加载过程,驱动加载API,设备驱动程序也能通过应用程序进行手动的安装,这是ActivateDeviceEx的一个首选的功能。 安装驱动一个更老的方法是使用RegisterDevice 与 DeregisterDevice,驱动是如何工作的,When CE启动时, Device.exe根据注册表中的设置安装所有的驱动程序。 当安装mydriver.dll时, device.exe 调用 DEM1_Init。 Application程序调用CreateFile(“DEM1”),驱动是如何工作的,Coredll.dll 处理API调用并切换到 device.exe Device.exe 调用mydriver.dll 的DEM1_Open。 CreateFile返回DEM1_Open的retval,