设备管理器是在Windows CE下运行的一个进程,来跟踪加载的驱动和它们的接口。它由内核加载并持续运行。设备管理器可以在设备接口变得可用和不可用时通知用户。用户或者系统自身可以使得设备接口可用或不可用。另外,设备管理器通知内核设备接口支持文件操作,例如CreateFile,来操作那些导出流接口的设备。设备管理器向设备驱动发送电源通知回调并且提供电源管理服务。
设备管理器控制注册表的Active键。仅设备管理器可以对Active键进行读写操作。你可以通过设备驱动初始化函数的一个参数来对Active键进行间接操作。
设备管理器搜索HKEY_LOCAL_MACHINE/Drivers/RootKey来决定开始加载驱动的注册表键。RootKey的默认值是Drivers但通常等于Drivers/BuiltIn。设备管理器调用ActivateDeviceEx来加载由RootKey键的Dll子键值决定的驱动。Dll子键的默认值是BusEnum.dll,也称为总线枚举器。加载BusEnum.dll会引起所有设备驱动的加载。通过ActivateDeviceEx加载的设备可以从Active注册表键中获取它的激活句柄。
当设备管理器加载时,它也可以加载I/O资源管理器来从注册表中读取一个可用资源列表。
设备管理器跟踪驱动的接口并且支持基于GUID(globally unique identifier)的驱动查找。IClass接口可以把接口GUID与驱动名字,设备名字或总线名字联系起来。例如,COM1:, $device/com1, or $bus/pci_0_3_0。
驱动可以调用DMAdvertiseInterface广播接口(advertise interfaces)。DMAdvertiseInterface使得驱动在它们的列表中增加GUIDs。DMAdvertiseInterface是被Devmgr.dll导出的,它同时也实现了设备管理器的大多数函数。只有设备驱动可以调用DMAdvertiseInterface,因为只有设备管理器可以加载Devmgr.dll。如果当驱动卸载时,设备驱动不广播那些不可用的接口,设备管理器将自动清除接口广播信息。
设备管理器组成
设备管理器由Device.exe和 Devmgr.dll组成。Device.exe包含Devmgr.dll,Devmgr.dll实现设备管理器的核心功能。因为设备管理器由两个独立的模块组成,设备驱动可以直接与设备管理器链接并且调用特定函数,例如DMAdvertiseInterface,而不用导致上层的系统调用。
下表为设备管理器的组成部分。
组成部分 | 描述 |
devcore | 提供设备管理器的核心功能 |
iorm | 提供I/O资源管理器的功能。Iorm 是必须的部分,不能被移除。 |
pmif nopmif | Pmif 提供电源管理器的入口点接口。 Nopmif 提供电源管理器的存根版本(stubbed version)的入口点。 |