流驅(qū)動(dòng)如何接收 UserIdle 消息
最近在做電源管理,初識(shí) WINCE 對(duì)電源管理只知道 ON????? ?UserIdle????? SystemIdle??? Suspend? 這幾種狀態(tài)(初學(xué),寫(xiě)錯(cuò)希望高手指點(diǎn))。
?
最初的想法是在?? UserIdle 的地方只關(guān)背光,但是不知道如何下手,還是 GOOGLE 幫了大忙,不斷的 GOGO 哈哈。
最后發(fā)現(xiàn)
建立支持電源管理的設(shè)備驅(qū)動(dòng)
為了建立一個(gè)能夠?qū)υO(shè)備進(jìn)行電源管理的驅(qū)動(dòng)程序,我們必須首先建立一個(gè)支持non-COM-related設(shè)備接口的驅(qū)動(dòng)程序。non-COM-related設(shè)備接口標(biāo)明這個(gè)設(shè)備是支持電源管理的。可以用以下方式建立這種接口:
????l????????? 可以在注冊(cè)表中,用激活設(shè)備所用的IClass值定義接口;
????l????????? 可以在驅(qū)動(dòng)程序的Init函數(shù)中,設(shè)置注冊(cè)表中的IClass值;
????l????????? 可以使用ActivateDeviceEx的參數(shù)REGINI設(shè)置IClass值;
????l????????? 可以在驅(qū)動(dòng)程序中顯示地調(diào)用AdvertiseInterface函數(shù)。
電源管理器通過(guò)IOCTL代碼來(lái)和驅(qū)動(dòng)通信。通常情況下,當(dāng)一個(gè)驅(qū)動(dòng)程序聲明為支持電源管理時(shí),驅(qū)動(dòng)只需要在DeviceIoControl中實(shí)現(xiàn)電源的管理即可。下面是電源管理器用來(lái)與驅(qū)動(dòng)通信的IOCTL代碼:
????l????????? IOCTL_POWER_CAPABILITIES:代表電源管理器請(qǐng)求設(shè)備驅(qū)動(dòng)返回設(shè)備支持的電源狀態(tài)及相關(guān)特征;
????l????????? IOCTL_POWER_SET:請(qǐng)求驅(qū)動(dòng)更新設(shè)備的電源狀態(tài);
????l????????? IOCTL_POWER_QUERY:電源管理器詢(xún)問(wèn)設(shè)備是否準(zhǔn)備好進(jìn)行狀態(tài)切換;
????l????????? IOCTL_POWER_GET:請(qǐng)求驅(qū)動(dòng)返回當(dāng)前設(shè)備的電源狀態(tài);
????l????????? IOCTL_REGISTER_POWER_RELATIONSHIP:通知父設(shè)備注冊(cè)所有它所控制的設(shè)備。
其中IOCTL_POWER_CAPABILITIES和IOCTL_POWER_SET是支持電源管理的設(shè)備驅(qū)動(dòng)必須實(shí)現(xiàn)的。
?
?
可以知道系統(tǒng)在進(jìn)入 UserIdle 的時(shí)候會(huì)給流驅(qū)動(dòng)發(fā)一個(gè)IOCTL_POWER_SET消息,通過(guò)IOCTL 來(lái)接收。
但是只設(shè)置 IOCTL 的 IOCTL_POWER_SET 消息是不夠的,
在流驅(qū)動(dòng)的注冊(cè)表里面需要加入 PM類(lèi)入口 "IClass"="{A32942B7-920C-486b-B0E6-92A702A99B35}"
這樣基本 OK 了, 有待測(cè)試,
現(xiàn)介紹到這里,睡覺(jué)啦,
明天繼續(xù)。
?
?
?
?