看门狗程序,通过windows服务来写的,大家帮忙指点一下

ylongwu 2013-02-17 07:38:03
程序是公司之前的一个人编写的,现在我要来完善这个程序: 主要部分是一个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);
}
...全文
298 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
ylongwu 2013-02-17
  • 打赏
  • 举报
回复
引用 5 楼 Kaile 的回复:
只要在命令行下 输入 watchDog /uninstall 带参数的命令就可以
再问下, 为什么是watchDog /uninstall???
Kaile 2013-02-17
  • 打赏
  • 举报
回复
只要在命令行下 输入 watchDog /uninstall 带参数的命令就可以
ylongwu 2013-02-17
  • 打赏
  • 举报
回复
引用 3 楼 Kaile 的回复:
简单看了下,watchDog 是通过命令行来启动,停止 服务程序的 winService.cpp 是安装一个windows服务,服务程序的功能应该在 DeriveServerSocket.cpp里
确实是这样的,服务程序功能在DeriveServerSocket.cpp里面。 请问 如果这个程序本身是完善的,那么是不是只要在watchDog弹出的dos框里输入install和start命令就行了?
Kaile 2013-02-17
  • 打赏
  • 举报
回复
简单看了下,watchDog 是通过命令行来启动,停止 服务程序的 winService.cpp 是安装一个windows服务,服务程序的功能应该在 DeriveServerSocket.cpp里
ylongwu 2013-02-17
  • 打赏
  • 举报
回复
看门狗程序应该要向被守护的程序发送定时消息的,被守护的程序收到消息后恢复ack,请问是不是这样? 但是上面的程序中没有发现这样的语句。。。。。
ylongwu 2013-02-17
  • 打赏
  • 举报
回复
第二个是 watchDog的cpp // WatchDog.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include "WatchDog.h" #include "winService.h" #include "DeriveServerSocket.h" #ifdef _DEBUG #define new DEBUG_NEW #endif DWORD g_dwThreadID; extern TCHAR g_szServiceName[] ; extern SOCKET g_sockSrv; extern SOCKADDR_IN g_addrSrv; extern int g_len; extern WSAEVENT EventArray[WSA_MAXIMUM_WAIT_EVENTS]; extern WSANETWORKEVENTS NetworkEvents; // 唯一的应用程序对象 CWinApp theApp; using namespace std; int _tmain(int argc, TCHAR* argv[], TCHAR* envp[]) { int nRetCode = 0; // 初始化 MFC 并在失败时显示错误 if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0)) { // TODO: 更改错误代码以符合您的需要 _tprintf(_T("错误: MFC 初始化失败\n")); nRetCode = 1; } else { //以下三行代码仅做调试用 //CDeriveServerSocket socket; //socket.StartListening(); //Sleep(100000); InitWinService(); g_dwThreadID = ::GetCurrentThreadId(); SERVICE_TABLE_ENTRY st[] = { { g_szServiceName, (LPSERVICE_MAIN_FUNCTION)ServiceMain }, { NULL, NULL } }; LPTSTR lpCmdLine = argv[1]; if ( argc == 2 ) { BOOL bRet; if (wcscmp(lpCmdLine, _T("/install")) == 0) { bRet = Install(); } else if (wcscmp(lpCmdLine, _T("/uninstall")) == 0) { bRet = Uninstall(); } else if (wcscmp(lpCmdLine, _T("/start")) == 0) { bRet = ServiceCtrlStart(); } else if (wcscmp(lpCmdLine, _T("/stop")) == 0) { bRet = ServiceCtrlStop(); } else if (wcscmp(lpCmdLine,_T("/autostart")) == 0) { AutoStartService(); } else { if (!::StartServiceCtrlDispatcher(st)) { LogEvent(_T("Register Service Main Function Error!")); } } } else { if (!::StartServiceCtrlDispatcher(st)) { LogEvent(_T("Register Service Main Function Error!")); } } } return nRetCode; }

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