Windows挂起进程

Window系统并没有公开提供挂起进程的API,但提供了SuspendThread,对一个程序的挂起,即对该程序所有的线程的挂起。
首先引用头文件

#include  'Windows头文件
#include  'Windows进程与线程快照需要

通过创建系统进程与线程的快照来停止对应进程的线程。

1.根据名称停止指定进程

#include 
#include 
#include 
#include 
BOOL SuspendProcessByName(WCHAR* name) {
    PROCESSENTRY32 pe32 = { sizeof(PROCESSENTRY32) }; //这是用来存放快照进程信息的一个结构体。
    //创建所有进程的快照
    HANDLE hProcessSanp = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); 
    if (hProcessSanp == INVALID_HANDLE_VALUE) //检查错误
    {
        puts("Failed To Get the Process SnapShot");
        return 0;
    }
    Process32First(hProcessSanp, &pe32); //获取第一个快照信息
    do {
        if (!wcscoll(name, pe32.szExeFile)) { //比较进程名称
        	//获取线程快照
            THREADENTRY32 th32 = { sizeof(THREADENTRY32) };
            HANDLE hThreadSanp = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, NULL);
            if (hThreadSanp == INVALID_HANDLE_VALUE) {
                puts("Failed To Get Thread SnapShot");
                continue;
            }
            //获取第一个线程快照
            Thread32First(hThreadSanp, &th32);
            do {
                if (th32.th32OwnerProcessID != pe32.th32ProcessID) continue; //当线程的所有者不是所找进程时跳过
                //获取线程句柄
                HANDLE hth = OpenThread(THREAD_SUSPEND_RESUME, FALSE, th32.th32ThreadID);
                if (hth) {
                	//用API挂起线程
                    SuspendThread(hth);
                    CloseHandle(hth);//关闭线程句柄
                }
                else {
                    puts("Failed To Open Thread");
                }
            } while (Thread32Next(hThreadSanp, &th32)); //下一个线程快照
            if (hThreadSanp) CloseHandle(hThreadSanp); //关闭线程快照
        }
    } while (Process32Next(hProcessSanp, &pe32)); //下一个进程快照
    CloseHandle(hProcessSanp); //关闭进程快照
    return 1;
}

2.根据ID挂起指定进程
原理是一样的

#include 
#include 
#include 
#include 
BOOL SuspendProcessByID(DWORD id) {
    THREADENTRY32 th32 = {sizeof(THREADENTRY32)};
    HANDLE hThreadSnap = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, NULL);
    if (hThreadSnap == INVALID_HANDLE_VALUE) {
		puts("Failed To Get Thread Snapshot");
		return 0;
	}
	Thread32First(hThreadSnap, &th32);
	do {
		if (th32.th32ProcessID != id) continue;
		HANDLE hth = OpenThread(THREAD_SUSPEND_RESUME , FALSE, th32.th32ThreadID);
		if (hth != INVALID_HANDLE_VALUE) {
			SuspendThread(hth);
			CloseHandle(hth);
		}else{
			puts("Failed To Open Thread");
		}
	} while (Thread32Next(hThreadSnap, &th32));
	return 1;
}

如果要恢复进程,则只需将上述代码中的SuspendThread改为ResumeThread即可。

你可能感兴趣的:(#,进程)