青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

大龍的博客

常用鏈接

統(tǒng)計

最新評論

Windows服務(wù)編寫原理及探討(三)

    現(xiàn)在我們還剩下一個函數(shù)可以在細(xì)節(jié)上討論,那就是服務(wù)的CtrlHandler函數(shù)。

  當(dāng)調(diào)用RegisterServiceCtrlHandler函數(shù)時,SCM得到并保存這個回調(diào)函數(shù)的地址。一個SCP調(diào)一個告訴SCM如何去控制服務(wù)的Win32函數(shù),現(xiàn)在已經(jīng)有10個預(yù)定義的控制請求:

 Requests the service to stop. The hService handle must have SERVICE_STOP access. Requests the service to pause. The hService handle must have SERVICE_PAUSE_CONTINUE access. Requests the paused service to resume. The hService handle must have SERVICE_PAUSE_CONTINUE access. Requests the service to update immediately its current status information to the service control manager. The hService handle must have SERVICE_INTERROGATE access. Requests the service to perform cleanup tasks, because the system is shutting down. For more information, see Remarks. Windows 2000: Requests the service to reread its startup parameters. The hService handle must have SERVICE_PAUSE_CONTINUE access. Windows 2000: Requests the service to update its network binding. The hService handle must have SERVICE_PAUSE_CONTINUE access. Windows 2000: Notifies a network service that a component for binding has been removed. The service should reread its binding information and unbind from the removed component.  Windows 2000: Notifies a network service that a disabled binding has been enabled. The service should reread its binding information and add the new binding.  Windows 2000: Notifies a network service that one of its bindings has been disabled. The service should reread its binding information and remove the binding.  

  上表中標(biāo)有Windows 2000字樣的就是2000中新添加的控制代碼。除了這些代碼之外,服務(wù)也可以接受用戶定義的,范圍在128-255之間的代碼。

  當(dāng)CtrlHandler函數(shù)收到一個SERVICE_CONTROL_STOP、SERVICE_CONTROL_PAUSE、
