日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > windows >内容正文

windows

windows nt service 框架

發(fā)布時(shí)間:2024/4/14 windows 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 windows nt service 框架 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
// Service.cpp : Defines the entry point for the console application.
//

//服務(wù)程序主函數(shù)。

#include "stdafx.h"

#include "Windows.h"

#define SZAPPNAME????? "serverSample"???? //服務(wù)程序名

#define SZSERVICENAME? "serviceSample"??? //標(biāo)識(shí)服務(wù)的內(nèi)部名



//內(nèi)部變量

bool?????????????????? bDebugServer=false;

SERVICE_STATUS????????????? ssStatus;

SERVICE_STATUS_HANDLE? sshStatusHandle;

DWORD?????????????????????? dwErr=0;

TCHAR?????????????????????? szErr[256];



//下面的函數(shù)由程序?qū)崿F(xiàn)

void? WINAPI? Service_Main(DWORD dwArgc, LPTSTR *lpszArgv);

void? WINAPI? Service_Ctrl(DWORD dwCtrlCode);

void ServiceStart(DWORD dwArgc,LPTSTR* lpszArgv);//具體服務(wù)的初始化入口函數(shù)

void installService();

void removeService();

void debugService(int argc,char** argv);

bool ReportStatusToSCMgr(DWORD dwCurrentState,DWORD dwWin32ExitCode,DWORD dwWaitHint);

void AddToMessageLog(LPTSTR lpszMsg);



//int _tmain(int argc, _TCHAR* argv[])
int _tmain(int argc, TCHAR* argv[])

{? ?

?? ?SERVICE_TABLE_ENTRY dispatchTable[]=
?? ?{

?? ??? ?{TEXT(SZSERVICENAME),(LPSERVICE_MAIN_FUNCTION)Service_Main},

?? ??? ?{ NULL,NULL}

?? ?};

??? if((argc>1)&&((*argv[1]=='-')||(argv[1]==TEXT("/"))))

?? ?{

?? ??? ?if(_tcsicmp(TEXT("install"),argv[1]+1)==0)

?? ??? ?{

?? ??? ??? ?installService();

?? ??? ?}

?? ??? ?else if(_tcsicmp(TEXT("remove"),argv[1]+1)==0)

?? ??? ?{

?? ??? ??? ?removeService();

?? ??? ?}

?? ??? ?else if(_tcsicmp(TEXT("debug"),argv[1]+1)==0)

?? ??? ?{

?? ??? ??? ?bDebugServer=true;

?? ??? ??? ?//debugService(argc,argv);

?? ??? ?}

?? ??? ?else

?? ??? ?{??????? //如果未能和上面的如何參數(shù)匹配,則可能是服務(wù)控制管理程序來(lái)啟動(dòng)該程序。立即調(diào)用

?? ??? ??? ?//StartServiceCtrlDispatcher 函數(shù)。

?? ??? ??? ?printf("%s - install to install the service \n",SZAPPNAME);

?? ??? ??? ?printf("%s - remove to remove the service \n",SZAPPNAME);

?? ??? ??? ?printf("%s - debug to debug the service \n",SZAPPNAME);

?? ??? ??? ?printf("\n StartServiceCtrlDispatcher being called.\n");

?? ??? ??? ?printf("This may take several seconds.Please wait.\n");

?? ??? ??? ?if(!StartServiceCtrlDispatcher(dispatchTable))

?? ??? ??? ??? ?AddToMessageLog(TEXT("StartServiceCtrlDispatcher failed."));

?? ??? ??? ?else

?? ??? ??? ??? ?AddToMessageLog(TEXT("StartServiceCtrlDispatcher OK."));

?? ??? ?}

?? ??? ?exit(0);

?? ?}

?? ?return 0;

}

//服務(wù)入口點(diǎn)函數(shù)

void ServiceStart(DWORD dwArgc,LPTSTR* lpszArgv)??? //具體服務(wù)的初始化入口函數(shù)
{
?printf("\n StartServiceCtrlDispatcher being called.\n");

}

void? WINAPI? Service_Main(DWORD dwArgc, LPTSTR *lpszArgv)

