windows服務基礎

2021-08-24 17:12:01 字數 4396 閱讀 7035

參考資料:<

windows服務是怎麼回事?如何建服務工程?如何除錯服務程式?

本文一一為你解答..先把**貼出來:

下面大概說一下服務的工作方法(針對這個工程):

首先,將引數"/install"或"/uninstall"傳進winmain裡分別安裝以及卸裝服務.如果不帶引數執行,就認為是服務控制管理啟動該服務程式.

接著,安裝主要做兩件事:開啟服務控制管理器(openscmanager)和建立服務(createservice).

卸裝和安裝類似:開啟服務控制管理器(openscmanager),關掉服務(controlservice(.., service_control_stop, ..;)和刪除服務(deleteservice).

假設已經安裝好了,那麼開啟"服務管理",啟動這個服務:

也可以用命令sc來做這事:

這時,由於servicemain裡有這個句,

#ifdef _debug

debugbreak();

#endif

那麼,系統就會彈出這樣的對話方塊:

選擇取消,再使用.net2003或者以上的開發工具除錯它.

下面是另乙個例子:服務是守護程序,當子程序死掉後,就啟動乙個新的子程序.

檔案wservice.cpp

#define _win32_dcom #include #include #include #include #include #include #include #include #include #include #include #pragma comment(lib,"wbemuuid.lib") #define szservicename l"wservice" #define subroutine_cmd _t("wservice.exe -subroutine") tchar *g_lpeventname = _t("wservice"); //#define check_distance (1000*10) static handle g_sync_event; static iwbemlocator *ploc = null; static iwbemservices *psvc = null; static service_status servicestatus; static service_status_handle servicestatushandle; extern void bluedon_start(); static bool initiatecom(void) hres = cocreateinstance(clsid_wbemlocator,0,clsctx_inproc_server,iid_iwbemlocator,(lpvoid *)&ploc); if (failed(hres)) hres = ploc->connectserver(l"root//cimv2",null,null,0,null,0,0,&psvc); if (failed(hres)) hres = cosetproxyblanket(psvc,rpc_c_authn_winnt,rpc_c_authz_none,null,rpc_c_authn_level_call,rpc_c_imp_level_impersonate,null,eoac_none); if (failed(hres)) return true; } static bool releasecom(void) static bool issubprocessrunning(iwbemservices *psvc) hres = penumerator->next(wbem_infinite,1,&pclsobj,&ureturn); if (failed(hres) || ureturn == 0 || pclsobj == null) return false; pclsobj->release(); penumerator->release(); return true; } static dword getsubprocessid(iwbemservices *psvc) hres = penumerator->next(wbem_infinite,1,&pclsobj,&ureturn); if (failed(hres) || ureturn == 0 || pclsobj == null) return 0; if (pclsobj != null) penumerator->release(); return vtprop.intval; } static void installservice(const wchar *szservicename) static void deleteservice(const wchar *szservicename) ::closeservicehandle(handle); } static void stopservice(const wchar *szservicename) ::closeservicehandle(handle); } static void startupservice(const wchar *szservicename) ::closeservicehandle(handle); } void winapi servicectrlhandler(dword dwcontrol) ::setservicestatus(servicestatushandle, &servicestatus); } void logevent(lpctstr pformat) ; handle heventsource; lptstr lpszstrings[1]; va_list parg; va_start(parg, pformat); // _vstprintf_s(chmsg, pformat, parg); va_end(parg); lpszstrings[0] = chmsg; heventsource = registereventsource(null,szservicename); if (heventsource != null) } void winapi servicemain(dword argc, lptstr * argv) servicestatushandle =::registerservicectrlhandler(szservicename, servicectrlhandler); if (servicestatushandle == (service_status_handle)0) servicestatus.dwservicetype = service_win32; servicestatus.dwcurrentstate = service_running; servicestatus.dwcontrolsaccepted = service_accept_stop; servicestatus.dwwin32exitcode = 0; servicestatus.dwservicespecificexitcode = 0; servicestatus.dwcheckpoint = 0; servicestatus.dwwaithint = 0; ::setservicestatus(servicestatushandle, &servicestatus); g_sync_event = createevent(null, true, false, g_lpeventname); for (;;) sleep(1000*10); } return; } int main(int argc, char*argv) if ((argc==2) && (::strcmp((const char *)argv[1],"-install")==0)) if ((argc==2) && (::strcmp((const char *)argv[1],"-delete")==0)) if ((argc==2) && (::strcmp((const char *)argv[1],"-startup")==0)) if ((argc==2) && (::strcmp((const char *)argv[1],"-stop")==0)) service_table_entry service_table_entry = , }; ::startservicectrldispatcher(service_table_entry); return 0; }

檔案subprocess.cpp

#define _win32_dcom #include #include #include #include #include #include #include #include #include #include extern tchar *g_lpeventname; static handle g_sync_event; void bluedon_end() /*同步退出執行緒*/ dword winapi syncexitthread(lpvoid lpthreadparameter) while (1) } return 0; } void bluedon_start() }

Windows黑客程式設計基礎 一 系統服務

windows黑客程式設計基礎 一 系統服務 songnianhu 163.com 部落格 blog.csdn.net shangguanwaner 前兩天和乙個同學聊天,他念的是xx大學計算機專業,他向我抱怨說天天在學校學的東西好象都沒什麼用,對hacker程式設計倒頗有興趣,就是不知到從何學起。...

Windows黑客程式設計基礎 一 系統服務

windows黑客程式設計基礎 一 系統服務 songnianhu 163.com 部落格 blog.csdn.net shangguanwaner 前兩天和乙個同學聊天,他念的是xx大學計算機專業,他向我抱怨說天天在學校學的東西好象都沒什麼用,對hacker程式設計倒頗有興趣,就是不知到從何學起。...

部署windows服務

1 建立乙個新的windows服務專案server1 2 開啟service1 檢視,找到onstart部分,加入 3 切換到設計檢視,右鍵 新增安裝程式 4 切換到新生成的projectinstaller.cs設計檢視,找到serviceprocessinstaller1對account屬性設定為...