SERVICE_CONTROL_CONTINUE控制代碼的時候,SetServiceStatus必須被調(diào)用去確認(rèn)這個代碼,并指定你認(rèn)為服務(wù)處理這個狀態(tài)變化所需要的時間。

  例如:你的服務(wù)收到了停止請求,首先要把SERVICE_STATUS結(jié)構(gòu)的dwCurrentState成員設(shè)置成SERVICE_STOP_PENDING,這樣可以使SCM確定你已經(jīng)收到了控制代碼。當(dāng)一個服務(wù)的暫停或停止操作正在執(zhí)行的時候,必須指定你認(rèn)為這種操作所需要的時間:這是因為一個服務(wù)也許不能立即改變它的狀態(tài),它可能必須等待一個網(wǎng)絡(luò)請求被完成或者數(shù)據(jù)被刷新到一個驅(qū)動器上。指定時間的方法就像我上一章說的那樣,用成員dwCheckPoint和dwWaitHint來指明它完成狀態(tài)改變所需要的時間。如果需要,可以用增加dwCheckPoint成員的值和設(shè)置dwWaitHint成員的值去指明你期待的服務(wù)到達(dá)下一步的時間的方式周期性的報告進(jìn)展情況。

  當(dāng)整個啟動的過程完成之后,要再一次調(diào)用SetServiceStatus。這時就要把SERVICE_STATUS結(jié)構(gòu)的dwCurrentState成員設(shè)置成SERVICE_STOPPED,當(dāng)報告狀態(tài)代碼的同時,一定要把成員dwCheckPoint和dwWaitHint設(shè)置為0,因為服務(wù)已經(jīng)完成了它的狀態(tài)變化。暫停或繼續(xù)服務(wù)的時候方法也一樣。

  當(dāng)CtrlHandler函數(shù)收到一個SERVICE_CONTROL_INTERROGATE控制代碼的時候,服務(wù)將簡單的將dwCurrentState成員設(shè)置成服務(wù)當(dāng)前的狀態(tài),同時,把成員dwCheckPoint和dwWaitHint設(shè)置為0,然后再調(diào)用SetServiceStatus就可以了。

  在操作系統(tǒng)關(guān)閉的時候,CtrlHandler函數(shù)收到一個SERVICE_CONTROL_SHUTDOWN控制代碼。服務(wù)根本無須回應(yīng)這個代碼,因為系統(tǒng)即將關(guān)閉。它將執(zhí)行保存數(shù)據(jù)所需要的最小行動集,這是為了確定機器能及時關(guān)閉。缺省時系統(tǒng)只給很少的時間去關(guān)閉所有的服務(wù),MSDN里面說大概是20秒的時間,不過那可能是Windows NT 4的設(shè)置,在我的Windows 2000 Server里這個時間是10秒,你可以手動的修改這個數(shù)值,它被記錄在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control子鍵里面的WaitToKillServiceTimeout,單位是毫秒。

  當(dāng)CtrlHandler函數(shù)收到任何用戶定義的代碼時,它應(yīng)該執(zhí)行期望的用戶自定義行動。除非用戶自定義的行動要強制服務(wù)去暫停、繼續(xù)或停止,否則不調(diào)SetServiceStatus函數(shù)。如果用戶定義的行動強迫服務(wù)的狀態(tài)發(fā)生變化,SetServiceStatus將被調(diào)用去設(shè)置dwCurrentState、dwCheckPoint和dwWaitHint,具體控制代碼和前面說的一樣。

  如果你的CtrlHandler函數(shù)需要很長的時間執(zhí)行操作的話,千萬要注意:假如CtrlHandler函數(shù)在30秒內(nèi)沒有返回的話,SCM將返回一個錯誤,這不是我們所期望的。所以如果出現(xiàn)上述情況,最好的辦法是再建立一個線程,讓它去繼續(xù)執(zhí)行操作,以便使得CtrlHandler函數(shù)能夠迅速的返回。例如,當(dāng)收到一個SERVICE_CONTROL_STOP請求的時候,就像上面說的一樣,服務(wù)可能正在等待一個網(wǎng)絡(luò)請求被完成或者數(shù)據(jù)被刷新到一個驅(qū)動器上,而這些操作所需要的時間是你不能估計的,那么就要建立一個新的線程等待操作完成后執(zhí)行停止命令,CtrlHandler函數(shù)在返回之前仍然要報告SERVICE_STOP_PENDING狀態(tài),當(dāng)新的線程執(zhí)行完操作之后,再由它將服務(wù)的狀態(tài)設(shè)置成SERVICE_STOPPED。如果當(dāng)前操作的時間可以估計的到就不要這樣做,仍然使用前面交待的方法處理。

  CtrlHandler函數(shù)我就先講這些,下面說說服務(wù)怎么安裝。一個服務(wù)程序可以使用CreateService函數(shù)將服務(wù)的信息添加到SCM的數(shù)據(jù)庫。

SC_HANDLE CreateService(
SC_HANDLE hSCManager, 
// handle to SCM database 
LPCTSTR lpServiceName, 
// name of service to start
LPCTSTR lpDisplayName, 
// display name
DWORD dwDesiredAccess, 
// type of access to service
DWORD dwServiceType, 
// type of service
DWORD dwStartType, 
// when to start service
DWORD dwErrorControl, 
// severity of service failure
LPCTSTR lpBinaryPathName, 
// name of binary file
LPCTSTR lpLoadOrderGroup, 
// name of load ordering group
LPDWORD lpdwTagId, 
// tag identifier
LPCTSTR lpDependencies, 
// array of dependency names
LPCTSTR lpServiceStartName, 
// account name 
LPCTSTR lpPassword 
// account password
);

  hSCManager是一個標(biāo)示SCM數(shù)據(jù)庫的句柄,可以簡單的通過調(diào)用OpenSCManager得到。

SC_HANDLE OpenSCManager(
LPCTSTR lpMachineName, 
// computer name
LPCTSTR lpDatabaseName, 
// SCM database name
DWORD dwDesiredAccess 
// access type
);

  lpMachineName是目標(biāo)機器的名字,還記得我在第一章里說過可以在其它的機器上面安裝服務(wù)嗎?這就是實現(xiàn)的方法。對方機器名字必須以“\\”開始。如果傳遞NULL或者一個空的字符串的話就默認(rèn)是本機。

  lpDatabaseName是目標(biāo)機器上面SCM數(shù)據(jù)庫的名字,但MSDN里面說這個參數(shù)要默認(rèn)的設(shè)置成SERVICES_ACTIVE_DATABASE,如果傳遞NULL,就默認(rèn)的打開SERVICES_ACTIVE_DATABASE。所以我還沒有真的搞明白這個參數(shù)的存在意義,總之使用的時候傳遞NULL就行了。

  dwDesiredAccess是SCM數(shù)據(jù)庫的訪問權(quán)限,具體值見下表:

