【W(wǎng)indows】通過(guò)svchost加載的共享服務(wù)

一般情況下,我們都使用一個(gè)單獨(dú)的exe來(lái)承載自己的服務(wù),但是可以觀察下系統(tǒng)的svchost.exe進(jìn)程,可以看到,系統(tǒng)利用svchost一個(gè)進(jìn)程,承載了多個(gè)服務(wù),每個(gè)服務(wù)都使用了dll來(lái)實(shí)現(xiàn)。
這篇文章詳細(xì)描述了如何使用系統(tǒng)的svchost來(lái)承載我們自己的服務(wù)《創(chuàng)建SvcHost.exe調(diào)用的服務(wù)原理與實(shí)踐》,雖然這是篇2003年寫(xiě)的老文章,但是里面的實(shí)現(xiàn)方式到現(xiàn)在仍然是可用的。
這里針對(duì)自己實(shí)現(xiàn)過(guò)程的經(jīng)驗(yàn),再做一些補(bǔ)充:

  1. dll的導(dǎo)出函數(shù)不一定得是ServiceMain,也可以是自己定義的名稱,只要在注冊(cè)表中HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ServiceMain這個(gè)值里寫(xiě)上即可
  2. 注冊(cè)的控制命令回調(diào)函數(shù)ServiceCtrlHandler是運(yùn)行在另一個(gè)線程,不和ServieMain同個(gè)線程;
  3. ServiceCtrlHandler盡量不要做復(fù)雜且耗時(shí)的事情,不然scm會(huì)認(rèn)為服務(wù)沒(méi)有響應(yīng)了
  4. ServiceCtrlHandler響應(yīng)SERVICE_CONTROL_STOP命令時(shí),最好先向scm標(biāo)記狀態(tài)為SERVICE_STOP_PENDING,同時(shí)給出一個(gè)建議的等待時(shí)間,好讓ServiceMain能感知這個(gè)停止請(qǐng)求,并做好清理工作以正常退出
  5. 一旦向scm標(biāo)記狀態(tài)為SERVICE_STOPPED,后續(xù)的代碼都不會(huì)被運(yùn)行,因?yàn)閐ll立馬就會(huì)被卸載
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容