设备管理器设备管理器简介设备的初始化设备的管理设备管理器简介Device.exe是WindowsCE中的设备管理器(DeviceManager)。负责对几乎所有的外设驱动程序进行管理。设备管理器的功能为驱动程序(DLL文件)提供宿主进程;管理驱动程序,负责加载、初始化、卸载驱动程序;在特殊驱动事件发生时对其他应用程序发出通知;实现并暴露设备管理相关的API函数;提供电源管理的接口;负责对I/O资源进行管理。设备的初始化设备初始化的两个阶段Device.exe本身的初始化;外设的枚举和加载。Device.exe本身的初始化NK根据注册表HKEY_LOCAL_MACHINE\init下的内容启动进程Device.exeDevice.exe初始化本身的一些数据结构Device.exe初始化I/O资源管理器和电源管理器Device.exe加载BusEnum.dll,控制权就交给了BusEnum.dll,Device.exe本身的初始化结束外设的枚举和加载这个阶段也称为总线枚举(BusEnumeration),此阶段的绝大部分工作是由总线枚举器(BusEnum.dll),由它负责加载和初始化所有的内置外设。它的源代码是公开的,在%_WINCEROOT%\PUBLIC\COMMON\OAK\DRIVERS\BUSENUM\BUSENUM\下总线枚举的过程内核Device.exeBusEnum.dll加载加载BusEnum.dll(加载ISA设备驱动)BusEnum.dll加载NE2000.dllXXX.dll加载PCI设备驱动总线枚举器的位置Device.exe会在注册表[HKEY_LOCAL_MACHINE\Drivers\RootKey]下面读取总线枚举器的位置。RootKey的值是总线递归遍历的“根”。如果RootKey的值为Drivers\BuildIn,那么总线枚举器的信息就存放在[HKEY_LOCAL_MACHINE\Drivers\BuiltIn]下。ActivateDeviceExActivateDeviceEx负责加载驱动程序,并将驱动程序的注册值添加到注册表的Active项中。ActivateDevice函数根据注册表的信息,把对应的驱动DLL加载到Device.exe的地址空间内;然后在注册表HKEY_LOCAL_MACHINE\Drivers\Active键下面添加一个子键,来记录已经加载的驱动程序。HANDLEActivateDeviceEx(LPCWSTRlpszDevKey,//注册表的路径LPCVOIDlpRegEnts,//要添加到注册表Active中的附加信息DWORDcRegEnts,//lpRegEnts的个数LPVOIDlpvParam//附加信息,会被作为参数传递给驱动的xxx_Init);设备的管理设备驱动程序被设备管理器加载后,设备管理器负责对设备进行一系列管理,主要涉及:设备的枚举通过名称访问设备对应用程序的通知设备的名称管理应用程序访问驱动最常用的方法:通过文件系统API函数(例如CreateFile()),将文件I/O函数的调用转化为对设备相应函数的访问。如果用CreateFile()函数打开某个设备驱动,则CreateFile()函数的第1个参数是设备的名字。设备的命名方式传统设备命名:3个大写的英文字母+0~9设备挂载点命名:\$device\+3个大写的英文字母+数字总线挂载点命名:\$bus\+总线名称、总线号、设备号和功能号应用程序的通知在编写应用程序时,如果需要用到某个设备,则经常要知道某个设备是否就绪。驱动程序和设备就绪时,向应用程序发送通知。设备管理器提供了专门的函数,负责向应用程序发送驱动通知:HANDLERequestDeviceNotifications(constGUID*devclass,//设备的IClassHANDLEhMsgQ,//消息队列的句柄BOOLfAll//是否发送所有通知);BOOLStopDeviceNotifications(HANDLEh//RequestDeviceNotifications打开的句柄);接口类(InterfaceClass)驱动程序的接口有以下特征每一个Iclass有一个GUID,一个名字GUID描述类设备接口Name描述接口的实例COM1:,DSK1:等等提供一个驱动接口在注册表中的Iclass子键驱动程序发布接口–AdvertiseInterface应用程序访问接口–RequestDeviceNotifications每个已有的接口的预定义GUIDA32942B7-920C-486b-B0E6-92A702A99B35驱动的加载过程1.当Device.exe对设备驱动程序进行安装时将在注册表的[HKEY_LOCAL_MACHINE]\Drivers项下检查一个字符串,其值为RootKey,传统地,其名字为BuiltIn。2.然后设备管理器在进行初始化时使用注册信息检查器为它需要安装的各个驱动读取值为RootKey的键。驱动的加载过程驱动的加载过程3.安装DLL,给每一个驱动创建一个Active键,然后调用ActivateDevice或者ActivateDeviceEx将DLL注册为系统中的一个设备驱动程序。4.ActivateDevice在[HKEY_LOCAL_MACHINE\Drivers\Active下创建一个新的键值。驱动的加载过程驱动加载API设备驱动程序也能通过应用程序进行手动的安装,这是ActivateDeviceEx的一个首选的功能。安装驱动一个更老的方法是使用RegisterDevice与DeregisterDevice驱动是如何工作的1.WhenCE启动时,Device.exe根据注册表中的设置安装所有的驱动程序。2.当安装mydriver.dll时,device.exe调用DEM1_Init。3.Application程序调用CreateFile(“DEM1”…)驱动是如何工作的4.Coredll.dll处理API调用并切换到device.exe5.Device.exe调用mydriver.dll的DEM1_Open。6.CreateFile返回DEM1_Open的retval