流驱动如何接收 UserIdle 消息
扫描二维码
随时随地手机看文章
最近在做电源管理,初识 WINCE 对电源管理只知道 ON UserIdle SystemIdle Suspend 这几种状态(初学,写错希望高手指点)。
最初的想法是在 UserIdle 的地方只关背光,但是不知道如何下手,还是 GOOGLE 帮了大忙,不断的 GOGO 哈哈。
最后发现
建立支持电源管理的设备驱动
为了建立一个能够对设备进行电源管理的驱动程序,我们必须首先建立一个支持non-COM-related设备接口的驱动程序。non-COM-related设备接口标明这个设备是支持电源管理的。可以用以下方式建立这种接口:
l 可以在注册表中,用激活设备所用的IClass值定义接口;
l 可以在驱动程序的Init函数中,设置注册表中的IClass值;
l 可以使用ActivateDeviceEx的参数REGINI设置IClass值;
l 可以在驱动程序中显示地调用AdvertiseInterface函数。
电源管理器通过IOCTL代码来和驱动通信。通常情况下,当一个驱动程序声明为支持电源管理时,驱动只需要在DeviceIoControl中实现电源的管理即可。下面是电源管理器用来与驱动通信的IOCTL代码:
l IOCTL_POWER_CAPABILITIES:代表电源管理器请求设备驱动返回设备支持的电源状态及相关特征;
l IOCTL_POWER_SET:请求驱动更新设备的电源状态;
l IOCTL_POWER_QUERY:电源管理器询问设备是否准备好进行状态切换;
l IOCTL_POWER_GET:请求驱动返回当前设备的电源状态;
l IOCTL_REGISTER_POWER_RELATIONSHIP:通知父设备注册所有它所控制的设备。
其中IOCTL_POWER_CAPABILITIES和IOCTL_POWER_SET是支持电源管理的设备驱动必须实现的。
可以知道系统在进入 UserIdle 的时候会给流驱动发一个IOCTL_POWER_SET消息,通过IOCTL 来接收。
但是只设置 IOCTL 的 IOCTL_POWER_SET 消息是不够的,
在流驱动的注册表里面需要加入 PM类入口 "IClass"="{A32942B7-920C-486b-B0E6-92A702A99B35}"
这样基本 OK 了, 有待测试,
现介绍到这里,睡觉啦,
明天继续。