C++看门狗服务程序(代码)
1、注册服务
2、检测指定进程是否运行,如果没有运行,则运行进程
// WatchDogSvr.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include "Windows.h"
#include "tlhelp32.h"
SERVICE_STATUS m_ServiceStatus;
SERVICE_STATUS_HANDLE m_ServiceStatusHandle;
BOOL bRunning=true;
void WINAPI ServiceMain(DWORD argc, LPTSTR *argv);
void WINAPI ServiceCtrlHandler(DWORD Opcode);
BOOL InstallService();
BOOL DeleteService();
const int nBufSize=512;
void WriteLog(const char* strLog)
{
FILE * fp;
fp=fopen("C:\\WatchDog.log","a");
if( fp==NULL ) return;
//fputs(strLog,fp);
fprintf(fp,"%s\n",strLog);
fclose(fp);
}
int GetProcessCount(const TCHAR* szExeName)
{
TCHAR sztarget[MAX_PATH];
lstrcpy(sztarget, szExeName);
CharLowerBuff(sztarget, MAX_PATH);
int count = 0;
PROCESSENTRY32 my;
HANDLE l = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (((int)l) != -1)
{
my.dwSize = sizeof(my);
if (Process32First(l, &my))
{
do
{
CharLowerBuff(my.szExeFile, MAX_PATH);
if (lstrcmp(sztarget, my.szExeFile) == 0)
{
count++;
}
}while (Process32Next(l, &my));
}
CloseHandle(l);
}
return count;
}
void RunServiceProcess(const TCHAR *strServiceName)
{
//清空结构
STARTUPINFO sInfo;
PROCESS_INFORMATION pInfo;
ZeroMemory(&sInfo,sizeof(sInfo));
sInfo.cb=sizeof(sInfo);
sInfo.dwFlags=STARTF_USESHOWWINDOW;
sInfo.wShowWindow=SW_SHOWNORMAL;
ZeroMemory(&pInfo,sizeof(pInfo));
//输出出错信息
char chBuf[nBufSize];
ZeroMemory(chBuf,nBufSize);
//创建一个进程
if(!::CreateProcess(strServiceName,NULL,
NULL,
NULL,
FALSE,
0,
NULL,
NULL,
&sInfo,
&pInfo))
{
sprintf(chBuf,"CreateProcess failed(%d).\n",GetLastError());
WriteLog(chBuf);
return;
}
// Wait until child process exits.
WaitForSingleObject(pInfo.hProcess,INFINITE);
//关闭进程和线程的句柄
CloseHandle(pInfo.hProcess);
CloseHandle(pInfo.hThread);
}
void DoTask()
{
if( GetProcessCount(_T("SjkDataCollect.exe"))==0)
{
RunServiceProcess(_T("C:\\xxx.exe"));
WriteLog("can not find process [SjkDataCollect.exe] and run process!");
}
}
int _tmain(int argc, _TCHAR* argv[])
{
if(argc>1)
{
if( wcscmp(argv[1],L"-i")==0)
{
if(InstallService())
printf("\n Service Installed Sucessfully\n");
else
printf("\n Service has been installed\n");
}
else if(wcscmp(argv[1],L"-d")==0)
{
if(DeleteService())
printf("\n Service UnInstalled Sucessfully\n");
else
printf("\nInstalled Easin Central Service Not Found\n");
}
else
{
printf("\nUnknown Switch Usage\nFor Install use Servicetest -i\nFor UnInstall use Servicetest -d\n");
}
}
else
{
SERVICE_TABLE_ENTRY DispatchTable[]={{L"WatchDogSvr",ServiceMain},{NULL,NULL}};
StartServiceCtrlDispatcher(DispatchTable);
}
return 0;
}
void WINAPI ServiceMain(DWORD argc, LPTSTR *argv)
{
// DWORD status;
// DWORD specificError;
m_ServiceStatus.dwServiceType = SERVICE_WIN32;
m_ServiceStatus.dwCurrentState = SERVICE_START_PENDING;
m_ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP;
m_ServiceStatus.dwWin32ExitCode = 0;
m_ServiceStatus.dwServiceSpecificExitCode = 0;
m_ServiceStatus.dwCheckPoint = 0;
m_ServiceStatus.dwWaitHint = 0;
m_ServiceStatusHandle = RegisterServiceCtrlHandler(L"WatchDogSvr",ServiceCtrlHandler);
if (m_ServiceStatusHandle == (SERVICE_STATUS_HANDLE)0)
{
return;
}
m_ServiceStatus.dwCurrentState = SERVICE_RUNNING;
m_ServiceStatus.dwCheckPoint = 0;
m_ServiceStatus.dwWaitHint = 0;
if (!SetServiceStatus (m_ServiceStatusHandle,&m_ServiceStatus))
{
}
bRunning=true;
while(bRunning)
{
Sleep(3000);
//Place Your Code for processing here....
DoTask();
}
return;
}
void WINAPI ServiceCtrlHandler(DWORD Opcode)
{
switch(Opcode)
{
case SERVICE_CONTROL_PAUSE:
m_ServiceStatus.dwCurrentState = SERVICE_PAUSED;
break;
case SERVICE_CONTROL_CONTINUE:
m_ServiceStatus.dwCurrentState = SERVICE_RUNNING;
break;
case SERVICE_CONTROL_STOP:
m_ServiceStatus.dwWin32ExitCode = 0;
m_ServiceStatus.dwCurrentState = SERVICE_STOPPED;
m_ServiceStatus.dwCheckPoint = 0;
m_ServiceStatus.dwWaitHint = 0;
SetServiceStatus (m_ServiceStatusHandle,&m_ServiceStatus);
bRunning=false;
break;
case SERVICE_CONTROL_INTERROGATE:
break;
}
return;
}
BOOL InstallService()
{
WCHAR strDir[1024];
SC_HANDLE schSCManager,schService;
GetCurrentDirectory(1024,strDir);
lstrcat(strDir,L"\\WatchDogSvr.exe");
schSCManager = OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
if (schSCManager == NULL)
return false;
LPCTSTR lpszBinaryPathName=strDir;
schService = CreateService((struct SC_HANDLE__ *)schSCManager,L"WatchDogSvr",L"WatchDogSvr", // service name to display
SERVICE_ALL_ACCESS, // desired access
SERVICE_INTERACTIVE_PROCESS | SERVICE_WIN32_OWN_PROCESS, // service type
SERVICE_AUTO_START, // start type
SERVICE_ERROR_NORMAL, // error control type
lpszBinaryPathName, // service's binary
NULL, // no load ordering group
NULL, // no tag identifier
NULL, // no dependencies
NULL, // LocalSystem account
NULL); // no password
if (schService == NULL)
return false;
SERVICE_DESCRIPTION sdBuf;
sdBuf.lpDescription = L"深基坑后台服务";
ChangeServiceConfig2( schService, SERVICE_CONFIG_DESCRIPTION, &sdBuf);
CloseServiceHandle((struct SC_HANDLE__ *)schService);
return true;
}
BOOL DeleteService()
{
HANDLE schSCManager;
SC_HANDLE hService;
schSCManager = OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS);
if (schSCManager == NULL)
return false;
hService=OpenService((struct SC_HANDLE__ *)schSCManager,L"WatchDogSvr",SERVICE_ALL_ACCESS);
if (hService == NULL)
return false;
if(DeleteService(hService)==0)
return false;
if(CloseServiceHandle(hService)==0)
return false;
else
return true;
}
C++看门狗服务程序(代码)相关推荐
- C8051关闭看门狗汇编语言,汇编写启动代码之关看门狗
1 什么是看门狗? 看门狗(watch dog timer 看门狗定时器).大家想象这样一个场景:家门口有一只狗,这个狗定时会饿(譬如说2小时一饿),够饿了会胡乱咬死人.人进进出出要想保证安全必须提前 ...
- 《嵌入式 – GD32开发实战指南》第17章 看门狗
开发环境: MDK:Keil 5.30 开发板:GD32F207I-EVAL MCU:GD32F207IK GD32 有两个看门狗,一个是独立看门狗,另外一个是窗口看门狗,独立看门狗号称宠物狗,窗口看 ...
- STM32中的独立看门狗和窗口看门狗
STM32中的独立看门狗和窗口看门狗 在早期的MCU中是没有看门狗这种东西的,所以产品就很容易出现死机,跑飞的情况.为了避免这种情况的出现,后期的MCU都集成了看门狗的功能.但是,目前看门狗发展到今天 ...
- stm32 看门狗 BKP(HAL库)
(一)概述 stm32有两个看门狗:硬件看门狗(LSI 40KHz,时间精度不高)和窗口看门狗(APB1). (二)硬件看门狗实现代码 IWDG_HandleTypeDef hiwdg;// 硬件看门 ...
- 关于单片机看门狗的浅谈理解
单片机中所谓"看门狗",本质上就是一个计时器,主要作用就是用来防止代码卡死或跑飞,在单片机的应用中十分重要,但使用时却是十分简单方便的. 按字面意思理解,跟看家护院的狗狗是一个意思 ...
- 第四天:关看门狗、设置栈、控制icache、重定位、链接脚本
1.汇编写启动代码:关看门狗 什么是看门狗? 看门狗(watch dog timer看门狗定时器),比如:家门口有一只狗,这个狗定时会饿(譬如两小时一饿),狗饿了就会胡乱咬人,人进进出出要想保证安全必 ...
- 初学STM32之看门狗
初学STM32之看门狗 一.看门狗概述 1.什么是看门狗 单片机在工作中常常会受到来自外界电磁场的干扰,造成程序跑飞,而陷入死循环,程序的正常运行被打断,使得系统无法正常工作,造成整个系统陷入停滞状态 ...
- STM32开发(11)----CubeMX配置独立看门狗(IWDG)
CubeMX配置独立看门狗(IWDG) 前言 一.独立看门狗的介绍 二.实验过程 1.STM32CubeMX配置独立看门狗 2.代码实现 3.硬件连接 4.实验结果 总结 前言 本章介绍使用STM32 ...
- Python 看门狗功能实现
前言: 用 python 实时实现监控一个文件夹功能,将监控到的 Excel(笔者目前用于解析excel文件)解析写到 mysql 中,起功能和 sparkStreaming 中的 textFileS ...
最新文章
- 出身清华,大神朱俊彦再出GauGAN:AI让你变身神笔马良
- 论文Fast and accurate short read alignment with Burrows-Wheeler transform
- python 类的继承,类中的函数调用以及类输入数组
- Maven修改默认本地资源库文件夹
- ios的 UIButton
- stripslashes和addslashes的区别
- JavaScript通用表单验证函数
- 一加8 Lite或将搭载联发科天玑1000:支持SA、NSA双模5G
- java simpleentry_使用Java流生成对象
- redis学习笔记---java操作redis,使用expire模拟指定时间段内限制ip访问的次数;
- Java HttpServlet 详解
- 离散数学4_第5章关系与函数__关系矩阵
- 科技爱好者如何避免成为“民科”,以及为何科技爱好团体必须杜绝“民科”现象...
- 华为机试(Python)真题Od【A卷+B卷】
- [Minecraft]基于Forge的1.8.9MOD开发教程——第二讲:创建一个空Mod
- BUUCTF-WEB 【0CTF 2016】piapiapia 1
- 低功耗产品ADC精确测量电池电压(电量)
- 批量修改文件夹下文件的名字
- 电脑鼠标如何进行维护
- openpyxl单元格居中