阅读:1222回复:3
求教!流接口设备的电源管理。
如题。
关于流接口设备的电源管理,是否只需在其注册表中添加IClass键值,然后在其XXX_PowerOff和XXX_PowerOn()中添加相应的开关设备的代码即可呢? IClass值的设置是否有影响呢?像流接口设备,我想应该是设成"{A32942B7-920C-486b-B0E6-92A702A99B35}"吧。 其他的地方还有要改动或添加的吗?(我试了一下只在这两个地方改动,但XXX_PowerOff()函数未执行)。希望各位大哥大侠多多提点,还应该做些什么? |
|
|
沙发#
发布于:2007-10-21 21:44
这个与ICLASS无关,
POERDOWN在系统进入POWEROFF模式时才被调用,平常并不被调用. 可以实现一个IOCTL名字叫什么我记不清了,去实现D0到D4几种电源状态. |
|
|
板凳#
发布于:2007-10-24 09:34
谢谢microsun大哥的回复。
这两天看了一下电源管理的结构,大致明白了它的流程。 但还是有些问题不大明白。 关于XXX__IOControl()函数,我参照了一下\PUBLIC\COMMON\OAK\DRIVERS\PM\TEST\DEVSAMPLE中的样例,用到了我的设备驱动中。 在样例中定义了这么一个结构: // this structure keeps track of each device instance typedef struct _DeviceState_tag { CRITICAL_SECTION csDevice; // serialize access to this device's state HANDLE hevStop; // when signaled, the device thread exits HANDLE htDevice; // device thread handle HANDLE htActivity; // activity generating thread TCHAR szName[16]; // should be of the format"PDXn" (no colon) CEDEVICE_POWER_STATE CurrentDx; // current power level DWORD dwInactivityTimeout; // in ms DWORD dwMaxActivityTimeout; // in ms BOOL fBoostRequested; // TRUE if we request a power state increase BOOL fReductionRequested; // TRUE if we request a power state decrease } DEVICESTATE, *PDEVICESTATE; 用它来定义一个变量PDEVICESTATE pds = (PDEVICESTATE) dwContext;(dwContext为XXX__IOControl的第一个参数)但是一用到pds,就会出错。(比如在IOCTL_POWER_SET中会把当前设备的电源状态保存在pds->CurrentDx中) Data Abort: Thread=8bd7cbd4 Proc=89a872a0 'device.exe' AKY=00000005 PC=03f7c588(coredll.dll+0x0001c588) RA=025917cc(poweroff.dll+0x000017cc) BVA=06000005 FSR=00000001 RaiseException: Thread=8bd7cbd4 Proc=89a872a0 'device.exe' AKY=00000005 PC=03f7e068(coredll.dll+0x0001e068) RA=88219d88(NK.EXE+0x00019d88) BVA=00000003 FSR=00000003 这是什么原因呢? |
|
|
地板#
发布于:2007-10-24 14:20
SD部分的电源管理始终不起作用,不知道是什么原因。
"IClass"=multi_sz:"{A4E7EDDA-E575-4252-9D6B-4195D48BB865}", "{A32942B7-920C-486b-B0E6-92A702A99B35}" 注册表中这样设置了,但加载驱动DLL时都不会调用 IoControl()函数。 哪位兄弟可遇到过这样的情况,还望指点一二!谢谢了! |
|
|