看门狗程序,通过windows服务来写的,大家帮忙指点一下
程序是公司之前的一个人编写的,现在我要来完善这个程序: 主要部分是一个windows服务的cpp 还有一个watchDog的cpp,大家帮忙看看,我到现在还不知道该如何下手。。。。
第一个是winService.cpp
#include "stdafx.h"
#include "winService.h"
#include <wtypes.h>
#include "DeriveServerSocket.h"
HANDLE g_hEvent = INVALID_HANDLE_VALUE;
TCHAR g_szServiceName[] = _T("WatchDogProgram");
BOOL g_bInstall;
SERVICE_STATUS_HANDLE g_hServiceStatus;
SERVICE_STATUS g_status;
SOCKET g_sockSrv;
SOCKADDR_IN g_addrSrv;
int g_len;
void InitWinService()
{
g_hServiceStatus = NULL;
g_status.dwServiceType = SERVICE_WIN32_OWN_PROCESS;
g_status.dwCurrentState = SERVICE_STOPPED;
g_status.dwControlsAccepted = SERVICE_ACCEPT_STOP;
g_status.dwWin32ExitCode = 0;
g_status.dwServiceSpecificExitCode = 0;
g_status.dwCheckPoint = 0;
g_status.dwWaitHint = 0;
}
void WINAPI ServiceMain()
{
g_status.dwCurrentState = SERVICE_START_PENDING;
g_status.dwControlsAccepted = SERVICE_ACCEPT_STOP;
LogEvent(_T("ServiceMain"));
//注册服务控制
g_hServiceStatus = RegisterServiceCtrlHandler(g_szServiceName, ServiceStrl);
if (g_hServiceStatus == NULL)
{
LogEvent(_T("Handler not installed"));
return;
}
SetServiceStatus(g_hServiceStatus, &g_status);
//如下代码可以为启动服务前的准备工作
g_hEvent = ::CreateEvent( NULL, TRUE, FALSE, NULL );
if ( g_hEvent == NULL )
{
g_status.dwCurrentState = SERVICE_STOPPED;
SetServiceStatus(g_hServiceStatus, &g_status);
LogEvent(_T("Failure to start service"));
return;
}
//更改服务状态为启动
g_status.dwWin32ExitCode = S_OK;
g_status.dwCheckPoint = 0;
g_status.dwWaitHint = 0;
g_status.dwCurrentState = SERVICE_RUNNING;
SetServiceStatus(g_hServiceStatus, &g_status);
CDeriveServerSocket deriveServerSocket;
deriveServerSocket.StartListening();
//等待外部停止服务
while( WaitForSingleObject(g_hEvent,1000) != WAIT_OBJECT_0 )
{
}
deriveServerSocket.StopListening();
g_status.dwCurrentState = SERVICE_STOPPED;
SetServiceStatus(g_hServiceStatus, &g_status);
LogEvent(_T("Service stopped"));
}
void WINAPI ServiceStrl(DWORD dwOpcode)
{
switch (dwOpcode)
{
case SERVICE_CONTROL_STOP:
g_status.dwCurrentState = SERVICE_STOP_PENDING;
SetServiceStatus(g_hServiceStatus, &g_status);
//告诉服务线程停止工作
::SetEvent( g_hEvent );
LogEvent(_T("want to stopped Service"));
break;
case SERVICE_CONTROL_PAUSE:
break;
case SERVICE_CONTROL_CONTINUE:
break;
case SERVICE_CONTROL_INTERROGATE:
break;
case SERVICE_CONTROL_SHUTDOWN:
break;
default:
LogEvent(_T("Bad service request"));
}
}
BOOL IsInstalled()
{
BOOL bResult = FALSE;
//打开服务控制管理器
SC_HANDLE hSCM = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
if (hSCM != NULL)
{
//打开服务
SC_HANDLE hService = ::OpenService(hSCM, g_szServiceName, SERVICE_QUERY_CONFIG);
if (hService != NULL)
{
bResult = TRUE;
::CloseServiceHandle(hService);
}
::CloseServiceHandle(hSCM);
}
return bResult;
}
BOOL Install()
{
if (IsInstalled())
return TRUE;
//打开服务控制管理器
SC_HANDLE hSCM = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
if (hSCM == NULL)
{
MessageBox(NULL, _T("Couldn't open service manager"), g_szServiceName, MB_OK);
return FALSE;
}
// Get the executable file path
TCHAR szFilePath[MAX_PATH];
::GetModuleFileName(NULL, szFilePath, MAX_PATH);
//创建服务
SC_HANDLE hService = ::CreateService(
hSCM, g_szServiceName, g_szServiceName,
SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS,
SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL,
szFilePath, NULL, NULL, _T(""), NULL, NULL);
if (hService == NULL)
{
::CloseServiceHandle(hSCM);
MessageBox(NULL, _T("Couldn't create service"), g_szServiceName, MB_OK);
return FALSE;
}
ChangeServiceConfig(
hService, // handle of service
SERVICE_NO_CHANGE, // service type: no change
SERVICE_AUTO_START, // service start type
SERVICE_NO_CHANGE, // error control: no change
NULL, // binary path: no change
NULL, // load order group: no change
NULL, // tag ID: no change
NULL, // dependencies: no change
NULL, // account name: no change
NULL, // password: no change
NULL) ;
::CloseServiceHandle(hService);
::CloseServiceHandle(hSCM);
return TRUE;
}
BOOL Uninstall()
{
if (!IsInstalled())
return TRUE;
SC_HANDLE hSCM = ::OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
if (hSCM == NULL)
{
MessageBox(NULL, _T("Couldn't open service manager"), g_szServiceName, MB_OK);
return FALSE;
}
SC_HANDLE hService = ::OpenService(hSCM, g_szServiceName, SERVICE_STOP | DELETE);
if (hService == NULL)
{
::CloseServiceHandle(hSCM);
MessageBox(NULL, _T("Couldn't open service"), g_szServiceName, MB_OK);
return FALSE;
}
SERVICE_STATUS status;
::ControlService(hService, SERVICE_CONTROL_STOP, &status);
//删除服务
BOOL bDelete = ::DeleteService(hService);
::CloseServiceHandle(hService);
::CloseServiceHandle(hSCM);
if (bDelete)
return TRUE;
LogEvent(_T("Service could not be deleted"));
return FALSE;
}
//开启服务
BOOL ServiceCtrlStart()
{
BOOL bRet;
SC_HANDLE hSCM;
SC_HANDLE hService;
hSCM = OpenSCManager(NULL,NULL,SC_MANAGER_CONNECT);
if (hSCM != NULL)
{
hService = OpenService( hSCM, g_szServiceName, SERVICE_START);
if (hService != NULL)
{
//开始Service
bRet = StartService(hService,0,NULL);
CloseServiceHandle(hService);
}
else
{
bRet = FALSE;
}
CloseServiceHandle(hSCM);
}else
{
bRet = FALSE;
}
return bRet;
}
//停止服务
BOOL ServiceCtrlStop()
{
BOOL bRet;
SC_HANDLE hSCM;
SC_HANDLE hService;
SERVICE_STATUS ServiceStatus;
hSCM = OpenSCManager( NULL, NULL, SC_MANAGER_ALL_ACCESS );
if (hSCM!=NULL)
{
hService = OpenService( hSCM, g_szServiceName, SERVICE_STOP|SERVICE_QUERY_STATUS );
if (hService != NULL)
{
QueryServiceStatus(hService, &ServiceStatus );
if (ServiceStatus.dwCurrentState == SERVICE_RUNNING)
{
bRet = ControlService( hService, SERVICE_CONTROL_STOP, &ServiceStatus );
}else
{
bRet = FALSE;
}
CloseServiceHandle( hService );
}else
{
bRet = FALSE;
}
CloseServiceHandle( hSCM );
}else
{
bRet = FALSE;
}
return bRet;
}
void LogEvent(LPCTSTR pFormat, ...)
{
TCHAR chMsg[256];
HANDLE hEventSource;
LPTSTR lpszStrings[1];
va_list pArg;
va_start(pArg, pFormat);
_vstprintf(chMsg, pFormat, pArg);
va_end(pArg);
lpszStrings[0] = chMsg;
hEventSource = RegisterEventSource(NULL, g_szServiceName);
if (hEventSource != NULL)
{
ReportEvent(hEventSource, EVENTLOG_INFORMATION_TYPE, 0, 0, NULL, 1, 0, (LPCTSTR*) &lpszStrings[0], NULL);
DeregisterEventSource(hEventSource);
}
}
void AutoStartService()
{
SC_HANDLE schSCManager;
SC_HANDLE schService;
// Get a handle to the SCM database.
schSCManager = OpenSCManager(
NULL, // local computer
NULL, // ServicesActive database
SC_MANAGER_ALL_ACCESS); // full access rights
if (NULL == schSCManager)
{
printf("OpenSCManager failed (%d)\n", GetLastError());
return;
}
// Get a handle to the service.
schService = OpenService(
schSCManager, // SCM database
g_szServiceName, // name of service
SERVICE_CHANGE_CONFIG); // need change config access
if (schService == NULL)
{
printf("OpenService failed (%d)\n", GetLastError());
CloseServiceHandle(schSCManager);
return;
}
// Change the service start type.
if (! ChangeServiceConfig(
schService, // handle of service
SERVICE_NO_CHANGE, // service type: no change
SERVICE_AUTO_START, // service start type
SERVICE_NO_CHANGE, // error control: no change
NULL, // binary path: no change
NULL, // load order group: no change
NULL, // tag ID: no change
NULL, // dependencies: no change
NULL, // account name: no change
NULL, // password: no change
NULL) ) // display name: no change
{
printf("ChangeServiceConfig failed (%d)\n", GetLastError());
}
else printf("Service auto start successfully.\n");
CloseServiceHandle(schService);
CloseServiceHandle(schSCManager);
}