流驱动如何接收 UserIdle 消息

来源:互联网 发布:英雄联盟网络延迟300 编辑:程序博客网 时间:2024/04/29 19:54

最近在做电源管理,初识 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_CAPABILITIESIOCTL_POWER_SET是支持电源管理的设备驱动必须实现的。

 

 

可以知道系统在进入 UserIdle 的时候会给流驱动发一个IOCTL_POWER_SET消息,通过IOCTL 来接收。

但是只设置 IOCTL 的 IOCTL_POWER_SET 消息是不够的,

在流驱动的注册表里面需要加入 PM类入口 "IClass"="{A32942B7-920C-486b-B0E6-92A702A99B35}"

这样基本 OK 了, 有待测试,

现介绍到这里,睡觉啦,

明天继续。

 

 

 

 

原创粉丝点击