SC_MANAGER_ALL_ACCESS:
 Includes STANDARD_RIGHTS_REQUIRED, in addition to all of the access types listed in this table. Enables connecting to the service control manager. Enables calling of the CreateService function to create a service object and add it to the database. Enables calling of the EnumServicesStatus function to list the services that are in the database. Enables calling of the LockServiceDatabase function to acquire a lock on the database. Enables calling of the QueryServiceLockStatus function to retrieve the lock status information for the database. 


  想要獲得訪問權(quán)限的話,似乎沒那么復(fù)雜。MSDN里面說所有進(jìn)程都被允許獲得對所有SCM數(shù)據(jù)庫的SC_MANAGER_CONNECT, SC_MANAGER_ENUMERATE_SERVICE, and SC_MANAGER_QUERY_LOCK_STATUS權(quán)限,這些權(quán)限使得你可以連接SCM數(shù)據(jù)庫,枚舉目標(biāo)機器上安裝的服務(wù)和查詢目標(biāo)數(shù)據(jù)庫是否已被鎖住。但如果要創(chuàng)建服務(wù),首先你需要擁有目標(biāo)機器的管理員權(quán)限,一般的傳遞SC_MANAGER_ALL_ACCESS就可以了。這個函數(shù)返回的句柄可以被CloseServiceHandle函數(shù)關(guān)閉。

  lpServiceName是服務(wù)的名字,lpDisplayName是服務(wù)在“服務(wù)”管理工具里顯示的名字。

  dwDesiredAccess也是訪問的權(quán)限,有一個比上面的還長的多的一個表,各位自己查MSDN吧。我們要安裝服務(wù),仍然簡單的傳遞SC_MANAGER_ALL_ACCESS。

  dwServiceType是指你的服務(wù)是否和其它的進(jìn)程相關(guān)聯(lián),一般是SERVICE_WIN32_OWN_PROCESS,表示不和任何進(jìn)程相關(guān)聯(lián)。如果你確認(rèn)你的服務(wù)需要和某些進(jìn)程相關(guān)聯(lián),就設(shè)置成SERVICE_WIN32_SHARE_PROCESS。當(dāng)你的服務(wù)要和桌面相關(guān)聯(lián)的時候,需要設(shè)置成SERVICE_INTERACTIVE_PROCESS。

  dwStartType是服務(wù)的啟動方式。服務(wù)有三種啟動方式,分別是“自動(SERVICE_AUTO_START)”“手動(SERVICE_DEMAND_START)”和“禁用(SERVICE_DISABLED)”。在MSDN里還有另外的兩種方式,不過是專為驅(qū)動程序設(shè)置的。

  dwErrorControl決定服務(wù)如果在系統(tǒng)啟動的時候啟動失敗的話要怎么辦。