{

?? ?//注冊(cè)服務(wù)控制處理函數(shù)

?? ?sshStatusHandle=RegisterServiceCtrlHandler(TEXT(SZSERVICENAME),Service_Ctrl);

?? ?//如果注冊(cè)失敗

?? ?if(!sshStatusHandle)

?? ?{

?? ??? ?goto cleanup;

?? ??? ?return;

?? ?}

?? ?//初始化 SERVICE_STATUS 結(jié)構(gòu)中的成員

?? ?ssStatus.dwServiceType=SERVICE_WIN32_OWN_PROCESS;

?? ?ssStatus.dwServiceSpecificExitCode=0;

?? ?//更新服務(wù)狀態(tài)

?? ?if(!ReportStatusToSCMgr(

?? ??? ?SERVICE_START_PENDING,//服務(wù)狀態(tài),The service is starting.

?? ??? ?NO_ERROR,??????????? //退出碼?????? ?

?? ??? ?3000))?????????????????? //等待時(shí)間

?? ??? ?goto cleanup;??????? //更新服務(wù)狀態(tài)失敗則轉(zhuǎn)向 cleanup

?? ?ServiceStart(dwArgc,lpszArgv);

?? ?return;

cleanup:

?? ?//把服務(wù)狀態(tài)更新為 SERVICE_STOPPED,并退出。

?? ?if(sshStatusHandle)

?? ??? ?(void)ReportStatusToSCMgr(SERVICE_STOPPED,dwErr,0);

}

//控制處理程序函數(shù)

void WINAPI Service_Ctrl(DWORD dwCtrlCode)

{

?? ?//處理控制請(qǐng)求碼

?? ?switch(dwCtrlCode)

?? ?{

?? ??? ?// 先更新服務(wù)狀態(tài)為 SERVICDE_STOP_PENDING,再停止服務(wù)。

?? ?case SERVICE_CONTROL_STOP:

?? ??? ?ReportStatusToSCMgr(SERVICE_STOP_PENDING,NO_ERROR,500);

?? ??? ?//ServiceStop();???? //由具體的服務(wù)程序?qū)崿F(xiàn)

?? ??? ?return;

?? ??? ?// 暫停服務(wù)

?? ?case SERVICE_CONTROL_PAUSE:

?? ??? ?ReportStatusToSCMgr(SERVICE_STOP_PENDING,NO_ERROR,500);

?? ??? ?//ServicePause();??? //由具體的服務(wù)程序?qū)崿F(xiàn)

?? ??? ?ssStatus.dwCurrentState=SERVICE_PAUSED;

?? ??? ?return;

?? ??? ?// 繼續(xù)服務(wù)

?? ?case SERVICE_CONTROL_CONTINUE:

?? ??? ?ReportStatusToSCMgr(SERVICE_STOP_PENDING,NO_ERROR,500);

?? ??? ?//ServiceContinue(); //由具體的服務(wù)程序?qū)崿F(xiàn)

?? ??? ?ssStatus.dwCurrentState=SERVICE_RUNNING;

?? ??? ?return;

?? ??? ?// 更新服務(wù)狀態(tài)

?? ?case SERVICE_CONTROL_INTERROGATE:

?? ??? ?break;

?? ??? ?// 無(wú)效控制碼

?? ?default:

?? ??? ?break;

?? ?}

?? ?ReportStatusToSCMgr(ssStatus.dwCurrentState,NO_ERROR,0);

}

//安裝服務(wù)程序

void installService()

