轉載: https://blog.csdn.net/kikaylee/article/details/51395360
/*
@描述:一個簡單的Windows守護程序的例子(C++版本)
@作者:kikaylee
@日期:2016-05-13 10:30
*/
#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>
#include <io.h>
#include <iostream>
using namespace std;
//隐藏DOS黑視窗
#pragma comment(linker,"/subsystem:\"windows\" /entry:\"mainCRTStartup\"" )
//定義路徑最大程度
#define MAX_PATH 4096
//定義守護程序名稱
#define PROCCESS_NAME "test.exe"
//定義寫入的系統資料庫路徑
#define SELFSTART_REGEDIT_PATH "Software\\Microsoft\\Windows\\CurrentVersion\\Run\\"
//設定本身開機自啟動
BOOL SetSelfStart()
{
//擷取程式完整名稱
char pName[MAX_PATH]={0};
GetModuleFileNameA(NULL,pName,MAX_PATH);
//在系統資料庫中寫入啟動資訊
HKEY hKey=NULL;
LONG lRet=NULL;
lRet=RegOpenKeyExA(HKEY_LOCAL_MACHINE,SELFSTART_REGEDIT_PATH,0,KEY_ALL_ACCESS,&hKey);
//判斷是否成功
if(lRet!=ERROR_SUCCESS)
{
return FALSE;
}
lRet=RegSetValueExA(hKey,"testProtect",0,REG_SZ,(const unsigned char*)pName,strlen(pName)+sizeof(char));
//判斷是否成功
if(lRet!=ERROR_SUCCESS)
{
return FALSE;
}
//關閉系統資料庫
RegCloseKey(hKey);
return TRUE;
}
int main()
{
//設定程式開機自啟動
if(!SetSelfStart())
{
cout<<"守護程序開機自啟動失敗"<<endl;
return -1;
}
STARTUPINFOA si;
//程序對象
PROCESS_INFORMATION pi;
//初始化
ZeroMemory(&si,sizeof(si));
si.cb=sizeof(si);
ZeroMemory(&pi,sizeof(pi));
//擷取目前程式的路徑
char pPath[MAX_PATH]={0};
GetCurrentDirectoryA(MAX_PATH,pPath);
//拼接需要守護的程式
strcat(pPath,"\\");
strcat(pPath,PROCCESS_NAME);
//構造cmd執行守護程序的字元串
char pCmd[MAX_PATH]={0};
strcat(pCmd,"cmd /c ");
strcat(pCmd,pPath);
//無限循環,監視守護程序
do{
//檢查守護程式是否存在
if(_access(pPath,0)!=-1)
{
//建立子程序,判斷是否執行成功
if(!CreateProcessA(NULL,pCmd,NULL,NULL,FALSE,0,NULL,NULL,&si,&pi))
{
cout<<"守護程序啟動失敗,程式即将退出"<<endl;
return -1;
}
//啟動成功,擷取程序的ID
cout<<"守護程序成功,ID:"<<pi.dwProcessId<<endl;
//無限等待子程序退出
WaitForSingleObject(pi.hProcess,INFINITE);
//如果退出了
cout<<"守護程序退出了。。。"<<endl;
//關閉程序和句柄
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
}
else
{
cout<<"守護程式不存在"<<endl;
}
//睡一下,重新開機
Sleep(2000);
}
while(true);
return 0;
}