如何將 ap 開機執行時,可優先其他程式提前被執行。

主題: 如何將 ap 開機執行時,可優先其他程式提前被執行。



Q: 想要在WinCE 開機後,強迫使用者一定要先使用我的ap,所以想要把一些按鍵disable掉。我目前可以

把ESC跟ENTER兩個按鍵鎖住,避免使用者關掉我的AP, 下一步是想要把taskbar disable,讓使用者無法

去執行,請問有什麼方法可以達到呢 ?



A: 首先要瞭解到 task bar 是那個 process(通常是 explorer.exe),然後要知道它是怎麼被 launch的



it is launched with following registry by kernel


[HKEY_LOCAL_MACHINE\init]
"Launch50"="explorer.exe"
"Depend50"=hex:14,00, 1e,00

- LaunchXX 是代表此process 的 launch sequence
- DependXX 則是說明,LaunchXX要等待那些 process ready,所以value 裡列出的 LaunchYY 還沒準備

好前,LaunchXX 是不會被啟動的。


由此可知 explorer 的 Seq 是 50,他會等待Lanch20 (0x14) 跟 Launch30 (0x1e) 完成才會被呼叫,也

就是 device.exe (20/0x14) 和 gwes.exe (30/0x1e)。


[HKEY_LOCAL_MACHINE\init]
"Launch20"="device.exe"
"Launch30"="gwes.exe"
"Depend30"=hex:14,00


那再來就是 kernel 怎麼知道被 depend 的 process ready 了沒,此部份是由 SignalStarted API 所提

供的,基本上就是被 launch 的 ap 要在適當時間, invoke SignalStarted,並通知 kernel 這個ap已

經開始並初始化了。

所以此問題可以這樣做,假設你的ap 叫 YourApp.exe,那可以加上以下的 registry

[HKEY_LOCAL_MACHINE\init]
"Launch49"="YourApp.exe"
"Depend49"=hex:14,00, 1e,00 ; depend on devmgr and GWES
"Depend50"=hex:14,00, 1e,00, 31, 00 ; 並且讓 explorer depends 你的AP

這樣一來你的 ap 會先被 載入,然後做你要做的工作,完成你的工作後再 invoke SignalStarted,不然

可選擇完成工作後 shutdown system。


BTW, SignalStarted 會需要一個參數:該ap的sequence number,假如是 Launch49 那你的 Seq number

就是 49,當然 hard coded 不是一個好的辦法, 事實上每個 LaunchXX 的 ap 被啟動時, kernel 都會

把 Seq number 以 command parameter 的方式 傳進去,也就是會由 WinMain 的 lpCmdLine 傳進來。

關於 SignalStarted 的實例可參考:

$(_WINCEROOT)\public\shell\OAK\HPC\EXPLORER\MAIN\explorer.cpp
$(_WINCEROOT)\public\common\SDK\SAMPLES\CELOG\FLUSH\CELOGFLUSH\flush.c

And here's the source code for a basic gate app:

extern "C" DWORD WaitForAPIReady(DWORD, DWORD);
extern "C" BOOL IsAPIReady(DWORD hAPI);

int _tmain(int argc, _TCHAR* argv[])
{
// quick sanity check - HKLM\Init will send in our order number
if(argc == 0) return 0;

BOOL success = FALSE;

// wait for window manager - that should be enough for us
#if _WIN32_WCE > 0x500
success = (WaitForAPIReady(SH_WMGR, 5000) == WAIT_OBJECT_0);
#else
int i = 0;
while((! IsAPIReady(SH_WMGR)) && (i++ < 50))
{
Sleep(100);
}

success = (i < 50);
#endif

if(success)
{
int launchCode = _ttoi(argv[1]);
SignalStarted(launchCode);
}
else
{
RETAILMSG(TRUE, (_T("CFInitGate timed out - SH_WMGR was not ready after 5

seconds
")));
}

return 0;
}

http://forums.microsoft.com/MSDN-CHT/ShowPost.aspx?PostID=1720833&SiteID=14
http://msdn.microsoft.com/en-us/library/ms924527.aspx



device.exe:是設備管理器,管理內核模式設備驅動程式,也就是所有驅動程式所運行的進程。

device.exe為每個驅動程式創建一個線程,是系統級進程,不能停止。
gwes.exe:它是指圖形、開窗口和事件子系統 (GWES) 負責所有圖形輸出以及與用戶的所有交互。駐留在

GWES 地址空間中的驅動程式包括顯示驅動程式、鍵盤驅動程式、滑鼠驅動程式和觸摸屏驅動程式。是系

統級進程不能停止。
FileSys.exe:是系統註冊表核心進程,管理著註冊表、文件系統和屬性數據庫,是系統級進程,不能停

止。
services.exe:是系統服務的主進程,用於配置服務的命令行接口,為操作用戶提供各種操作服務接口,

是系統級進程,不能停止。
shell32.exe:它是指動態鏈結庫函數啟動器,相當於PC中的Rundll32.dll和EXPLORER.exe,是系統級進

程,不能停止。
quickmenu.exe quickmenu軟件進程,(開始菜單增強) 可停止(不過停止了你裝他幹嗎?)
poutlook.exe 系統進程,同步及信息管理 可停止(但同步或者使用信息後會自動打開) PIM

管理(日程、聯繫人)
ConnMgr.exe:英文全稱是Connection Manager,就是系統管理連接的(是WLAN,Irda的類),是系統級

進程,不能停止
tramon.exe GPRS流量管理軟件,如果你不用GPRS,而裝的ROM裡又集成的話可以停止
sapsettings.exe 不知道幹嗎用的,(貌似鈴聲控制類的)請知道告訴一下,可停止
cprog.exe:它是電話程式,系統為用戶提供一種電話服務的功能,是系統級進程,不能停止。
trayicon_mannermode.exe 系統進程,管理系統托盤圖標,不可停止。
rnaapp.exe 系統進程,管理撥號 可停止(後果未知)
udp2tcp.exe 系統進程,用戶數據服務協議,不可停止
rapiclnt.exe 系統進程,同步管理類,同步後自動打開
tmail.exe PPC電話進程,郵件、短信、彩信進程管理器,可停止(不建議)
NK.exe:是系統(內核),相當於PC中的winlogon.exe,是系統級進程,不能停止。
tmail.exe:它是資訊中心基礎進程,是短信、資訊、郵件的管理程式,是用戶進程,可以停止,後果只

是不能收、發短信、資訊、郵件。
repllog.exe 使用串口進行同步,ActiveSync時用到。
udp2tcp.exe 系統進程,用戶數據服務協議,ActiveSync後自動開啟
Handsfree.exe 電話免提功能
vcdaemon.exe VoiceCommander,語音控制
STK.exe SIM Toolkit,SIM卡應用相關的
srvtrust.exe:這個是系統的授權,就是證書管理的服務。可以停止。
文章關鍵字
文章分享
評分
評分
複製連結

今日熱門文章 網友點擊推薦!