操作 NT 服务
操作 NT 服務 |
| 操作 NT 服務: OpenSCManager?? 打開目標計算機上的“服務控制管理器”-SCM,返回指向該管理器的指針。 OpenService???? 打開服務,返回指向該服務的指針。 StartService??? 傳遞一個字符串數(shù)組,并將其作為參數(shù),啟動一個現(xiàn)有的服務。 ControlService? 控制一個已經(jīng)打開的服務。 CreateService?? 創(chuàng)建一個新服務 DeleteService?? 刪除一個已有的服務 StartServiceCtrlDispatcher?? 啟動服務 ChangeServiceConfig Windows服務是其實一種特殊的二進制可執(zhí)行文件,后綴名一般為EXE,之所以說它特殊,因為它具有同Windows NT/2K系統(tǒng)的服務控制管理器(SCM: Service Control Manager)通信。 控制管理器是一個遠程進程調(diào)用(RPC)服務器,在系統(tǒng)導入時自動啟動。 控制臺應用主程序 在Win32下為WinMain函數(shù),在控制臺下為main函數(shù),是服務的主程序。下面是服務主程序中至少要包含的語句。 #include "Winsvc.h"??????????????? //服務頭文件 main() 當然這是一個非常簡單的主程序了。這里main只做了一件事情,就是填寫SERVICE_TABLE_ENTRY結(jié)構(gòu)數(shù)組Table。 Table[0][0]是服務的名字(可以是您喜歡的任意字符串,此處我用的是gkeyService);Table[0][1]指定了服務主程 序的名字,實際上這是一個指向服務主程序的函數(shù)指針,它也可以用您喜歡的函數(shù)名字(我用的是gkeyServiceMain) 。現(xiàn)在通過調(diào)用參數(shù)為SERVICE_TABLE_ENTRY結(jié)構(gòu)數(shù)組的函數(shù)StartServiceCtrlDispatcher()開始啟動服務解析。注 意這個函數(shù)的參數(shù)必須要符合一定的格式,Table[1][0]和Table[1][1]必須是NULL,就是說到了數(shù)組的結(jié)尾。當然 并非必須這樣,如果需要在這個執(zhí)行程序中運行多個服務,可以在這個數(shù)組列表中加入更多的入口,構(gòu)成多對服務 名稱和服務中程序,自然您需要在以下的步驟中需要為每個服務構(gòu)造相應的完成函數(shù)。 服務主程序 典型的服務主程序的聲明如下: void WINAPI gkeyServiceMain( DWORD argc, LPTSTR *argv ) ??? 在gkeyServiceMain函數(shù)中,需要實現(xiàn)的主要步驟包括: ??? 為了完成上述功能,需要使用兩個全局變量: ??? 服務主程序gkeyServiceMain()能夠象通常的c/c++里的main()函數(shù)一樣接受命令行參數(shù),并且接受參數(shù)的方式 也完全一樣。第一個參數(shù)argc包含了傳遞給服務的參數(shù)個數(shù),同c/c++的main()一樣至少有一個參數(shù)就是服務應用本 身。第二個參數(shù)是一個字符指針數(shù)組的指針。同main()函數(shù)一樣,數(shù)組的第一個值總是指向服務的名字。 數(shù)SetServiceStatus()來實現(xiàn)這一目標。SERVICE_STATUS的數(shù)據(jù)成結(jié)構(gòu)員如下: dwServiceType??????? = SERVICE_WIN32;???????? Windows NT下的控制面板或者Windows 2K下的管理工具,我們也可以設置服務接受暫停/繼續(xù)功能。 ??? 在服務主程序gkeyServiceMain()的開始應該設置SERVICE_STATUS的狀態(tài)字段dwCurrentState為 SERVICE_START_PENDING,通知SCM服務處于運行狀態(tài)。如果發(fā)生錯誤,應該發(fā)送SERVICE_STOPPED通知服務控制管理 器SCM。缺省狀態(tài)下,服務控制管理器SCM將監(jiān)視服務的活動,如果2分鐘之類沒有發(fā)現(xiàn)進程活動就殺死這個服務。 ??? 使用API函數(shù)RegisterServiceCtrlHandler()設置服務控制管理器SCM的服務控制處理函數(shù),這個函數(shù)需要兩個 參數(shù),一個是服務名稱字符串,一個是服務控制處理函數(shù)句柄。 ??? 現(xiàn)在要設置dwCurrentState為SERVICE_RUNNING用以通知服務已經(jīng)啟動。 服務控制處理函數(shù) ??? 服務控制管理器SCM使用服務控制處理函數(shù)和服務程序進行通信來了解服務的諸如啟動、停止、暫停或繼續(xù)等用 戶指令,它主要包含一個switch語句來處理每種情況,調(diào)用相應的步驟來啟動、急需、清除和中斷進程。函數(shù)收到 一個象SERVICE_CONTROL_PAUSE, SERVICE_CONTROL_CONTINUE, SERVICE_CONTROL_STOP, SERVICE_CONTROL_INTERROGATE等操作碼,就需要為每種指令提供相應的處理步驟。 安裝/反安裝 ??? 要安裝一個服務,在系統(tǒng)注冊時需要生成一些入口,通常使用Windows有現(xiàn)成的API而不是注冊函數(shù)來完成這些 步驟,這些函數(shù)有CreateService()和DeleteService()。為了安裝服務,首先使用 OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS)打開服務控制管理器SCM。然后調(diào)用CreateService()來建立服 務,給出服務的名字,如果要刪除指定的服務,也將需要使用這個名字刪除。 |
總結(jié)
- 上一篇: python递归面试题_python面试
- 下一篇: 网卡故障会出现的错误代码_布袋除尘器压差