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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

windows nt service 框架

發布時間:2024/4/14 windows 38 豆豆
生活随笔 收集整理的這篇文章主要介紹了 windows nt service 框架 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
// Service.cpp : Defines the entry point for the console application.
//

//服務程序主函數。

#include "stdafx.h"

#include "Windows.h"

#define SZAPPNAME????? "serverSample"???? //服務程序名

#define SZSERVICENAME? "serviceSample"??? //標識服務的內部名



//內部變量

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

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

SERVICE_STATUS_HANDLE? sshStatusHandle;

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

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



//下面的函數由程序實現

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

void? WINAPI? Service_Ctrl(DWORD dwCtrlCode);

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

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

?? ??? ?{??????? //如果未能和上面的如何參數匹配,則可能是服務控制管理程序來啟動該程序。立即調用

?? ??? ??? ?//StartServiceCtrlDispatcher 函數。

?? ??? ??? ?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;

}

//服務入口點函數

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

}

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

{

?? ?//注冊服務控制處理函數

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

?? ?//如果注冊失敗

?? ?if(!sshStatusHandle)

?? ?{

?? ??? ?goto cleanup;

?? ??? ?return;

?? ?}

?? ?//初始化 SERVICE_STATUS 結構中的成員

?? ?ssStatus.dwServiceType=SERVICE_WIN32_OWN_PROCESS;

?? ?ssStatus.dwServiceSpecificExitCode=0;

?? ?//更新服務狀態

?? ?if(!ReportStatusToSCMgr(

?? ??? ?SERVICE_START_PENDING,//服務狀態,The service is starting.

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

?? ??? ?3000))?????????????????? //等待時間

?? ??? ?goto cleanup;??????? //更新服務狀態失敗則轉向 cleanup

?? ?ServiceStart(dwArgc,lpszArgv);

?? ?return;

cleanup:

?? ?//把服務狀態更新為 SERVICE_STOPPED,并退出。

?? ?if(sshStatusHandle)

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

}

//控制處理程序函數

void WINAPI Service_Ctrl(DWORD dwCtrlCode)

{

?? ?//處理控制請求碼

?? ?switch(dwCtrlCode)

?? ?{

?? ??? ?// 先更新服務狀態為 SERVICDE_STOP_PENDING,再停止服務。

?? ?case SERVICE_CONTROL_STOP:

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

?? ??? ?//ServiceStop();???? //由具體的服務程序實現

?? ??? ?return;

?? ??? ?// 暫停服務

?? ?case SERVICE_CONTROL_PAUSE:

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

?? ??? ?//ServicePause();??? //由具體的服務程序實現

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

?? ??? ?return;

?? ??? ?// 繼續服務

?? ?case SERVICE_CONTROL_CONTINUE:

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

?? ??? ?//ServiceContinue(); //由具體的服務程序實現

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

?? ??? ?return;

?? ??? ?// 更新服務狀態

?? ?case SERVICE_CONTROL_INTERROGATE:

?? ??? ?break;

?? ??? ?// 無效控制碼

?? ?default:

?? ??? ?break;

?? ?}

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

}

//安裝服務程序

void installService()

{

?? ?SC_HANDLE schService;

?? ?SC_HANDLE schSCManager;

?? ?TCHAR szPath[512];

?? ?//得到程序磁盤文件的路徑

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

?? ?{

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

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

?? ??? ??? ?GetLastError());//@1獲取調用函數返回的最后錯誤碼

?? ??? ?return;

?? ?}

?? ?//打開服務管理數據庫

?? ?schSCManager=OpenSCManager(

?? ??? ?NULL,??? //本地計算機

?? ??? ?NULL,??? //默認的數據庫

?? ??? ?SC_MANAGER_ALL_ACCESS? //要求所有的訪問權

?? ??? ?);

?? ?if(schSCManager)

?? ?{

?? ??? ?// 登記服務程序

?? ??? ?schService = CreateService(

?? ??? ??? ?schSCManager,??????????????????? //服務管理數據庫句柄

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

?? ??? ??? ?TEXT(SZAPPNAME),?????? //用于顯示服務的標識

?? ??? ??? ?SERVICE_ALL_ACCESS,????????????? //響應所有的訪問請求

?? ??? ??? ?SERVICE_WIN32_OWN_PROCESS,?????? //服務類型

?? ??? ??? ?//SERVICE_DEMAND_START,??????????? //啟動類型
?? ??? ??? ?SERVICE_AUTO_START,

?? ??? ??? ?SERVICE_ERROR_NORMAL,??????????? //錯誤控制類型

?? ??? ??? ?szPath,????????????????????????????? //服務程序磁盤文件的路徑

?? ??? ??? ?NULL,??????????????????????????????? //服務不屬于任何組

?? ??? ??? ?NULL,??????????????????????????????? //沒有tag標識符

?? ??? ??? ?NULL,????????????? //啟動服務所依賴的服務或服務組,這里僅僅是一個空字符串

?? ??? ??? ?NULL,??????????????????????????????? //LocalSystem 帳號

?? ??? ??? ?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; ?? ??? ??? ?//定義服務句柄和服務控制管理數據庫句柄
?? ?SERVICE_STATUS status;?? ??? ??? ??? ?//定義服務狀態結構
?? ?//if (argc != 2)? return; ?? ??? ??? ?//如果命令行參數的個數小于2,則不執行卸載程序
?? ?// 打開服務控制管理數據庫,并返回服務控制管理數據庫的句柄
?? ?scm = OpenSCManager(0, 0, SC_MANAGER_CREATE_SERVICE);
?? ?// 獲得服務句柄,并添加服務訪問中的刪除選項
?? ?//service = OpenService(scm, argv[1],SERVICE_ALL_ACCESS | DELETE);
?? ?service = OpenService(scm, TEXT(SZSERVICENAME), SERVICE_ALL_ACCESS | DELETE);
??? // 獲得服務的當前狀態
?? ?QueryServiceStatus(service, &status);
?? ?// 如果服務不處于停止狀態,則將其狀態設置為停止狀態
?? ?if (status.dwCurrentState != SERVICE_STOPPED)
?? ??? ?ControlService(service,SERVICE_CONTROL_STOP, &status);
?? ?DeleteService(service);?? ??? ??? ??? ?// 刪除服務
?? ?CloseServiceHandle(service);?? ??? ?// 關閉新服務句柄
?? ?CloseServiceHandle(scm);?? ??? ??? ?// 關閉服務控制管理數據庫句柄

}


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?

?

?

?

轉載于:https://www.cnblogs.com/chenhs/archive/2010/07/14/1777635.html

總結

以上是生活随笔為你收集整理的windows nt service 框架的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。