SERVICE_ERROR_IGNORE:
 啟動程序記錄錯誤發(fā)生,但繼續(xù)啟動。 啟動程序記錄錯誤發(fā)生,并彈出一個消息框,但仍繼續(xù)啟動 啟動程序記錄錯誤發(fā)生,如果是以last-known-good configuration啟動的話,啟動會繼續(xù)。否則會以last-known-good configuration重新啟動計算機。 啟動程序記錄錯誤發(fā)生,如果可能的話。如果是以last-known-good configuration啟動的話,啟動會失敗。否則會以last-known-good configuration重新啟動計算機。好嚴(yán)重的錯誤啊。 


  lpBinaryPathName是服務(wù)程序的路徑。MSDN里面特別提到如果服務(wù)路徑里面有空格的話一定要將路徑用引號引起來。例如"d:\\my share\\myservice.exe"就一定要指定為"\"d:\\my share\\myservice.exe\""。

  lpLoadOrderGroup的意義在于,如果有一組服務(wù)要按照一定的順序啟動的話,這個參數(shù)用于指定一個組名用于標(biāo)志這個啟動順序組,不過我還沒有用過這個參數(shù)。你的服務(wù)如果不屬于任何啟動順序組,只要傳遞NULL或者一個空的字符串就行了。

  lpdwTagId是應(yīng)用了上面的參數(shù)之后要指定的值,專用于驅(qū)動程序,與本文內(nèi)容無關(guān)。傳遞NULL。

  lpDependencies標(biāo)示一個字符串?dāng)?shù)組,用于指明一串服務(wù)的名字或者一個啟動順序組。當(dāng)與一個啟動順序組建立關(guān)聯(lián)的時候,這個參數(shù)的含義就是只有你指定的啟動順序組里有至少一個經(jīng)過對整個組里所有的成員已經(jīng)全部嘗試過啟動后,有至少一個成員成功啟動,你的服務(wù)才能啟動。不需要建立依存關(guān)系的話,仍是傳遞NULL或者一個空的字符串。但如果你要指定啟動順序組的話,必須為組名加上SC_GROUP_IDENTIFIER前綴,因為組名和服務(wù)名是共享一個命名空間的。

  lpServiceStartName是服務(wù)的啟動賬號,如果你設(shè)置你的服務(wù)的關(guān)聯(lián)類型是SERVICE_WIN32_OWN_PROCESS的話,你需要以DomainName\UserName的格式指定用戶名,如果這個賬戶在你本機的話,用.\UserName就可以指定。如果傳遞NULL的話,會以本地的系統(tǒng)賬戶登陸。如果是Win NT 4.0或更早的版本的話,如果你指定了SERVICE_WIN32_SHARE_PROCESS,就必須傳遞.\System指定服務(wù)使用本地的系統(tǒng)賬戶。最后,如果你指定了SERVICE_INTERACTIVE_PROCESS,你必須使服務(wù)運行在本機系統(tǒng)賬戶。

  看名字就知道了,lpPassword是賬戶的密碼。如果指定系統(tǒng)賬戶的話,傳遞NULL。如果賬戶沒有密碼的話,傳遞空字符串。

  總之服務(wù)的基本原理就是這樣子了,到了這里這篇文章似乎可以告一段落了,但實際上還有很多內(nèi)容必須要討論,所以我還不能草草收筆,敬請關(guān)注下一章。

本文測試環(huán)境為Win2000 Server + SP2
Athlon XP 1700 + 256MB DDR
全部資料參考自MSDN OCT 2001

posted on 2007-12-22 18:08 大龍 閱讀(614) 評論(0)  編輯 收藏 引用


