进程相关操作
函数 | 功能 |
---|---|
CreateProcess | 创建进程 |
OpenProcess | 打开进程 |
ExitProcess | 退出本进程 |
TerminateProcess | 结束指定进程 |
WinExec | 启动一个进程 |
ShellExecute | 运行一个外部程序,或者打开一个文件目录,文件夹等等 |
system | 控制台命令 |
CreateToolhelp32Snapshot | 创建快照遍历进程、线程、模块、堆 |
打开一个进程(其实也就是获得进程句柄
函数原型
HANDLE OpenProcess(
DWORD dwDesiredAccess,
BOOL bInheritHandle,
DWORD dwProcessId
);
参数
第一个参数dwDesiredAccess表示打开的进程的权限,来描述打开这个进程的句柄获得的权限有哪些
PROCESS_ALL_ACCESS 这个宏表示获得所有的权限
第二个参数 bInheritHandle表示如果用这个句柄创建的进程是否继承该句柄,在这里我们拿来也没啥用直接用NULL就好
第三个参数表示要打开的进程的ID
void Open_Process(int pid)
{
OpenProcess(PROCESS_ALL_ACCESS, NULL, pid);
}
返回值
如果打开成功会返回对于的进程句柄,如果失败则返回NULL
关闭指定进程
函数原型
BOOL TerminateProcess(
HANDLE hProcess,
UINT uExitCode
);
参数
第一个参数表示进程句柄
第二个参数表示的是退出进程传递的代码值,这个基本上是写操作系统时的进程退出的原因才用的上,这里直接传0就好
void Close_Process(HANDLE hProcess)
{
TerminateProcess(hProcess, 0);
}
遍历进程
函数原型
HANDLE CreateToolhelp32Snapshot(
DWORD dwFlags,
DWORD th32ProcessID
);
这个函数是包括在tlhelp32.h头文件下的,需要添加使用
参数
第一个参数 dwFlags表示需要遍历什么东西。因为它可以遍历进程线程模块和堆这四种东西。
TH32CS_SNAPPROCESS 这个宏表示的是遍历系统中的所有进程
第二个参数 表示的是进程的ID,但是这个第二个参数只有在遍历线程,模块和堆的情况下需要,因为线程模块和堆都是进程里面包含的,因为这里我们是需要的是遍历进程,所以直接传0
返回值
如果函数成功,返回打开的句柄到指定的快照,如果失败则返回INVALID_HANDLE_VALUE
枚举进程
在CreateToolhelp32Snapshot函数中的第一个参数的宏中提示了枚举进程的办法,使用Process32First函数,然后在Process32First中有Process32Next函数来访问快照中的下一个进程,相当于就是说访问第一个,然后一直下一个下一个
函数原型
BOOL Process32First(
HANDLE hSnapshot,
LPPROCESSENTRY32 lppe
);
BOOL Process32Next(
HANDLE hSnapshot,
LPPROCESSENTRY32 lppe
);
参数
这两个函数的参数都一样,第一个参数是快照的句柄,第二个参数是一个结构体的指针,在windows编程下的p也就是point是指针的意思,l就是long的意思。第二个参数是一个用来描述快照中的进程信息的一个结构体的指针
LPPROCESSENTRY32
typedef struct tagPROCESSENTRY32 {
DWORD dwSize;
DWORD cntUsage;
DWORD th32ProcessID;
ULONG_PTR th32DefaultHeapID;
DWORD th32ModuleID;
DWORD cntThreads;
DWORD th32ParentProcessID;
LONG pcPriClassBase;
DWORD dwFlags;
CHAR szExeFile[MAX_PATH];
} PROCESSENTRY32;
该结构体是用来描述快照中的进程的信息的,在创建结构体的时候需要初始化dwSize,不然就创建失败,后面的参数不用管,这里就相当于创建了一个描述进程信息的结构体来获取进程信息,不用赋值因为反正后面都会被获得的进程的信息覆盖
返回值
如果成功的话会返回一个Bool类型
遍历系统进程的完整代码
void Ergodic_Process()
{
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
PROCESSENTRY32 processEntry;
processEntry.dwSize = sizeof(PROCESSENTRY32);
BOOL fSuccess = Process32First(hSnapshot, &processEntry);
if (fSuccess)
{
//表示如果成功获取到了快照中的第一个进程
do
{
printf("进程id=%d,进程名字=%ls\n", processEntry.th32ProcessID, processEntry.szExeFile);
} while (Process32Next(hSnapshot, &processEntry));
}
}
但是这个不支持中文,以下是修正版
void Ergodic_Process()
{
setlocale(LC_ALL, "chs");
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
PROCESSENTRY32 processEntry;
processEntry.dwSize = sizeof(PROCESSENTRY32);
BOOL fSuccess = Process32First(hSnapshot, &processEntry);
if (fSuccess)
{
//表示如果成功获取到了快照中的第一个进程
do
{
printf("进程id=%d,进程名字=%ls\n", processEntry.th32ProcessID, processEntry.szExeFile);
} while (Process32Next(hSnapshot, &processEntry));
}
}