{

?? ?SC_HANDLE schService;

?? ?SC_HANDLE schSCManager;

?? ?TCHAR szPath[512];

?? ?//得到程序磁盤(pán)文件的路徑

?? ?if(GetModuleFileName(NULL,szPath,512)==0)

?? ?{

?? ??? ?_tprintf(TEXT("Unable to install %s - %s \n"),

?? ??? ??? ?TEXT(SZAPPNAME),

?? ??? ??? ?GetLastError());//@1獲取調(diào)用函數(shù)返回的最后錯(cuò)誤碼

?? ??? ?return;

?? ?}

?? ?//打開(kāi)服務(wù)管理數(shù)據(jù)庫(kù)

?? ?schSCManager=OpenSCManager(

?? ??? ?NULL,??? //本地計(jì)算機(jī)

?? ??? ?NULL,??? //默認(rèn)的數(shù)據(jù)庫(kù)

?? ??? ?SC_MANAGER_ALL_ACCESS? //要求所有的訪問(wèn)權(quán)

?? ??? ?);

?? ?if(schSCManager)

?? ?{

?? ??? ?// 登記服務(wù)程序

?? ??? ?schService = CreateService(

?? ??? ??? ?schSCManager,??????????????????? //服務(wù)管理數(shù)據(jù)庫(kù)句柄

?? ??? ??? ?TEXT(SZSERVICENAME),???????????? //服務(wù)名

?? ??? ??? ?TEXT(SZAPPNAME),?????? //用于顯示服務(wù)的標(biāo)識(shí)

?? ??? ??? ?SERVICE_ALL_ACCESS,????????????? //響應(yīng)所有的訪問(wèn)請(qǐng)求

?? ??? ??? ?SERVICE_WIN32_OWN_PROCESS,?????? //服務(wù)類(lèi)型

?? ??? ??? ?//SERVICE_DEMAND_START,??????????? //啟動(dòng)類(lèi)型
?? ??? ??? ?SERVICE_AUTO_START,

?? ??? ??? ?SERVICE_ERROR_NORMAL,??????????? //錯(cuò)誤控制類(lèi)型

?? ??? ??? ?szPath,????????????????????????????? //服務(wù)程序磁盤(pán)文件的路徑

?? ??? ??? ?NULL,??????????????????????????????? //服務(wù)不屬于任何組

?? ??? ??? ?NULL,??????????????????????????????? //沒(méi)有tag標(biāo)識(shí)符

?? ??? ??? ?NULL,????????????? //啟動(dòng)服務(wù)所依賴(lài)的服務(wù)或服務(wù)組,這里僅僅是一個(gè)空字符串

?? ??? ??? ?NULL,??????????????????????????????? //LocalSystem 帳號(hào)

?? ??? ??? ?NULL);

?? ??? ?if(schService)

?? ??? ?{

?? ??? ??? ?_tprintf(TEXT("%s installed. \n"),TEXT(SZAPPNAME));

?? ??? ??? ?CloseServiceHandle(schService);

?? ??? ?}

?? ??? ?else

?? ??? ?{

?? ??? ??? ?_tprintf(TEXT("CreateService failed - %s \n"),GetLastError());

?? ??? ?}

?? ??? ?CloseServiceHandle(schSCManager);

?? ?}

?? ?else

?? ??? ?_tprintf(TEXT("OpenSCManager failed - %s \n"),GetLastError());

}

void removeService()
{
?? ?SC_HANDLE service, scm; ?? ??? ??? ?//定義服務(wù)句柄和服務(wù)控制管理數(shù)據(jù)庫(kù)句柄
?? ?SERVICE_STATUS status;?? ??? ??? ??? ?//定義服務(wù)狀態(tài)結(jié)構(gòu)
?? ?//if (argc != 2)? return; ?? ??? ??? ?//如果命令行參數(shù)的個(gè)數(shù)小于2,則不執(zhí)行卸載程序
?? ?// 打開(kāi)服務(wù)控制管理數(shù)據(jù)庫(kù),并返回服務(wù)控制管理數(shù)據(jù)庫(kù)的句柄
?? ?scm = OpenSCManager(0, 0, SC_MANAGER_CREATE_SERVICE);
?? ?// 獲得服務(wù)句柄,并添加服務(wù)訪問(wèn)中的刪除選項(xiàng)
?? ?//service = OpenService(scm, argv[1],SERVICE_ALL_ACCESS | DELETE);
?? ?service = OpenService(scm, TEXT(SZSERVICENAME), SERVICE_ALL_ACCESS | DELETE);
??? // 獲得服務(wù)的當(dāng)前狀態(tài)
?? ?QueryServiceStatus(service, &status);
?? ?// 如果服務(wù)不處于停止?fàn)顟B(tài),則將其狀態(tài)設(shè)置為停止?fàn)顟B(tài)
?? ?if (status.dwCurrentState != SERVICE_STOPPED)
?? ??? ?ControlService(service,SERVICE_CONTROL_STOP, &status);
?? ?DeleteService(service);?? ??? ??? ??? ?// 刪除服務(wù)
?? ?CloseServiceHandle(service);?? ??? ?// 關(guān)閉新服務(wù)句柄
?? ?CloseServiceHandle(scm);?? ??? ??? ?// 關(guān)閉服務(wù)控制管理數(shù)據(jù)庫(kù)句柄

}


void debugService(int argc,char** argv)
{


}

bool ReportStatusToSCMgr(DWORD dwCurrentState,DWORD dwWin32ExitCode,DWORD dwWaitHint)
{
?? return true;
}

void AddToMessageLog(LPTSTR lpszMsg)
{
?

?

}

?

http://blog.chinaunix.net/u1/37538/showart_493320.html

http://www.wei2008.com/Code/softdown.asp?softid=35719?

?

?

?

轉(zhuǎn)載于:https://www.cnblogs.com/chenhs/archive/2010/07/14/1777635.html

總結(jié)

以上是生活随笔為你收集整理的windows nt service 框架的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。