只有注冊用戶登錄后才能發(fā)表評論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国产裸体写真av一区二区| 亚洲区一区二区三区| 91久久香蕉国产日韩欧美9色| 亚洲精品影视在线观看| 性欧美大战久久久久久久免费观看 | 欧美精品尤物在线| 免费成人高清视频| 欧美日韩国产电影| 国产精品一二一区| 永久域名在线精品| 亚洲美女精品一区| 国产精品二区二区三区| 99精品欧美一区二区三区综合在线 | 亚洲精品色婷婷福利天堂| 伊人成人在线视频| 亚洲视频在线观看视频| 久久久午夜视频| 一本色道久久88精品综合| 亚洲乱码日产精品bd| 亚洲永久精品大片| 欧美ab在线视频| 国产视频在线观看一区二区三区 | 欧美激情一区二区三区成人| 欧美午夜精品久久久久久孕妇| 国产精品福利网| 亚洲国产99精品国自产| 亚洲视频播放| 亚洲国产日韩在线| 亚洲欧洲99久久| 国产精品久久午夜夜伦鲁鲁| 136国产福利精品导航网址应用| 亚洲女同同性videoxma| 亚洲欧洲另类| 欧美成人国产一区二区| 亚洲国产日韩欧美在线图片| 亚洲精品午夜精品| 红桃视频成人| 亚洲欧美在线免费观看| 亚洲小说春色综合另类电影| 欧美高清免费| 99在线精品观看| 国产午夜精品福利| 欧美国产精品一区| 欧美精品三级日韩久久| 国产在线观看一区| 欧美激情中文字幕乱码免费| 欧美经典一区二区三区| 久久国产66| 欧美成人午夜影院| 亚欧成人精品| 欧美国产精品久久| 午夜一级久久| 欧美福利视频在线观看| 久久成人一区| 欧美福利一区二区| 宅男噜噜噜66国产日韩在线观看| 免播放器亚洲一区| 久久久久久久高潮| 欧美在线观看你懂的| 欧美日韩一区二区欧美激情| 久久久久一区二区三区四区| 国产精品chinese| 日韩亚洲精品电影| 欧美一级片一区| 国产亚洲精品成人av久久ww| 亚洲欧美日韩一区| 国内久久婷婷综合| 亚洲综合社区| 久久大香伊蕉在人线观看热2| 亚洲欧美精品suv| 欧美专区福利在线| 一本高清dvd不卡在线观看| 久久久91精品国产一区二区三区 | 狠色狠色综合久久| 一区二区三区久久网| 亚洲国产精品悠悠久久琪琪 | 国产精品久久久久一区二区| 一区二区亚洲| 在线亚洲精品| 亚洲精品一区在线观看| 日韩视频不卡| 亚洲国产精品电影在线观看| 久久国产66| 一本久道久久久| 亚洲欧美在线观看| 国产精品一区久久| 亚洲国产精品久久久久婷婷884| 久久久久久色| 亚洲精品美女在线| 一区二区av在线| 蜜桃久久精品乱码一区二区| 国产欧美日韩精品a在线观看| 亚洲欧美成人一区二区在线电影| 亚洲女同精品视频| 亚洲综合电影一区二区三区| 黄色资源网久久资源365| 国产精品欧美精品| 久久精品国产精品亚洲综合| 亚洲激情电影在线| 欧美日韩国产专区| 欧美在线免费播放| 免费久久精品视频| 欧美日韩视频专区在线播放 | 亚洲主播在线观看| 亚洲国产综合在线| 欧美激情视频一区二区三区在线播放| 亚洲伦理精品| 久久黄色小说| 99热在这里有精品免费| 一区二区三区.www| 久久精品国产亚洲精品| 在线亚洲精品| 欧美成人午夜77777| 亚洲国产精品第一区二区三区| 香蕉久久夜色精品国产| 亚洲女人小视频在线观看| 久久一本综合频道| 亚洲欧洲精品天堂一级| 国产精品私房写真福利视频| 亚洲第一在线视频| 国产婷婷精品| 一区二区三区久久网| 亚洲精品国产精品久久清纯直播| 亚洲欧美一区二区三区极速播放| 亚洲精品一级| 久久一区中文字幕| 久久精品夜色噜噜亚洲a∨| 欧美日韩mp4| 亚洲国产乱码最新视频| 国产一区视频在线看| 亚洲一区成人| 亚洲一区二区高清视频| 欧美人与性动交cc0o| 亚洲国产另类久久久精品极度| 在线播放亚洲| 久久―日本道色综合久久| 巨乳诱惑日韩免费av| 狠狠色狠狠色综合日日小说| 欧美在线免费看| 久久久综合免费视频| 国产偷国产偷亚洲高清97cao| 亚洲一区二区三区乱码aⅴ| 午夜精品三级视频福利| 国产麻豆成人精品| 欧美一区二区啪啪| 久久视频这里只有精品| 亚洲激情专区| 日韩亚洲欧美中文三级| 午夜国产精品视频| 欧美freesex交免费视频| 欧美在线播放一区| 久久久精品久久久久| 久久久夜色精品亚洲| 美国十次成人| 国产精品久久久一本精品| 国产精品毛片va一区二区三区| 国产精品综合不卡av| 亚洲视频电影在线| 亚洲欧洲日韩综合二区| 欧美理论在线| 夜夜嗨一区二区三区| 欧美激情自拍| 欧美视频免费| 韩日欧美一区二区| 亚洲少妇在线| 欧美成人激情视频| 亚洲一区二区三区高清| 久久黄色影院| 欧美性开放视频| 亚洲黄色影片| 一本色道久久加勒比88综合| 欧美日韩三级电影在线| 亚洲国产欧美一区| 一区二区三区精品久久久| 国产精品美女在线| 欧美一区在线视频| 亚洲高清在线| 欧美在线观看一区二区三区| 在线观看一区二区视频| 欧美日韩一区二区三区免费| 小辣椒精品导航| 亚洲欧洲综合另类在线| 欧美在线黄色| 在线综合亚洲| 在线免费观看视频一区| 国产精品久久久久久妇女6080| 久久精品在线视频| 亚洲午夜羞羞片| 亚洲国产免费看| 久久国产精品久久久久久久久久 | 日韩亚洲视频| 玖玖视频精品| 久久er99精品| 亚洲免费伊人电影在线观看av| 亚洲国产色一区| 国产视频精品xxxx| 欧美午夜精品伦理| 欧美精品免费观看二区| 猫咪成人在线观看| 久久久精彩视频|