进程,进程对象
虚拟内存
进程不能执行代码,数据结构,三环PEB,0怀EPROCESS对进程进行管理
线程列表
线程才是真正执行代码
主线程:主函数
线程依赖于cpu时间片切换
单核,多核
主线程消息,进程销毁
int main()
{
//该结构体指定创建进程时的主窗口的窗口工作站,桌面,标准句柄和外观
STARTUPINFO StartupInfo = { sizeof(STARTUPINFO) };
//该结构体包含有关新创建的进程及其主线程的信息
PROCESS_INFORMATION ProcessInformation;
//创建进程
BOOL bRet = CreateProcess(L"F:\\ChinaNet-EDU.exe", //文件路径
NULL, //命令行参数
NULL, //进程安全属性
NULL, //主线程安全属性
FALSE, //进程句柄是否可继承
NULL, //控制优先级类和进程的创建标志
NULL, //指向新进程的环境块的指针
NULL, //进程当前目录的完整路径
&StartupInfo, //指向STARTUPINFO或STARTUPINFOA的指针
&ProcessInformation //指向PROCESS_INFORMATION结构的指针
);
if (!bRet) {
std::cout << "CreateProcess Failed!" << std::endl;
}
else {
std::cout << "进程句柄:" << ProcessInformation.hProcess << std::endl;
std::cout << "线程句柄:" << ProcessInformation.hThread << std::endl;
std::cout << "进程ID:" << ProcessInformation.dwProcessId << std::endl;
std::cout << "主线程ID:" << ProcessInformation.dwThreadId << std::endl;
}
//关闭进程(只能关闭没有保护的进程)
//TerminateProcess(ProcessInformation.hProcess, 0);
//关闭线程
TerminateThread(ProcessInformation.hThread, 0);
//结束自己的进程:
ExitProcess(0);
system("pause");
return 0;
}
上面介绍的关闭进程/线程都是通过自己创建进程,通过返回值得到的句柄
但是如果我们想结束不是我们自己创建的进程/线程,我们该如何拿到句柄,如何关闭?
//ID:5340
HANDLE hProcesss = OpenProcess(
PROCESS_ALL_ACCESS, //权限
FALSE, //可否继承
5430 //进程ID
)
if(hProcess==INVALID_HANDLE_VALUE){
std::cout<<"OpenProcess Error Code:"<<GetLastError<<std::endl;
}
TerminateProcess(hProcess,0);
上述关闭进程,ID是在任务管理器中得到的,对于权限较低的进程,能够关掉
我们尝试关闭权限较高的进程的时候,会出错(拒绝访问了)
我们每次关闭进程,去看任务管理器实在是太2了,我们来看看如何找进程ID:
#include <TlHelp32.h>
int main(){
//创建进程快照
HANDLE hSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);
//遍历进程快照
PROCESSENTRY32 lppe = { sizeof(PROCESSENTRY32) };
//拿到第一个进程信息
BOOL bRet = Process32First(hSnap, &lppe);
while(bRet) {
std::cout << lppe.szExeFile << ":" << lppe.th32ProcessID << std::endl;
//字符串比较
if (strcmp(lppe.szExeFile, "ChinaNet-EDU.exe") == 0) {
//打开进程
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, lppe.th32ProcessID);
//关闭进程
BOOL Ret = TerminateProcess(hProcess, 0);
if (!Ret) {
std::cout<<"TerminateProcess "<<lppe.szExeFile<<"Failed Code :"<<std::endl;
}
}
//继续找下一个进程
bRet = Process32Next(hSnap, &lppe);
}
return 0;
}
上述都是进程相关,我们来看看线程相关:
#include <iostream>
#include <Windows.h>
#include <TlHelp32.h>
DWORD ThreadCallBack(LPVOID lpThreadParameter) {
int i = 0;
while (true)
{
std::cout << "Thread:" << i++ << std::endl;
Sleep(1000);
}
}
int main()
{
//用于接收线程ID
DWORD dwThreadID;
//创建线程
HANDLE hThread = CreateThread(
NULL, //安全属性,结构体里面有一个成员,决定线程句柄是否可以继承
NULL, //堆栈大小,如果为NULL,则分配默认大小
ThreadCallBack, //指向有线程执行的应用程序定义函数的指针
NULL, //指向由线程执行的应用程序传给线程的变量指针
NULL, //控制线程创建的标志:立即执行或挂起等状态
&dwThreadID //指向接收线程表示符的变量指针
);
int i = 0;
while (true)
{
std::cout << "Main:" << i++ << std::endl;
Sleep(1000);
}
system("pause");
return 0;
}
主线程挂掉了,子线程必挂
-
挂起线程:
SuspendThread(hThread);
-
唤醒线程:
ResumeThread( HANDLE hThread //线程句柄 );