轉載:
https://blog.csdn.net/kikaylee/article/details/51395360ios
/* @描述:一個簡單的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; }