Windows守护进程简单示例

简介: 转载:https://blog.csdn.net/kikaylee/article/details/51395360/*@描述:一个简单的Windows守护进程的例子(C++版本)@作者:kikaylee@日期:201...

转载:
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;
}
目录
相关文章
|
6月前
|
Windows
windows环境下根据端口号查询进程编号并杀掉此进程
windows环境下根据端口号查询进程编号并杀掉此进程
|
应用服务中间件 nginx Windows
windows下DOS命令杀掉Nginx应用进程
windows下DOS命令杀掉Nginx应用进程
158 1
|
存储 Cloud Native Linux
windows检测进程是否存在?强制杀死进程
windows检测进程是否存在?强制杀死进程
|
Windows
Windows查看端口占用以及关闭相应的进程
Windows查看端口占用以及关闭相应的进程
276 0
|
1月前
|
Java 关系型数据库 MySQL
java控制Windows进程,服务管理器项目
本文介绍了如何使用Java的`Runtime`和`Process`类来控制Windows进程,包括执行命令、读取进程输出和错误流以及等待进程完成,并提供了一个简单的服务管理器项目示例。
36 1
|
2月前
|
算法 调度 Python
探索操作系统的内核——一个简单的进程调度示例
【9月更文挑战第17天】在这篇文章中,我们将深入探讨操作系统的核心组件之一——进程调度。通过一个简化版的代码示例,我们将了解进程调度的基本概念、目的和实现方式。无论你是初学者还是有一定基础的学习者,这篇文章都将帮助你更好地理解操作系统中进程调度的原理和实践。
|
3月前
|
Java Windows
【Azure Developer】Windows中通过pslist命令查看到Java进程和线程信息,但为什么和代码中打印出来的进程号不一致呢?
【Azure Developer】Windows中通过pslist命令查看到Java进程和线程信息,但为什么和代码中打印出来的进程号不一致呢?
|
3月前
|
Windows
Windows中如何查看被占用的端口、杀掉对应的进程
这篇文章介绍了在Windows系统中如何查看被占用的端口号以及如何杀掉占用端口的进程,包括使用命令提示符的`netstat -ano | findstr 端口号`命令查找进程PID,然后通过任务管理器或`taskkill /PID PID号`命令来结束进程。
Windows中如何查看被占用的端口、杀掉对应的进程
|
3月前
|
C# Windows 开发者
当WPF遇见OpenGL:一场关于如何在Windows Presentation Foundation中融入高性能跨平台图形处理技术的精彩碰撞——详解集成步骤与实战代码示例
【8月更文挑战第31天】本文详细介绍了如何在Windows Presentation Foundation (WPF) 中集成OpenGL,以实现高性能的跨平台图形处理。通过具体示例代码,展示了使用SharpGL库在WPF应用中创建并渲染OpenGL图形的过程,包括开发环境搭建、OpenGL渲染窗口创建及控件集成等关键步骤,帮助开发者更好地理解和应用OpenGL技术。
249 0
|
3月前
|
存储 Linux Windows
【应用服务 App Service】App Service For Windows 如何挂载Storage Account File Share 示例
【应用服务 App Service】App Service For Windows 如何挂载Storage Account File Share 示例
下一篇
无影云桌面