精华内容
下载资源
问答
  • 2021-01-12 17:04:03

    一、逻辑分析

    1、windows没有fork函数,无法创建僵尸进程,使用打开非子进程的方式打开外部进程---打开外部进程

    2、守护进程应该是单例的进程---》单例进程

    3、守护进程应该是存在一个子线程不断的判断是否存在守护目标,若不存在(异常退出)则启动守护目标

    4、当守护目标正常退出时,需要关闭守护进程

    (1)、直接kill掉守护进程(守护进程没有做成病毒进程(系统进程)---记录下这里没找到方法)

    (2)、进程间通讯实现关闭守护进程---有很多的方法博主使用的是命名管道

    二、守护线程

    #pragma once
    
    #include <QThread>
    
    class HiDaemon : public QThread
    {
    	Q_OBJECT
    public:
    	HiDaemon(QObject *parent = nullptr);
    	~HiDaemon();
    
    public slots:
    	void start();
    	void stop();
    
    private:
    	void run();
    
    private:
    	volatile bool			m_bRunning;
    
    	QString					m_strFilePath;
    	QString					m_strProducerName;
    };
    
    #include "HiDaemon.h"
    #include <windows.h>
    #include "tlhelp32.h"
    #include "tchar.h"
    #include "HiDaemonDef.h"
    #include "HiUtils.h"
    #include <QMessageBox>
    
    HiDaemon::HiDaemon(QObject *parent)
    	: QThread(parent)
    	, m_bRunning(false)
    	, m_strProducerName("")  // 这里自定义默认值
    {
    	m_strFilePath = QApplication::applicationDirPath();
    
    	QStringList strList = QApplication::arguments();
    	if (strList.size() > 1)
    	{
    		m_strProducerName = strList.at(1);
    	}
    }
    
    HiDaemon::~HiDaemon()
    {
    }
    
    void HiDaemon::start()
    {
    	if (m_bRunning)
    	{
    		return;
    	}
    	m_bRunning = true;
    
    	QThread::start();
    }
    
    void HiDaemon::stop()
    {
    	m_bRunning = false;
    	wait(1000);
    }
    
    void HiDaemon::run()
    {
    	STARTUPINFOA si;
    	//进程对象
    	PROCESS_INFORMATION pi;
    	//初始化 
    	ZeroMemory(&si, sizeof(si));
    	si.cb = sizeof(si);
    	ZeroMemory(&pi, sizeof(pi));
    
    	//构造cmd执行守护进程的字符串
    	char pCmd[MAX_PATH_NUM] = { 0 };
    
    	{
    		QFileInfo file(m_strFilePath + QDir::separator() + m_strProducerName);
    
    		QString strFilePath = file.filePath();
    		strcat_s(pCmd, strFilePath.toStdString().c_str());
    	}
    	
    	while (m_bRunning)
    	{
    		//检查守护程序是否存在
    		pi.hProcess = GetProcessHandleByName(m_strProducerName);
    
    		if (pi.hProcess == nullptr)
    		{
    			// 创建子进程,判断是否执行成功
    			if (CreateProcessA(NULL, pCmd, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi))
    			{
    				// 创建失败
    			}
    		}
    
    		if (pi.hProcess != nullptr)
    		{
    			//无限等待子进程退出
    			WaitForSingleObject(pi.hProcess, INFINITE);
    			CloseHandle(pi.hProcess);
    			CloseHandle(pi.hThread);
    		}
    		
    
    		Sleep(100);
    	}
    }
    

    二、命名管道实时通讯

    #pragma once
    #include <windows.h>
    #include <QThread>
    
    //
    //HANDLE CreateNamedPipe(
    //	LPCTSTR lpName,								// pipe name
    //	DWORD dwOpenMode,							// pipe open mode
    //	DWORD dwPipeMode,							// pipe-specific modes
    //	DWORD nMaxInstances,						// maximum number of instances
    //	DWORD nOutBufferSize,						// output buffer size
    //	DWORD nInBufferSize,						// input buffer size
    //	DWORD nDefaultTimeOut,						// time-out interval
    //	LPSECURITY_ATTRIBUTES lpSecurityAttributes  // SD
    //  );
    //
    
    class HiNamePipeServer : public QThread
    {
    	Q_OBJECT
    public:
    	HiNamePipeServer(QObject *parent = nullptr);
    	~HiNamePipeServer();
    
    	void start();
    	void stop();
    
    private slots:
    	void onParse();
    
    private:
    	void creatPipe();
    	void run();
    
    signals:
    	void parse();
    	void stopDaemon();
    
    private:
    	HANDLE						 m_pHandle;
    	HANDLE						 m_pEvent;
    	volatile bool				 m_bRunning;
    	char						 m_readbuffer[100];
    	DWORD						 m_readLenth;
    	bool						 m_resetStarted;
    	QString						 m_strFilePath;
    	QString						 m_strProducerName;
    };
    #include "HiNamePipeServer.h"
    #include <windows.h>
    #include <QDebug>
    #include "HiDaemonDef.h"
    #include "HiUtils.h"
    HiNamePipeServer::HiNamePipeServer(QObject *parent)
    	: QThread(parent)
    	, m_bRunning(false)
    	, m_pHandle(nullptr)
    	, m_resetStarted(false)
    {
    	creatPipe();
    	connect(this, &HiNamePipeServer::parse, this, &HiNamePipeServer::onParse, Qt::DirectConnection);
    	m_strFilePath = QApplication::applicationDirPath();
    
    	QStringList strList = QApplication::arguments();
    	if (strList.size() > 1)
    	{
    		m_strProducerName = strList.at(1);
    	}
    }
    
    HiNamePipeServer::~HiNamePipeServer()
    {
    	if (m_pHandle)
    	{
    		CloseHandle(m_pHandle);
    	}
    	CloseHandle(m_pEvent);
    }
    
    void HiNamePipeServer::start()
    {
    	if (m_bRunning)
    	{
    		return;
    	}
    	m_bRunning = true;
    	QThread::start();
    }
    
    void HiNamePipeServer::stop()
    {
    	m_bRunning = false;
    }
    
    void HiNamePipeServer::onParse()
    {
    	QString strMsg = m_readbuffer;
    
    	QStringList paramList = strMsg.split(WRITE_SPACER);
    	if (paramList.size() != 2)
    	{
    		return;
    	}
    	
    	PipeWriteType writeType = PipeWriteType(paramList.at(0).toInt());
    
    	switch (writeType)
    	{
    	case PipeWriteType_ClientExit:
    	{
    		emit stopDaemon();
    		qApp->quit();
    		break;
    	}
    	case PipeWriteType_ClinetRestart:
    	{
    		if (m_resetStarted == false)
    		{
    			m_resetStarted = true;
    			KillProcess(m_strProducerName);
    		}
    		break;
    	}
    	default:
    		break;
    	}
    
    }
    
    void HiNamePipeServer::creatPipe()
    {
    	m_pHandle = CreateNamedPipe(PIPE_NAME, PIPE_ACCESS_DUPLEX, PIPE_TYPE_BYTE | PIPE_READMODE_BYTE, PIPE_MAXINSTANCES, 0, 0, 1000, NULL);
    	if (INVALID_HANDLE_VALUE == m_pHandle)
    	{
    		CloseHandle(m_pHandle);
    		// 创建管道失败
    		m_pHandle = nullptr;
    	}
    }
    
    void HiNamePipeServer::run()
    {
    	// 这里暂时同步调用,可以考虑使用异步设置超时事件
    	while (m_bRunning)
    	{
    		OVERLAPPED  ovlap;
    		ZeroMemory(&ovlap, sizeof(OVERLAPPED));
    		//2. 创建管道连接
    		if (!ConnectNamedPipe(m_pHandle, &ovlap))
    		{
    			if (ERROR_IO_PENDING != GetLastError())
    			{
    				Sleep(100);
    				continue;
    			}
    		}
    
    		// 这个等待可能非常的久
    		if (ReadFile(m_pHandle, m_readbuffer, 100, &m_readLenth, NULL) == TRUE)
    		{
    			emit parse();
    		}
    		DisconnectNamedPipe(m_pHandle);
    	}
    }
    

    管道读取线程是阻塞的

    三、主函数

    #include <stdio.h>
    #include <stdlib.h>
    #include <io.h>
    #include <iostream>
    #include <string>
    #include <QString>
    #include <QApplication>
    #include "HiNamePipeServer.h"
    #include "HiDaemon.h"
    #include <QObject>
    #include "HiSingleApplication.h"
    
    LPCTSTR szAppClassName = TEXT("HiDaemon");
    LPCTSTR szAppWindowName = TEXT("HiDaemon");
    
    
    // HANDLE hProcess = ::OpenProcess(PROCESS_TERMINATE, FALSE, dwProcessID);
    // ::TerminateProcess(hProcess, 0);
    // CloseHandle(hProcess);
    
    using namespace std;
    
    // 隐藏DOS黑窗口
    #ifdef _MSC_VER
    #pragma comment( linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"" )
    #endif
    
    int main(int argc, char* argv[])
    {
    	HiSingleApplication a(argc, argv);
    	// 这里应该传入的产品类型,不同的产品,启动后可能动作不一致
    	QCoreApplication::setOrganizationName("EnlightV");
    	QCoreApplication::setApplicationName("HiDaemon");
    	if (a.isRunning())
    	{
    		return 0;
    	}
    
    	HiDaemon *daemon = new HiDaemon;
    	HiNamePipeServer *server = new HiNamePipeServer;
    
    	QObject::connect(server, &HiNamePipeServer::stopDaemon, daemon, &HiDaemon::stop, Qt::DirectConnection);
    
    	daemon->start();
    	server->start();
    
    	a.exec();
    
    	return 0;
    }

    四、应用程序启动守护进程

    // 获取守护进程句柄
    HANDLE GetProcessHandleByName(const QString &name)
    {
    	HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    	if (INVALID_HANDLE_VALUE == hSnapshot)
    	{
    		return NULL;
    	}
    	PROCESSENTRY32 pe = { sizeof(pe) };
    	BOOL fOk;
    	for (fOk = Process32First(hSnapshot, &pe); fOk; fOk = Process32Next(hSnapshot, &pe))
    	{
    		if (QString::fromWCharArray(pe.szExeFile) == name)
    		{
    			CloseHandle(hSnapshot);
    			return GetProcessHandle(pe.th32ProcessID);
    		}
    	}
    	return NULL;
    }
    
    //tempPath 是自定义的一个可写目录
    void StartDaemon(const QString &tempPath)
    {
    	// 1、检测守护进程是否已经启动了
    	if (GetProcessHandleByName(DAEMON_NAME) != nullptr)
    	{
    		return;
    	}
    
    	QString batFile = tempPath + QDir::separator() + "StartDaemon.bat";
    	if (QFile(batFile).exists())
    	{
    		QFile(batFile).remove();
    	}
    
    	QFile file(batFile);
    	if (file.open(QFile::ReadWrite))
    	{
    		QString strParam = QString("@echo off \n start /d  \"%1\" HiDaemond.exe  \"%2\" \n exit").arg(QCoreApplication::applicationDirPath()).arg(QFileInfo(QCoreApplication::applicationFilePath()).fileName());
    		file.write(strParam.toLocal8Bit());
    		file.close();
    
    		QProcess p;
    		p.start("cmd.exe", QStringList() << "/c" << batFile);
    		if (p.waitForStarted())
    		{
    			p.waitForFinished(2000);
    			return;
    		}
    	}
    	else
    	{
    		QString strAppPath = QApplication::applicationDirPath();
    		QStringList arguments;
    		{
    			QFileInfo file(QApplication::applicationFilePath());
    			arguments.append(file.fileName());
    		}
    		QFileInfo deamonFile(strAppPath + QDir::separator() + DAEMON_NAME);
    		if (deamonFile.exists())
    		{
    			std::wstring operate = QString("runas").toStdWString();//临时提升管理员权限
    			std::wstring path = QCoreApplication::applicationDirPath().toStdWString();
    			std::wstring appName = QFileInfo(QCoreApplication::applicationFilePath()).fileName().toStdWString();;
    			std::wstring file = deamonFile.filePath().toStdWString();
    			int ret = (int)ShellExecute(NULL, operate.c_str(), file.c_str(), appName.c_str(), path.c_str(), SW_SHOWNORMAL);
    		}
    
    	}
    }
    

    五、主端关闭时候,通讯给守护进程自行关闭

    #pragma once
    
    #include <windows.h>
    
    class HiNamePipeClient
    {
    public:
    	static HiNamePipeClient* getInstance();
    	void writeFile(PipeWriteType type,  const QString & param = QString());
    
    protected:
    	HiNamePipeClient();
    	~HiNamePipeClient();
    
    private:
    	bool openPipe();
    
    private:
    	HANDLE  m_pHandle;
    };
    
    inline HiNamePipeClient *pipeClient()
    {
    	return HiNamePipeClient::getInstance();
    }
    #include "HiNamePipeClient.h"
    #include "guard.h"
    
    enum PipeWriteType
    {
    	PipeWriteType_ClientExit = 0,							// 客户端正常退出
    	PipeWriteType_ClinetRestart,							// 客户端重启
    };
    
    HiNamePipeClient* HiNamePipeClient::getInstance()
    {
    	static HiNamePipeClient instance;
    	return &instance;
    }
    
    void HiNamePipeClient::writeFile(PipeWriteType type, const QString & param)
    {
    #if HIRENDER_C_SERIES
    	if (openPipe())
    	{
    		DWORD dwWriteLen = 0;
    		QString strParam = QString("%1#%2").arg((int)type).arg(param);
    		if (WriteFile(m_pHandle, strParam.toStdString().c_str(), strParam.length(), &dwWriteLen, NULL))
    		{
    			// 写入成功
    		}
    		CloseHandle(m_pHandle);
    		m_pHandle = nullptr;	
    	}
    	Sleep(200);
    #endif
    }
    
    HiNamePipeClient::HiNamePipeClient()
    	: m_pHandle(nullptr)
    {
    
    }
    
    HiNamePipeClient::~HiNamePipeClient()
    {
    
    }
    
    bool HiNamePipeClient::openPipe()
    {
    	if (m_pHandle)
    	{
    		CloseHandle(m_pHandle);
    	}
    	if (!WaitNamedPipe(PIPE_NAME, PIPE_TIMEOUT))
    	{
    		// 当前没有可利用的命名管道实例!
    		return false;
    	}
    
    	m_pHandle = CreateFile(PIPE_NAME, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    	if (INVALID_HANDLE_VALUE == m_pHandle)
    	{
    		// "打开命名管道失败!
    		m_pHandle = NULL;
    		return false;
    	}
    	return true;
    }
    

    六、强制关闭守护进程(提供方法、博主程序中未使用)

    
    bool KillProcess(QString ProcessName)
    {
    	QProcess p;
    	QString c = "taskkill /im " + ProcessName + " /f";    //exeFileName为要杀死的进程名
    	p.execute(c);
    	p.close();
    	return true;
    }

     

    更多相关内容
  • Windows编程之双进程守护

    千次阅读 2017-12-26 20:25:39
    需求分析设计实现双进程守护程序,当两个进程同时运行时,关闭其中任意一个,另一个进程会识别出来并马上打开被关闭的进程。设计原理相关函数CreateEvent( ) CreateEvent是一个Windows API函数。它用来创建或打开一...

    Windows编程之双进程守护


    需求分析

    设计实现双进程守护程序,当两个进程同时运行时,关闭其中任意一个,另一个进程会识别出来并马上打开被关闭的进程。

    设计原理

    相关函数

    CreateEvent( )
    CreateEvent是一个Windows API函数。它用来创建或打开一个命名的或无名的事件对象。如果想为对象指定一个访问掩码,应当使用CreateEventEx函数。
    语法:
    HANDLE CreateEvent(
    LPSECURITY_ATTRIBUTES lpEventAttributes, // 安全属性
    BOOL bManualReset,// 复位方式
    BOOL bInitialState,// 初始状态
    LPCTSTR lpName // 对象名称
    );
    参数:
    lpEventAttributes[输入]
    一个指向SECURITY_ATTRIBUTES结构的指针,确定返回的句柄是否可被子进程继承。如果lpEventAttributes是NULL,此句柄不能被继承。
    bManualReset[输入]
    指定将事件对象创建成手动复原还是自动复原。如果是TRUE,那么必须用ResetEvent函数来手工将事件的状态复原到无信号状态。如果设置为FALSE,当一个等待线程被释放以后,系统将会自动将事件状态复原为无信号状态。
    bInitialState[输入]
    指定事件对象的初始状态。如果为TRUE,初始状态为有信号状态;否则为无信号状态。
    lpName[输入]
    指定事件的对象的名称,是一个以0结束的字符串指针。名称的字符格式限定在MAX_PATH之内。名字是对大小写敏感的。
    如果lpName指定的名字,与一个存在的命名的事件对象的名称相同,函数将请求EVENT_ALL_ACCESS来访问存在的对象。这时候,由于bManualReset和bInitialState参数已经在创建事件的进程中设置,这两个参数将被忽略。如果lpEventAttributes是参数不是NULL,它将确定此句柄是否可以被继承,但是其安全描述符成员将被忽略。
    如果lpName为NULL,将创建一个无名的事件对象。
    如果lpName的和一个存在的信号、互斥、等待计时器、作业或者是文件映射对象名称相同,函数将会失败,在GetLastError函数中将返回ERROR_INVALID_HANDLE。造成这种现象的原因是这些对象共享同一个命名空间。
    终端服务(Terminal Services):名称中可以加入”Global\”或是”Local\”的前缀,这样可以明确的将对象创建在全局的或事务的命名空间。名称的其它部分除了反斜杠( \ ),可以使用任意字符。详细内容可参考Kernel Object Name Spaces。
    返回值:
    如果函数调用成功,函数返回事件对象的句柄。如果对于命名的对象,在函数调用前已经被创建,函数将返回存在的事件对象的句柄,而且在GetLastError函数中返回ERROR_ALREADY_EXISTS。
    如果函数失败,函数返回值为NULL,如果需要获得详细的错误信息,需要调用GetLastError。

    OpenEvent():
    OpenEvent是一个函数,可以用来执行返回事件对象的句柄。
    函数功能:
    打开一个已经存在的命名事件对象
    函数原型
    HANDLE OpenEvent(
    DWORD dwDesiredAccess,
    BOOL bInheritHandle,
    LPCTSTR lpName
    );
    参数说明
    dwDesiredAccess
    指定对事件对象的请求访问权限,如果安全描述符指定的对象不允许要求通过对调用该函数的过程,函数将返回失败。
    该参数必须设置为以下值:
    EVENT_ALL_ACCESS
    指定事件对象所有可能的权限
    bInheritHandle
    指定是否返回的句柄是否继承 。该参数必须设置为false
    lpName
    指向一个以null结束的字符串,即将要打开的事件对象的名字。名称是区分大小写的。
    返回值
    函数执行成功则返回事件对象的句柄;失败则返回NULL,获取错误信息可以使用GetLastError

    WaitForSingleObject( )
    WaitForSingleObject是一种Windows API函数,当等待仍在挂起状态时,句柄被关闭,那么函数行为是未定义的。该句柄必须具有 SYNCHRONIZE 访问权限。
    WaitForSingleObject函数用来检测hHandle事件的信号状态,在某一线程中调用该函数时,线程暂时挂起,如果在挂起的dwMilliseconds毫秒内,线程所等待的对象变为有信号状态,则该函数立即返回;如果超时时间已经到达dwMilliseconds毫秒,但hHandle所指向的对象还没有变成有信号状态,函数照样返回。
    DWORD WINAPI WaitForSingleObject(
    __in HANDLE hHandle,
    __in DWORD dwMilliseconds
    );
    hHandle
    对象句柄。可以指定一系列的对象,如Event、Job、Memory resource notification、Mutex、Process、Semaphore、Thread、Waitable timer等。
    dwMilliseconds
    定时时间间隔,单位为milliseconds(毫秒).如果指定一个非零值,函数处于等待状态直到hHandle标记的对象被触发,或者时间到了。如果dwMilliseconds为0,对象没有被触发信号,函数不会进入一个等待状态,它总是立即返回。如果dwMilliseconds为INFINITE,对象被触发信号后,函数才会返回。

    CreateMutex()
    CreateMutex是一个计算机函数,作用是找出当前系统是否已经存在指定进程的实例。如果没有则创建一个互斥体。
    HANDLE CreateMutex(
    LPSECURITY_ATTRIBUTES lpMutexAttributes, // 指向安全属性的指针
    BOOL bInitialOwner, // 初始化互斥对象的所有者
    LPCTSTR lpName // 指向互斥对象名的指针
    );
    返回值:
    Long,如执行成功,就返回互斥体对象的句柄;零表示出错。会设置GetLastError。如果返回的是一个有效句柄,但指定的名字已经存在,GetLastError也会设为ERROR_ALREADY_EXISTS,bInitialOwner的值将会被忽略。如果调用者限制了权限,GetLastError将会返回ERROR_ACCESS_DENIED,这个时候应该使用OpenMutex函数。
    参数:
    lpMutexAttributes SECURITY_ATTRIBUTES
    指定一个SECURITY_ATTRIBUTES结构,或传递零值(将参数声明为ByVal As Long,并传递零值),表示使用不允许继承的默认描述符
    bInitialOwner BOOL,如创建进程希望立即拥有互斥体,则设为TRUE。一个互斥体同时只能由一个线程拥有
    lpName String
    指定互斥体对象的名字。用vbNullString创建一个未命名的互斥体对象。如已经存在拥有这个名字的一个事件,则打开现有的已命名互斥体。这个名字可能不与现有的事件、信号机、可等待计时器或文件映射相符

    OpenMutex()
    OpenMutex函数为现有的一个已命名互斥体对象创建一个新句柄。
    HANDLE OpenMutex(
    DWORD dwDesiredAccess, // access
    BOOL bInheritHandle, // inheritance option
    LPCTSTR lpName // object name
    );
    参数:
    dwDesiredAccess:
    MUTEX_ALL_ACCESS 请求对互斥体的完全访问
    MUTEX_MODIFY_STATE 允许使用 ReleaseMutex 函数
    SYNCHRONIZE 允许互斥体对象同步使用
    bInheritHandle :
    如希望子进程能够继承句柄,则为TRUE
    lpName :
    要打开对象的名字
    返回值:
    如执行成功,返回对象的句柄;零表示失败。

    设计详细

    采用两种方法实现双进程守护。

    方法1.

    创建两个event句柄,使用CreateEvent创建打开事件对象。进入循环监控,如果进程2没有被打开,则使用CreateProcess函数打开进程,并显示其PID,使用WaitForSingleObject函数等待守护的进程被关闭,如果守护的进程被关闭,则Sleep 0.5秒后进入下一次循环,打开守护的进程。
    进程2也使用于进程1同样的原理,两个进程相互守护。(注,编译链接成功后,把工程的Debug文件夹中的exe程序取出,两者分别命名为protect1、protect2,两者需要放在同一个目录下运行)。
    代码:
    守护进程1

    #include <windows.h>
    #include <stdio.h>
    int main()
    {
        HANDLE event1;
        HANDLE event2;
        STARTUPINFO si = { 0 };
        PROCESS_INFORMATION pi = { 0 };
        event1=CreateEvent(NULL, FALSE, TRUE, "Local\\p1");
        while (true)
        {
            if (!(event2 = OpenEvent(EVENT_MODIFY_STATE, FALSE, "Local\\p2")))
            {
                if (!CreateProcess("protect2.exe",
                    NULL,
                    NULL,
                    NULL,
                    NULL,
                    CREATE_NEW_CONSOLE,                                    
                    NULL,
                    NULL,
                    &si,
                    &pi 
                    ))
                {
                    printf("打开守护进程失败!\n");
                }
                else printf("打开守护进程成功!PID:%d \n", pi.dwProcessId);
                WaitForSingleObject(pi.hProcess, INFINITE);
                printf("守护进程被关闭!\n");
                CloseHandle(pi.hProcess);
            }
            CloseHandle(event2);
            Sleep(1000);
        }
        return 0;
    }

    守护进程2:

    #include <windows.h>
    #include <stdio.h>
    int main()
    {
        HANDLE event1;
        HANDLE event2;
        STARTUPINFO si = { 0 };
        PROCESS_INFORMATION pi = { 0 };
        event2 = CreateEvent(NULL, FALSE, TRUE, "Local\\p2");
        while (true)
        {
            if (!(event1 = OpenEvent(EVENT_MODIFY_STATE, FALSE, "Local\\p1")))
            {
                if (!CreateProcess("protect1.exe",
                    NULL,
                    NULL,
                    NULL,
                    NULL,
                    CREATE_NEW_CONSOLE,
                    NULL,
                    NULL,
                    &si,
                    &pi
                    ))
                {
                    printf("打开守护进程失败!\n");
                }
    
                printf("打开守护进程成功!PID:%d \n", pi.dwProcessId);
                WaitForSingleObject(pi.hProcess, INFINITE);
                printf("守护进程被关闭!\n");
                CloseHandle(pi.hProcess);
            }
            CloseHandle(event1);
            Sleep(1000);
        }
        return 0;
    }
    

    方法2:

    本方法使用CreateThread,WaitForSingleObject,CreateMutex与OpenMutex函数
    代码:编写一个DWORD WINAPI函数名为ThreadCheckPro,输入参数为进程名,用来检测守护进程是否被关闭。函数中创建hMutex变量,使用while循环判断能否用OpenMutex打开守护的进程,使用if判断,如果不能打开,意味着守护的进程被关闭,于是使用CreateProcess函数在原目录下创建打开守护的进程,打开成功后再使用WaitForSingleObject监控等待进程被关闭的时候,进程被再次关闭时,关闭pi.hProcess、pi.hThread两个句柄,跳出判断结构,Sleep 0.5秒后进入下一次循环,于是便能再次打开守护的进程。
    程序2原理与程序1 相同。(在VC中代码编译链接成功后,进入两个守护程序工程的Debug文件中找出exe文件,把它们放在同一个目录下并分别命名为test1与test2。)
    守护程序1:

    #include <windows.h>
    #include<stdio.h>
    DWORD WINAPI ThreadCheckProc(LPVOID lParam){
        STARTUPINFO si={sizeof(si)};
        PROCESS_INFORMATION pi={0};
        HANDLE hMutex;
        char *pName=(char *)lParam;
        while(true){
            hMutex=OpenMutex(MUTEX_ALL_ACCESS,FALSE,pName);
            if(!hMutex){
                CreateProcess(pName,
                NULL,
                NULL,
                NULL,
                FALSE, 
                CREATE_NEW_CONSOLE, 
                NULL,
                NULL, 
                &si,
                &pi ); 
                WaitForSingleObject( pi.hProcess, INFINITE );
                CloseHandle( pi.hProcess );
                CloseHandle( pi.hThread );
            }
            else{
                CloseHandle(hMutex);
            }
            Sleep(500);
        }
    }
    int main()
    {
        DWORD ThreadId;
        CreateMutex(NULL,TRUE,"test1.exe");
        CreateThread(NULL,0,ThreadCheckProc,(LPVOID *)"test2.exe",0,&ThreadId);
        printf("Protected\n");
        while(1){
        Sleep(500);
        }
        return 0;
    }
    

    守护程序2

    #include <windows.h>
    #include<stdio.h>
    DWORD WINAPI ThreadCheckProc(LPVOID lParam){
        STARTUPINFO si={sizeof(si)};
        PROCESS_INFORMATION pi={0};
        HANDLE hMutex;
        char *pName=(char *)lParam;
        while(true){
            hMutex=OpenMutex(MUTEX_ALL_ACCESS,FALSE,pName);
            if(!hMutex){
                CreateProcess(pName,
                NULL,
                NULL,
                NULL, 
                FALSE, 
                CREATE_NEW_CONSOLE, 
                NULL, 
                NULL, 
                &si, 
                &pi ); 
                WaitForSingleObject( pi.hProcess, INFINITE );
                CloseHandle( pi.hProcess );
                CloseHandle( pi.hThread );
            }
            else{
                CloseHandle(hMutex);
            }
            Sleep(500);
        }
    }
    int main()
    {
        DWORD ThreadId;
        CreateMutex(NULL,TRUE,"test2.exe");
        CreateThread(NULL,0,ThreadCheckProc,(LPVOID *)"test1.exe",0,&ThreadId);
        printf("Protected\n");
        while(1){
            Sleep(500);
        }
        return 0;
    }
    

    项目测试情况

    方法1:

    打开protect1程序,protect2被自动打开,并显示守护进程打开成功,进程号为8548
    这里写图片描述
    关闭protect1程序,protect2马上把它再度打开,显示守护进程打开成功,进程号为8200
    这里写图片描述
    再次关闭protect1,protect1被再度打开
    这里写图片描述

    方法2

    打开test1,test2立马被打开,两个进程显示protected,相互守护。
    这里写图片描述
    任意关闭两者之间的一个程序,另一个作为守护进程又马上把被关闭的程序打开。
    这里写图片描述

    总结

    进程守护是保护进程不被错误关闭,保证程序能一直运行的常用手段,同时也可能会被恶意代码所利用,恶意代码可以通过远程线程注入,在合法的程序中为自己设置守护进程,只要守护程序没被关闭,恶意代码就能一直运行。通过这次的双进程守护程序设计实验,我学会了如何使用CreateEvent、OpenEvent、CreateMutex、OpenMutex与CreateProcess、CreateThread这些Windows API函数,成功实现了具有相互守护功能的程序。
    不足之处是,对这些Windows API函数的理解还不是很透彻,只是依据使用说明依次对齐进行参数的设置,并不清楚它们的实现原理和一些错误处理,在以后的学习中,会更加注重Windows编程的基础学习,弄清各种函数的底层原理,以便能更透彻地掌握各种API的用法,能避免更多不必要的错误。

    展开全文
  • 适用服务器软件维护人员维护工作 windows7及以上(X64) 支持多exe桌面程序进行监护 可以根据 进程状态 内存cpu 使用量作为条件设置重启,也支持指定多个时间点进行重启
  • Qt编写守护进程

    2019-03-02 14:56:06
    本篇文章提供一软件实现守护进程的办法,原理就是udp通信,单独写个守护进程程序,专门负责检测主程序是否存在,不存在则启动。主程序只需要启动live类监听端口,收到hello就回复ok就行。 为了使得兼容任意程序,...
  • windows进程 windows多进程编程

    千次阅读 2021-12-20 21:46:50
    个进程好像是支持Window通用应用的进程,结束该进程后,所有的windows 通用应用(就是Metro应用)都会强行结束,翻译一下应该叫 “应用程序框架主机进程” adobe genuine software service—Adobe 正版软件服务 ...

    windows多进程编程

    https://blog.csdn.net/bxhj3014/article/details/2082255

    Win8 CPU占用率高,服务主机:本地服务进程占用CPU高

    https://blog.csdn.net/n1n4m5/article/details/28487191?ops_request_misc=&request_id=&biz_id=102&utm_term=windows%E6%9C%8D%E5%8A%A1%E4%B8%BB%E6%9C%BA%E8%BF%9B%E7%A8%8B&utm_medium=distribute.pc_search_result.none-task-blog-2allsobaiduweb~default-2-28487191.first_rank_v2_pc_rank_v29&spm=1018.2226.3001.4187

    -2.igfxem module

    igfxem module是intel核显驱动的程序之一,很多人在更新驱动程序,亦或误删除了某些文件之后,就会在开机后弹出igfxem Module已停止工作的提示框,这是由于显卡的问题而造成的

    -1.## Windows Modules Installer Worker

    https://blog.csdn.net/yjxfg_future/article/details/115856749?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522164001904916780366537664%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=164001904916780366537664&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_ecpm_v1~rank_v31_ecpm-1-115856749.pc_search_result_control_group&utm_term=windows+moduls+indtaller&spm=1018.2226.3001.4187
    问题:
    重装win10系统后,正常开机使用下发现,笔记本风扇不停转,查看资源管理器发现CPU占用率高,甚至高大100%。找出占用CPU最高的进程是Windows Modules Installer Worker。
    什么是Windows Modules Installer Worker?
    Windows Modules Installer Worker(TiWorker.exe)是一种Windows Update服务,用于查找新更新并将其安装到您的计算机上。 换句话说,当您的计算机系统检查Windows更新或安装任何更新时,此过程将自动运行。
    如何修复Windows Modules Installer Worker 占用CPU高问题?
    以下是您可以尝试解决此问题的2种解决方案。 你可能不必尝试这两种方法; 如果方法1不起作用,则可以尝试方法2来解决问题。 此外,您可以尝试我们的额外提示来解决您的计算机问题。
    1、停止并禁用Windows Update服务
    2、更改您的Internet设置
    额外提示:更新您的设备驱动程序
    注意:方法1和方法2都将停止计算机上的Windows自动更新

    方法1:停止并禁用Windows Update服务
    只有在Windows Update服务运行时,Windows才能检查或安装更新。 因此,如果我们停止并禁用Windows Update服务,Windows将无法检查或安装任何更新。 因此,Windows模块安装程序工作进程将不会使用大部分CPU。
    以下是停止和禁用Windows Update服务的方法:
    1)在键盘上,同时按Windows徽标键和R以调用“运行”框。
    2)键入services.msc,然后单击“确定”。

    0.服务主机进程https://blog.csdn.net/culiyuan8310/article/details/108795687?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522164001229016780366530101%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fall.%2522%257D&request_id=164001229016780366530101&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_ecpm_v1~rank_v31_ecpm-1-108795687.first_rank_v2_pc_rank_v29&utm_term=%E6%9C%8D%E5%8A%A1%E4%B8%BB%E6%9C%BA%E6%98%AF%E4%BB%80%E4%B9%88%E8%BF%9B%E7%A8%8B&spm=1018.2226.3001.4187

    1.plicationFrameHost.exe

    这个进程好像是支持Window通用应用的进程,结束该进程后,所有的windows 通用应用(就是Metro应用)都会强行结束,翻译一下应该叫 “应用程序框架主机进程”2

    2.adobe genuine software service—Adobe 正版软件服务

    Adobe正版服务(AGS)是一项定期验证您机器上的Adobe应用程序是否正版并通知您是否正版的服务。

    3.Antimalware Service Executable

    Antimalware Service Executable进程是微软杀毒软件Windows Defender的相关系统进程,是个正常的系统进程,其工作时经常会出现高CPU、高内存与高磁盘的情况。
    关闭步骤: 1、win键+R,输入“gpedit.msc”,打开“本地组策略编辑器”; 2、依次选择“计算机配置”-“管理模板”-“Windows组件”-“Windows Defender防病毒程序”; 3、找到“关闭Windows Defender防病毒程序”选项,右键“编辑“,选择“已启用”,确定即可;
    此处的建议是,如果你电脑上没有安装其它杀毒软件还是不要关闭这个进程,毕竟它是保护你电脑不受病毒侵害的

    4.bonjour service

    bonjour是什么软件:Bonjour,原名Rendezvous,是苹果电脑公司在其开发的操作系统Mac OS X10.2版本之后引入的服务器搜索协议所使用的一个商标名。这是官方的说法,那么这个程序为什么会突然出现,那是因为你在电脑上安装了苹果手机相关的软件如iTunes这款软件,iTunes安装时就会自动将bonjour给安装到我们的电脑里去了。bonjour可以卸载吗:如果你有需要用到iTunes,即使用电脑和你的苹果手机相连接的话,就不要删除,如果你不想使用电脑和苹果手机相连接的话,那么你就可以删除该软件。

    5.COM Surrogate

    COM Surrogate是一个基本的Windows 10进程,负责显示 缩略图和类似信息。

    6.ctf加载程序

    ctf加载程序是微软输入法和语言栏相关的进程,可以禁止开机自启,在需要使用时可以自动启动。
    如果想要禁用开机自启可以按照以下方法:1、首先打开“运行”对话框,可以通过开始菜单右键打开运行,也可以按下快捷键WIN+R打开“运行”。输入“msconfig”,回车。2、打开的系统配置对话框中,点击“启动”。这里是配置开机启动项和开机启动程序的功能所在。点击“打开任务管理器”。3、在任务管理器中。。。。

    7.flash helper service

    FlashHelperService.exe是Flash Player的进程,flash helper service是可以卸载。Adobe Flash Player高级客户端运行时使用的播放器,它短小精悍,能够在各种浏览器、操作系统和移动设备上使用,功能强大,兼容性高。超过13亿台的连接 Internet 的桌面计算机和移动设备上都安装了 Adobe Flash Player 。使公司和个人能够构建并带给最终用户美妙的数字体验。使您能够在将交互式、丰富内容与视频、图形和动画组合到一起的 Web 上享受最富表现力的、引人入胜的体验。
    扩展资料:
    漏洞问题:2015年1月26日消息,据国外媒体报道,Adobe周六发布了Flash的新版本,该版本的最重要目的是提供漏洞补丁。Flash长期以来存在一个未公开的漏洞,允许远程攻击者获取Mac或PC的控制权。Adobe催促用户立即进行升级,以防止黑客利用这一漏洞进行攻击。Adobe定义该漏洞为“危急类”,意思是“如果利用漏洞在本地执行恶意代码,用户完全无法知晓。” Adobe还表示“利用该漏洞可以积极地通过偷渡式下载攻击Windows 8.1及其运行的Internet Explorer和Firefox浏览器。”解决办法:用户可以通过进入Adobe公司的官方网站或在浏览器中右击Flash内容,选择“关于Adobe(或Macromedia)Flash播放器”检查Flash的安装版本。然后,启用自动更新或手动更新Flash版本

    在这里插入图片描述

    8.device association framework provider host-----设备关联框架提供程序主机

    这个不用删因为你电脑的硬件驱动存在有不协调的问题才出现这个程序导致CPU占用极高只需要更新一下所有驱动之后重启电脑就不会再出现这个程序了~可以用驱动精灵下载对应的最新稳定版驱动

    9.guard.exe

    放心!不是病毒,guard.exe是ewido的守护进程,是保护ewido.exe这个进程不被恶意软件关闭用的!关了它就等于关了ewido的守护。
    关闭方法:右键我的电脑-管理-服务和应用程序-服务-AVGAnti-SpywareGuard。把它的启动类型改为手动就行
    guard.exe是ewido的守护进程,是保护ewido.exe这个进程不被恶意软件关闭的,关了它就等于关了ewido的守护
      进程文件: guard.exe
      进程名称: Guard
      英文描述: guard.exe is a process belonging to Phoenix Technologies and is part of Core Managed Environment (cME) Integration and Certification program. This process should not be removed to ensure that your system is secure.
      进程分析:
      EwidoSecuritySuite(网络安全防护软件)或是联想拯救者(硬盘备份软件)的相关进程。
      进程位置: unknown
      程序用途: unknown
      作者: Phoenix Technologies
      属于: Core Managed Environment (cME) Integration and Certification program
      安全等级 (0-5): 0 (N/A无危险 5最危险)
      间谍软件: 否
      广告软件: 否
      病毒: 否
      木马: 否
      系统进程: 否
      应用程序: 是

    10.hd audio background process高清音频背景处理

    11.svchost.exe—同一个进程有好几个

    是svchost.exe吗?是系统进程,不是木马…
    给你一个介绍
    svchost.exe是nt核心系统的非常重要的进程,对于2000、xp来说,不可或缺。很多病毒、木马也会调用它。所以,深入了解这个程序,是玩电脑的必修课之一。

    大家对windows操作系统一定不陌生,但你是否注意到系统中“svchost.exe”这个文件呢?细心的朋友会发现windows中存在多个 “svchost”进程(通过“ctrl+alt+del”键打开任务管理器,这里的“进程”标签中就可看到了),为什么会这样呢?下面就来揭开它神秘的面纱。

    发现

    在基于nt内核的windows操作系统家族中,不同版本的windows系统,存在不同数量的“svchost”进程,用户使用“任务管理器”可查看其进程数目。一般来说,win2000有两个svchost进程,winxp中则有四个或四个以上的svchost进程(以后看到系统中有多个这种进程,千万别立即判定系统有病毒了哟),而win2003 server中则更多。这些svchost进程提供很多系统服务,如:rpcss服务(remote procedure call)、dmserver服务(logical disk manager)、dhcp服务(dhcp client)等。

    如果要了解每个svchost进程到底提供了多少系统服务,可以在win2000的命令提示符窗口中输入“tlist -s”命令来查看,该命令是win2000 support tools提供的。在winxp则使用“tasklist /svc”命令。

    svchost中可以包含多个服务

    深入

    windows系统进程分为独立进程和共享进程两种,“svchost.exe”文件存在于“%systemroot% system32”目录下,它属于共享进程。随着windows系统服务不断增多,为了节省系统资源,微软把很多服务做成共享方式,交由 svchost.exe进程来启动。但svchost进程只作为服务宿主,并不能实现任何服务功能,即它只能提供条件让其他服务在这里被启动,而它自己却不能给用户提供任何服务。那这些服务是如何实现的呢?

    原来这些系统服务是以动态链接库(dll)形式实现的,它们把可执行程序指向 svchost,由svchost调用相应服务的动态链接库来启动服务。那svchost又怎么知道某个系统服务该调用哪个动态链接库呢?这是通过系统服务在注册表中设置的参数来实现。下面就以rpcss(remote procedure call)服务为例,进行讲解。

    从启动参数中可见服务是靠svchost来启动的。

    实例

    以windows xp为例,点击“开始”/“运行”,输入“services.msc”命令,弹出服务对话框,然后打开“remote procedure call”属性对话框,可以看到rpcss服务的可执行文件的路径为“c:\windows\system32\svchost -k rpcss”,这说明rpcss服务是依靠svchost调用“rpcss”参数来实现的,而参数的内容则是存放在系统注册表中的。

    在运行对话框中输入“regedit.exe”后回车,打开注册表编辑器,找到[hkey_local_machine systemcurrentcontrolsetservicesrpcss]项,找到类型为“reg_expand_sz”的键“magepath”,其键值为“%systemroot%system32svchost -k rpcss”(这就是在服务窗口中看到的服务启动命令),另外在“parameters”子项中有个名为“servicedll”的键,其值为“% systemroot%system32rpcss.dll”,其中“rpcss.dll”就是rpcss服务要使用的动态链接库文件。这样 svchost进程通过读取“rpcss”服务注册表信息,就能启动该服务了。

    解惑

    因为svchost进程启动各种服务,所以病毒、木马也想尽办法来利用它,企图利用它的特性来迷惑用户,达到感染、入侵、破坏的目的(如冲击波变种病毒“w32.welchia.worm”)。但windows系统存在多个svchost进程是很正常的,在受感染的机器中到底哪个是病毒进程呢?这里仅举一例来说明。

    假设windows xp系统被“w32.welchia.worm”感染了。正常的svchost文件存在于“c:\windows\system32”目录下,如果发现该文件出现在其他目录下就要小心了。“w32.welchia.worm”病毒存在于“c:\windows\system32wins”目录中,因此使用进程管理器查看svchost进程的执行文件路径就很容易发现系统是否感染了病毒。windows系统自带的任务管理器不能够查看进程的路径,可以使用第三方进程管理软件,如“windows优化大师”进程管理器,通过这些工具就可很容易地查看到所有的svchost进程的执行文件路径,一旦发现其执行路径为不平常的位置就应该马上进行检测和处理。

    由于篇幅的关系,不能对svchost全部功能进行详细介绍,这是一个windows中的一个特殊进程,有兴趣的可参考有关技术资料进一步去了解它。

    windows核心进程

    最基本的系统进程(也就是说,这些进程是系统运行的基本条件,有了这些进程,系统就能正常运行):
    smss.exe Session Manager
    csrss.exe 子系统服务器进程
    winlogon.exe 管理用户登录
    services.exe 包含很多系统服务
    lsass.exe 管理 IP 安全策略以及启动 ISAKMP/Oakley (IKE) 和 IP 安全驱动程序。(系统服务)
    产生会话密钥以及授予用于交互式客户/服务器验证的服务凭据(ticket)。(系统服务)
    svchost.exe 包含很多系统服务
    SPOOLSV.EXE 将文件加载到内存中以便迟后打印。(系统服务)
    explorer.exe 资源管理器
    internat.exe 托盘区的拼音图标

    附加的系统进程(附加的服务都对安全有害,如果不是必要的应该关掉)(这些进程不是必要的,你可以根据需要通过服务管理器来增加或减少): 
    

    mstask.exe 允许程序在指定时间运行。(系统服务)
    regsvc.exe 允许远程注册表操作。(系统服务)
    winmgmt.exe 提供系统管理信息(系统服务)。
    inetinfo.exe 通过 Internet 信息服务的管理单元提供 FTP 连接和管理。(系统服务)
    tlntsvr.exe 允许远程用户登录到系统并且使用命令行运行控制台程序。(系统服务) 允许通过 Internet 信息服务的管理单元管理 Web 和 FTP 服务。(系统服务)
    tftpd.exe 实现 TFTP Internet 标准。该标准不要求用户名和密码。远程安装服务的一。
    (系统服务)
    termsrv.exe 提供多会话环境允许客户端设备访问虚拟的 Windows 2000 Professional 桌面会话
    以及运行在服务器上的基于 Windows 的程序。(系统服务)
    dns.exe 应答对域名系统(DNS)名称的查询和更新请求。(系统服务)

    以下服务很少会用到
    tcpsvcs.exe 提供在 PXE 可远程启动客户计算机上远程安装 Windows 2000 Professional 的能力。(系统服务) 支持以下 TCP/IP 服务:Character Generator, Daytime, Discard, Echo, 以及 Quote of the Day。(系统服务)
    ismserv.exe 允许在 Windows Advanced Server 站点间发送和接收消息。(系统服务)
    ups.exe 管理连接到计算机的不间断电源(UPS)。(系统服务)
    wins.exe 为注册和解析 NetBIOS 型名称的 TCP/IP 客户提供 NetBIOS 名称服务。(系统服务)
    llssrv.exe License Logging Service(system service)
    ntfrs.exe 在多个服务器间维护文件目录内容的文件同步。(系统服务)
    RsSub.exe 控制用来远程储存数据的媒体。(系统服务)
    locator.exe 管理 RPC 名称服务数据库。(系统服务)
    lserver.exe 注册客户端许可证。(系统服务)
    dfssvc.exe 管理分布于局域网或广域网的逻辑卷。(系统服务)
    clipsrv.exe 支持“剪贴簿查看器”,以便可以从远程剪贴簿查阅剪贴页面。(系统服务)
    msdtc.exe 并列事务,是分布于两个以上的数据库,消息队列,文件系统,或其它事务保护资源管理器。(系统服务)
    faxsvc.exe 帮助您发送和接收传真。(系统服务)
    cisvc.exe Indexing Service(system service)
    dmadmin.exe 磁盘管理请求的系统管理服务。(系统服务)
    mnmsrvc.exe 允许有权限的用户使用 NetMeeting 远程访问 Windows 桌面。(系统服务)
    netdde.exe 提供动态数据交换 (DDE) 的网络传输和安全特性。(系统服务)
    smlogsvc.exe 配置性能日志和警报。(系统服务)
    rsvp.exe 为依赖质量服务(QoS)的程序和控制应用程序提供网络信号和本地通信控制安装功能。(系统服务)
    RsEng.exe 协调用来储存不常用数据的服务和管理工具。(系统服务)
    RsFsa.exe 管理远程储存的文件的操作。(系统服务)
    grovel.exe 扫描零备份存储(SIS)卷上的重复文件,并且将重复文件指向一个数据存储点,以节省磁盘空间。(系统服务)
    SCardSvr.exe 对插入在计算机智能卡阅读器中的智能卡进行管理和访问控制。(系统服务)
    snmp.exe 包含代理程序可以监视网络设备的活动并且向网络控制台工作站汇报。(系统服务)
    snmptrap.exe 接收由本地或远程 SNMP 代理程序产生的陷阱消息,然后将消息传递到运行在这台计算机上 SNMP 管理程序
    。(系统服务)
    UtilMan.exe 从一个窗口中启动和配置辅助工具。(系统服务)
    msiexec.exe 依据 .MSI 文件中包含的命令来安装、修复以及删除软件。(系统服务)

    详细说明:
    win2k运行进程
    Svchost.exe
    Svchost.exe文件对那些从动态连接库中运行的服务来说是一个普通的主机进程名。Svhost.exe文件定位在系统的%systemroot%\system32文件夹下。在启动的时候,Svchost.exe检查注册表中的位置来构建需要加载的服务列表。这就会使多个Svchost.exe在同一时间运行。每个Svchost.exe的回话期间都包含一组服务,以至于单独的服务必须依靠Svchost.exe怎样和在那里启动。这样就更加容易控制和查找错误。
    Svchost.exe 组是用下面的注册表值来识别。

    HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Svchost
    每个在这个键下的值代表一个独立的Svchost组,并且当你正在看活动的进程时,它显示作为一个单独的例子。每个键值都是REG_MULTI_SZ类型的值而且包括运行在Svchost组内的服务。每个Svchost组都包含一个或多个从注册表值中选取的服务名,这个服务的参数值包含了一个ServiceDLL 值。
    HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Service

    explorer.exe
    这是一个用户的shell(我实在是不知道怎么翻译shell),在我们看起来就像任务条,桌面等等。这个进程并不是像你想象的那样是作为一个重要的进程运行在windows中,你可以从任务管理器中停掉它,或者重新启动。通常不会对系统产生什么负面影响。

    internat.exe

    这个进程是可以从任务管理器中关掉的。
    internat.exe在启动的时候开始运行。它加载由用户指定的不同的输入点。输入点是从注册表的这个位置
    HKEY_USERS.DEFAULT\Keyboard Layout\Preload 加载内容的。internat.exe 加载“EN”图标进入系统的图标区,允许使用者可以很容易的转换不同的输入点。当进程停掉的时候,图标就会消失,但是输入点仍然可以通过控制面板来改变。

    lsass.exe
    这个进程是不可以从任务管理器中关掉的。
    这是一个本地的安全授权服务,并且它会为使用winlogon服务的授权用户生成一个进程。这个进程是通过使用授权的包,例如默认的msgina.dll来执行的。如果授权是成功的,lsass就会产生用户的进入令牌,令牌别使用启动初始的shell。其他的由用户初始化的进程会继承这个令牌的。

    mstask.exe
    这个进程是不可以从任务管理器中关掉的。这是一个任务调度服务,负责用户事先决定在某一时间运行的任务的运行。

    smss.exe
    这个进程是不可以从任务管理器中关掉的。这是一个会话管理子系统,负责启动用户会话。这个进程是通过系统进程初始化的并且对许多活动,包括已经正在运行的Winlogon,Win32(Csrss.exe)线程和设定的系统变量作出反映。在它启动这些进程后,它等待Winlogon或者Csrss结束。如果这些过程时正常的,系统就关掉了。如果发生了什么不可预料的事情,smss.exe就会让系统停止响应(就是挂起)。

    spoolsv.exe
    这个进程是不可以从任务管理器中关掉的。 缓冲(spooler)服务是管理缓冲池中的打印和传真作业。

    service.exe
    这个进程是不可以从任务管理器中关掉的。大多数的系统核心模式进程是作为系统进程在运行。

    System Idle Process
    这个进程是不可以从任务管理器中关掉的。这个进程是作为单线程运行在每个处理器上,并在系统不处理其他线程的时候分派处理器的时间。

    winlogon.exe
    这个进程是管理用户登录和推出的。而且winlogon在用户按下CTRL+ALT+DEL时就激活了,显示安全对话框。

    winmgmt.exe
    winmgmt是win2000客户端管理的核心组件。当客户端应用程序连接或当管理程序需要他本身的服务时这个进程初始化

    taskmagr.exe
    这个进程就是任务管理器

    最基本的系统进程

    (也就是说,这些进程是系统运行的基本条件,有了这些进程,系统就能正常运行):
    smss.exe Session Manager
    csrss.exe 子系统服务器进程
    winlogon.exe 管理用户登录
    services.exe 包含很多系统服务
    lsass.exe 管理 IP 安全策略以及启动 ISAKMP/Oakley (IKE) 和 IP 安全驱动程序。(系统服务)
    产生会话密钥以及授予用于交互式客户/服务器验证的服务凭据(ticket)。(系统服务)
    svchost.exe 包含很多系统服务
    SPOOLSV.EXE 将文件加载到内存中以便迟后打印。(系统服务)
    explorer.exe 资源管理器
    internat.exe 托盘区的拼音图标

    附加的系统进程(这些进程不是必要的,你可以根据需要通过服务管理器来增加或减少):
    mstask.exe 允许程序在指定时间运行。(系统服务)
    regsvc.exe 允许远程注册表操作。(系统服务)
    winmgmt.exe 提供系统管理信息(系统服务)。
    inetinfo.exe 通过 Internet 信息服务的管理单元提供 FTP 连接和管理。(系统服务)
    tlntsvr.exe 允许远程用户登录到系统并且使用命令行运行控制台程序。(系统服务)
    允许通过 Internet 信息服务的管理单元管理 Web 和 FTP 服务。(系统服务)
    tftpd.exe 实现 TFTP Internet 标准。该标准不要求用户名和密码。远程安装服务的一部分。(系统服务)
    termsrv.exe 提供多会话环境允许客户端设备访问虚拟的 Windows 2000 Professional 桌面会话以及运行在服务器上的基
    于 Windows 的程序。(系统服务)
    dns.exe 应答对域名系统(DNS)名称的查询和更新请求。(系统服务)
    以下服务很少会用到,上面的服务都对安全有害,如果不是必要的应该关掉
    tcpsvcs.exe 提供在 PXE 可远程启动客户计算机上远程安装 Windows 2000 Professional 的能力。(系统服务)
    支持以下 TCP/IP 服务:Character Generator, Daytime, Discard, Echo, 以及 Quote of the Day。(系统服务)
    ismserv.exe 允许在 Windows Advanced Server 站点间发送和接收消息。(系统服务)
    ups.exe 管理连接到计算机的不间断电源(UPS)。(系统服务)
    wins.exe 为注册和解析 NetBIOS 型名称的 TCP/IP 客户提供 NetBIOS 名称服务。(系统服务)
    llssrv.exe License Logging Service(system service)
    ntfrs.exe 在多个服务器间维护文件目录内容的文件同步。(系统服务)
    RsSub.exe 控制用来远程储存数据的媒体。(系统服务)
    locator.exe 管理 RPC 名称服务数据库。(系统服务)
    lserver.exe 注册客户端许可证。(系统服务)
    dfssvc.exe 管理分布于局域网或广域网的逻辑卷。(系统服务)
    clipsrv.exe 支持“剪贴簿查看器”,以便可以从远程剪贴簿查阅剪贴页面。(系统服务)
    msdtc.exe 并列事务,是分布于两个以上的数据库,消息队列,文件系统,或其它事务保护资源管理器。(系统服务)
    faxsvc.exe 帮助您发送和接收传真。(系统服务)
    cisvc.exe Indexing Service(system service)
    dmadmin.exe 磁盘管理请求的系统管理服务。(系统服务)
    mnmsrvc.exe 允许有权限的用户使用 NetMeeting 远程访问 Windows 桌面。(系统服务)
    netdde.exe 提供动态数据交换 (DDE) 的网络传输和安全特性。(系统服务)
    smlogsvc.exe 配置性能日志和警报。(系统服务)
    rsvp.exe 为依赖质量服务(QoS)的程序和控制应用程序提供网络信号和本地通信控制安装功能。(系统服务)
    RsEng.exe 协调用来储存不常用数据的服务和管理工具。(系统服务)
    RsFsa.exe 管理远程储存的文件的操作。(系统服务)
    grovel.exe 扫描零备份存储(SIS)卷上的重复文件,并且将重复文件指向一个数据存储点,以节省磁盘空间。(系统服务)
    SCardSvr.exe 对插入在计算机智能卡阅读器中的智能卡进行管理和访问控制。(系统服务)
    snmp.exe 包含代理程序可以监视网络设备的活动并且向网络控制台工作站汇报。(系统服务)
    snmptrap.exe 接收由本地或远程 SNMP 代理程序产生的陷阱消息,然后将消息传递到运行在这台计算机上 SNMP 管理程序
    。(系统服务)
    UtilMan.exe 从一个窗口中启动和配置辅助工具。(系统服务)
    msiexec.exe 依据 .MSI 文件中包含的命令来安装、修复以及删除软件。(系统服务)

    详细说明:
    win2k运行进程
    Svchost.exe
    Svchost.exe文件对那些从动态连接库中运行的服务来说是一个普通的主机进程名。Svhost.exe文件定位
    在系统的%systemroot%\system32文件夹下。在启动的时候,Svchost.exe检查注册表中的位置来构建需要
    加载的服务列表。这就会使多个Svchost.exe在同一时间运行。每个Svchost.exe的回话期间都包含一组服务,
    以至于单独的服务必须依靠Svchost.exe怎样和在那里启动。这样就更加容易控制和查找错误。
    Svchost.exe 组是用下面的注册表值来识别。

    HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion\Svchost
    每个在这个键下的值代表一个独立的Svchost组,并且当你正在看活动的进程时,它显示作为一个单独的
    例子。每个键值都是REG_MULTI_SZ类型的值而且包括运行在Svchost组内的服务。每个Svchost组都包含一个
    或多个从注册表值中选取的服务名,这个服务的参数值包含了一个ServiceDLL值。
    HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Service

    explorer.exe
    这是一个用户的shell(我实在是不知道怎么翻译shell),在我们看起来就像任务条,桌面等等。这个
    进程并不是像你想象的那样是作为一个重要的进程运行在windows中,你可以从任务管理器中停掉它,或者重新启动。
    通常不会对系统产生什么负面影响。

    internat.exe

    这个进程是可以从任务管理器中关掉的。
    internat.exe在启动的时候开始运行。它加载由用户指定的不同的输入点。输入点是从注册表的这个位置
    HKEY_USERS.DEFAULT\Keyboard Layout\Preload 加载内容的。
    internat.exe 加载“EN”图标进入系统的图标区,允许使用者可以很容易的转换不同的输入点。
    当进程停掉的时候,图标就会消失,但是输入点仍然可以通过控制面板来改变。

    lsass.exe
    这个进程是不可以从任务管理器中关掉的。
    这是一个本地的安全授权服务,并且它会为使用winlogon服务的授权用户生成一个进程。这个进程是
    通过使用授权的包,例如默认的msgina.dll来执行的。如果授权是成功的,lsass就会产生用户的进入
    令牌,令牌别使用启动初始的shell。其他的由用户初始化的进程会继承这个令牌的。

    mstask.exe
    这个进程是不可以从任务管理器中关掉的。
    这是一个任务调度服务,负责用户事先决定在某一时间运行的任务的运行。

    smss.exe
    这个进程是不可以从任务管理器中关掉的。
    这是一个会话管理子系统,负责启动用户会话。这个进程是通过系统进程初始化的并且对许多活动的,
    包括已经正在运行的Winlogon,Win32(Csrss.exe)线程和设定的系统变量作出反映。在它启动这些
    进程后,它等待Winlogon或者Csrss结束。如果这些过程时正常的,系统就关掉了。如果发生了什么
    不可预料的事情,smss.exe就会让系统停止响应(就是挂起)。

    spoolsv.exe
    这个进程是不可以从任务管理器中关掉的。
    缓冲(spooler)服务是管理缓冲池中的打印和传真作业。

    service.exe
    这个进程是不可以从任务管理器中关掉的。
    大多数的系统核心模式进程是作为系统进程在运行。

    System Idle Process
    这个进程是不可以从任务管理器中关掉的。
    这个进程是作为单线程运行在每个处理器上,并在系统不处理其他线程的时候分派处理器的时间。

    winlogon.exe
    这个进程是管理用户登录和推出的。而且winlogon在用户按下CTRL+ALT+DEL时就激活了,显示安全对话框。

    winmgmt.exe
    winmgmt是win2000客户端管理的核心组件。当客户端应用程序连接或当管理程序需要他本身的服务时这个进程初始化

    taskmagr.exe
    这个进程就是任务管理器。

    在知道里找到不少制作QQ空间的代码。但每次我在新建模块无论在网址里还是评论里输入代码最后保存都没有显示相应的效果,请问具体制作步骤是怎样?

    winXP进程全接触
    Windows 2000/XP 的任务管理器是一个非常有用的工具,它能提供我们很多信息,比如
    现在系统中运行的程序(进程),但是面对那些文件可执行文件名我们可能有点茫然,
    不知道它们是做什么的,会不会有可疑进程(病毒,木马等)。本文的目的就是提供一
    些常用的Windows 2000 中的进程名,并简单说明它们的用处。
    在 WINDOWS 2000 中,系统包含以下缺省进程:
    Csrss.exe
    Explorer.exe
    Internat.exe
    Lsass.exe
    Mstask.exe
    Smss.exe
    Spoolsv.exe
    Svchost.exe
    Services.exe
    System
    System Idle Process
    Taskmgr.exe
    Winlogon.exe
    Winmgmt.exe

    下面列出更多的进程和它们的简要说明

    进程名 描述

    smss.exe Session Manager
    csrss.exe 子系统服务器进程
    winlogon.exe 管理用户登录
    services.exe 包含很多系统服务
    lsass.exe 管理 IP 安全策略以及启动 ISAKMP/Oakley (IKE) 和 IP 安
    全驱动程序。
    svchost.exe Windows 2000/XP 的文件保护系统
    SPOOLSV.EXE 将文件加载到内存中以便迟后打印。)
    explorer.exe 资源管理器
    internat.exe 托盘区的拼音图标)
    mstask.exe 允许程序在指定时间运行。
    regsvc.exe 允许远程注册表操作。(系统服务)->remoteregister
    winmgmt.exe 提供系统管理信息(系统服务)。
    inetinfo.exe msftpsvc,w3svc,iisadmn
    tlntsvr.exe tlnrsvr
    tftpd.exe 实现 TFTP Internet 标准。该标准不要求用户名和密码。
    termsrv.exe termservice
    dns.exe 应答对域名系统(DNS)名称的查询和更新请求。
    tcpsvcs.exe 提供在 PXE 可远程启动客户计算机上远程安装 Windows
    2000 Professional 的能力。
    ismserv.exe 允许在 Windows Advanced Server 站点间发送和接收消息。
    ups.exe 管理连接到计算机的不间断电源(UPS)。
    wins.exe 为注册和解析 NetBIOS 型名称的 TCP/IP 客户提供 NetBIOS
    名称服务。
    llssrv.exe 证书记录服务
    ntfrs.exe 在多个服务器间维护文件目录内容的文件同步。
    RsSub.exe 控制用来远程储存数据的媒体。
    locator.exe 管理 RPC 名称服务数据库。
    lserver.exe 注册客户端许可证。
    dfssvc.exe 管理分布于局域网或广域网的逻辑卷。
    clipsrv.exe 支持“剪贴簿查看器”,以便可以从远程剪贴簿查阅剪贴页
    面。
    msdtc.exe 并列事务,是分布于两个以上的数据库,消息队列,文件系统
    或其它事务保护护资源管理器。
    faxsvc.exe 帮助您发送和接收传真。
    cisvc.exe 索引服务
    dmadmin.exe 磁盘管理请求的系统管理服务。
    mnmsrvc.exe 允许有权限的用户使用 NetMeeting 远程访问 Windows 桌
    面。
    netdde.exe 提供动态数据交换 (DDE) 的网络传输和安全特性。
    smlogsvc.exe 配置性能日志和警报。
    rsvp.exe 为依赖质量服务(QoS)的程序和控制应用程序提供网络信号和
    本地通信控制安装功功能。
    RsEng.exe 协调用来储存不常用数据的服务和管理工具。
    RsFsa.exe 管理远程储存的文件的操作。
    grovel.exe 扫描零备份存储(SIS)卷上的重复文件,并且将重复文件指向
    一个数据存储点,以节省磁盘空间(只对 NTFS 文件系统有用)。
    SCardSvr.ex 对插入在计算机智能卡阅读器中的智能卡进行管理和访问控
    制。
    snmp.exe 包含代理程序可以监视网络设备的活动并且向网络控制台工作
    站汇报。
    snmptrap.exe 接收由本地或远程 SNMP 代理程序产生的陷阱(trap)消息,
    然后将消息传递到运行在这台计算机上 SNMP 管理程序。
    UtilMan.exe 从一个窗口中启动和配置辅助工具。
    msiexec.exe 依据 .MSI 文件中包含的命令来安装、修复以及删除软件。

    另外,有很多朋友都有这样的疑问:我的开机进程里有smss.exe和csrss.exe两个文件,
    有什么作用?

    进程文件: smss or smss.exe
    进程名称: Session Manager Subsystem
    描述: 该进程为会话管理子系统用以初始化系统变量,MS-DOS驱动名称类似LPT1以及
    COM,调用Win32壳子系统和运行在Windows登陆过程。
    常见错误: N/A
    是否为系统进程: 是

    进程文件: csrss or csrss.exe
    进程名称: Client/Server Runtime Server Subsystem
    描述: 客户端服务子系统,用以控制Windows图形相关子系统。
    常见错误: N/A
    是否为系统进程: 是

    所以,对自己不熟悉 没有把握的进程, 不要随便结束它.建议:把你认为有问题的进程比
    如"csrss.exe",在google里搜索"csrss.exe",就会获得相关的知识.

    展开全文
  • node-windows, Windows 对 node.js 脚本( 守护进程事件日志UAC等)的支持 更新 (2/11/17)Gitter自 2015年以来一直在解决的许多问题都已经得到解决,包括. NET 4 + 支持。这项目和它的姐妹项目( 节点 mac & 节点 ...
  • 使用NSSM配置守护进程 Nginx(Windows

    千次阅读 2021-12-10 21:53:25
    使用NSSM配置守护进程

    使用说明/配置步骤

    1. 下载nssmnssm
    2. 根据自己电脑的平台架构,将压缩包下32/64位nssm.exe文件解压至任意文件夹。

      3.将Win64打开,这个根据个人电脑情况而定

    1. 在nssm.exe所在目录下shift+右键,选择在此处打开powershell或命令窗口,或者直接用上述工具定位至nssm.exe所在目录(也可以配置成环境变量)
    2. 输入 nssm install nginx,nginx 即注册服务的名称,此处为自定义 即nssm install {服务名}
    3. 配置如下参数
      Path为应用程序文件,即需要配置成服务程序的地址
      Startup directory为启动文件夹,该选项只要选择Path后即自动配置
      Arguments为启动参数,如果是一般应用在参数那边填写.exe 启动参数
    4. 配置完成后,点击Install service,即可完成配置
    5. 创建后使用nssm start frps启动服务即可
    6. 这里注意nginx守护不同于dotnetcore的exe 启动参数这里不能直接填写 nginx.exe ,否则会报错启动不了 ,我暂时置空 

     

    7. 在窗口输入启动命令 nssm start nginx 就可以启动服务了 或者手动在任务管理器-》服务点击手动启动

    8.启动后会出现正在运行 

     

    9.如果要部署DotnetCore 的程序则如下配置

     

     

    其他命令

    • 启动服务:nssm start <servicename>
    • 停止服务: nssm stop <servicename>
    • 重启服务: nssm restart <servicename>
    • 编辑服务参数: nssm edit <servicename>
    • 删除服务:nssm remove <servicename>
    展开全文
  • Windows守护进程的一种简单实现

    千次阅读 2016-11-24 01:23:49
    一讲到守护进程,很多人都想到了Linux系统,确实在Windows上这说的比较少。今天上午群里有朋友问我了下Windows守护进程的实现问题,我想了想,简单用C++写了小例子,用来实现系统开机自启动(注册表启动),...
  • 所以要在本地进行python项目启动,而flask启动一直打开cmd启动很不稳定,会直接断掉,网上找了很,一般都是基于web服务器启动,但是配置太过麻烦,一版本错误就导致配置不成功,所以想到将加入到windows系统中启动 ...
  • 1.什么是守护进程 守护进程是脱离于终端并且在后台运行的进程守护进程脱离于终端是为了避免进程在执行过程中的信息在任何终端上显示并且进程也不会被任何终端所产生的终端信息所打断。 例如 apache, nginx, mysql ...
  • Linux守护进程是Linux的后台服务进程,相当于Windows服务,对于为Linux开发服务程序的朋友来说,Linux守护进程相关技术是必不可少的,因为这技术不仅仅是为了开发守护进程,还可以拓展到多进程,父子进程文件描述...
  • Windows下实现代码: BOOL IsExistProcess(const char* szProcessName) { QDateTime startTime = QDateTime::currentDateTime(); PROCESSENTRY32 processEntry32; HANDLE toolHelp32Snapshot = CreateToolhelp32...
  • C++实现双进程守护

    千次阅读 2019-05-13 21:09:50
    #include"pch.h" #include<iostream>...//创建互斥体对象,守护程序利用OpenMutex()函数检测对方的互斥体对象是否存在,不存在则创建进程 //线程回调函数 //参数:程序名称 DWORDWINAPIThr...
  • windows下bat批处理实现守护多个进程

    千次阅读 2016-11-07 15:37:49
    同时守护多进程 @echo off set task_one = task_one .exe set task_two = task_two.exe set svr_one = 绝对路径\task_one .exe set svr_two = 绝对路径\task_two.exe set des=start.bat  :checkstart set ...
  • 大多数的解决方法是使用其他进程守护服务器程序,如果服务器程序挂了,通过守护进程来启动服务器程序。 万一守护进程挂了呢?使用双守护来提高稳定性,守护A负责监控服务器程序与守护B,守护B负责监控守护A,任何...
  • 在window下实现thinkphp的进程守护
  • 全局安装pm2 ...日志的配置, 访问日志和异常日志,日志的时间前缀格式,是否合并日志,如果开启两个进程,不合并日志就会生成两份访问日志和异常日志,分为两个进程的日志。 { "apps": { "...
  • windows下用c++编写守护进程

    千次阅读 2016-11-24 01:21:51
    写一个C++程序,监控另一个进程,发现该进程关掉了就自动把它重启  #include #include #include #include using namespace std;  int _tmain(int argc, TCHAR *argv[])  {  STARTUPINFO si;  ...
  • 个进程一直运行,直到所有的非守护线程都结束运行后才能结束。 线程  又称其为轻量级进程(Light Weight Process)。是操作系统能够进行运算调度的最小单位。大部分情况下,它被包含在进程之中,是进程中的实际...
  • daemon进程又被称为守护进程,一般来说它有以下两特点: 生命周期很长 一旦启动,正常情况下不会终止,一直运行到系统退出。但凡事无绝对:daemon进程其实也是可以停止的,如很daemon提供了stop命令,执行stop...
  • windows下,可以用简单的bat实现守护进程的功能,如果dump掉就重新拉起来,百度下就能查到,举例子: @echo off ::检测时间间隔,单位:秒 set _interval=5 ::需要守护进程名称 set _processName=print_...
  • 但其有一极大的缺陷,即几乎没有Init操作,不会启动后台守护进程(至少到文章编写时)。而有时编写软件时又需要用到一些后台进程,如Rsyslog,虽然可以通过手动执行/etc/init.d下的脚本来启动守护进程,但仍然不...
  • Linux之普通进程 后台进程 守护进程

    千次阅读 2018-04-28 17:56:55
    对于那些没有交互的进程,很时候,我们希望将其在后台启动,可以在启动参数的时候加一'&amp;'实现这目的:zsm@wilburUbun:~/application/zookeeper-3.4.8/bin$ ./zkServer.sh start &amp; [1] 21304 ...
  • window平台使用bat批处理实现进程守护需要用到如下一些知识: 一、批处理实现延时一段时间 Windows下批处理文件没有像Linux一样的Sleep函数进行延时处理,这里有2种较为实用的方法实现延迟: 1、使用WScirpt的sleep...
  • python多进程多线程,多个程序同时运行

    万次阅读 多人点赞 2021-04-08 13:47:15
    python 多线程 多进程同时运行 ...多任务: 同一时间执行多个任务, 比如windows操作系统 执行方式有两种( 表现形式 ) 并发 在单核cpu中: 在一段时间内交替执行多个任务, 例如单核cpu 处理多任务, 操作系统让各个任务交
  • windows 服务与linux 守护进程

    千次阅读 2013-09-25 18:13:21
    我们将研究如何创建一作为Windows服务的应用程序。内容包含什么是Windows服务,如何创建、安装和调试它们。会用到System.ServiceProcess.ServiceBase命名空间的类。 什么是Windows服务?  Windows服务应用程序是...
  • 使用 Python 的简单远程系统控制守护进程。 适用于 Windows/Linux/Mac。 ###Description 这是一简单的远程控制守护进程。 您可以在服务器中发送命令,所有订阅同一主题的客户端都会立即运行该命令,然后将...
  • Windows进程详解(完整版)

    千次阅读 2019-03-27 15:47:17
    Windows进程详解(完整版)
  • 最近项目需要:程序关闭后自动重新启动,需要一监测程序...3.(右键)添加引用(这dll是为显示界面的,很多人说windows服务开启了,程序也在运行就是不显示界面那就需要这了) 下载地址: 链接:https://pan...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 47,132
精华内容 18,852
关键字:

windows 多个进程守护