遍历进程是Windows编程中常见的任务,通常用于监控、管理或调试系统,在Windows操作系统中,有多种API可以用来实现这一功能,以下是几种主要的遍历进程的方法:
1、CreateToolhelp32Snapshot()、Process32First()和Process32Next()
创建进程快照:使用CreateToolhelp32Snapshot
函数创建一个系统快照,该快照包含所有运行中的进程、线程、模块等信息,为了遍历进程,需要指定TH32CS_SNAPPROCESS
标志。
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if (hSnapshot == INVALID_HANDLE_VALUE) { // 处理错误 }
遍历首次进程:使用Process32First
函数获取快照中的第一个进程信息。
PROCESSENTRY32 pe32; pe32.dwSize = sizeof(PROCESSENTRY32); BOOL bRet = Process32First(hSnapshot, &pe32);
继续下次遍历:使用Process32Next
函数继续遍历快照中的下一个进程信息。
while (bRet) { // 处理进程信息 bRet = Process32Next(hSnapshot, &pe32); }
关闭句柄:遍历完成后,应通过调用CloseHandle
函数关闭快照句柄。
CloseHandle(hSnapshot);
2、EnumProcesses()、EnumProcessModules()、GetModuleBaseName()
枚举进程标识符:使用EnumProcesses
函数获取系统中所有进程的标识符。
DWORD aProcesses[1024], cbNeeded, cProcesses; if (!EnumProcesses(aProcesses, sizeof(aProcesses), &cbNeeded)) { // 处理错误 } cProcesses = cbNeeded / sizeof(DWORD);
打开进程并枚举模块:对于每个进程标识符,使用OpenProcess
函数打开进程,然后使用EnumProcessModules
函数枚举进程的模块。
for (unsigned int i = 0; i < cProcesses; i++) { if (aProcesses[i] != 0) { HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, aProcesses[i]); if (NULL != hProcess) { HMODULE hMod; DWORD cbNeeded; if (EnumProcessModules(hProcess, &hMod, sizeof(hMod), &cbNeeded)) { TCHAR szProcessName[MAX_PATH]; GetModuleBaseName(hProcess, hMod, szProcessName, sizeof(szProcessName) / sizeof(TCHAR)); _tprintf(TEXT("%s (PID: %u) "), szProcessName, aProcesses[i]); } CloseHandle(hProcess); } } }
3、Native API的ZwQuerySystemInformation
定义结构体:定义一个结构体来存储系统进程信息。
typedef struct _SYSTEM_PROCESSES { ULONG NextEntryDelta; ULONG ThreadCount; ULONG Reserved[6]; LARGE_INTEGER CreateTime; LARGE_INTEGER UserTime; LARGE_INTEGER KernelTime; UNICODE_STRING ProcessName; KPRIORITY BasePriority; ULONG ProcessId; ULONG InheritedFromProcessId; ULONG HandleCount; ULONG Reserved2[2]; VM_COUNTERS VmCounters; IO_COUNTERS IoCounters; } _SYSTEM_PROCESSES, *PSYSTEM_PROCESSES;
查询系统信息:使用ZwQuerySystemInformation
函数查询系统进程信息。
NTSTATUS status = ZwQuerySystemInformation(SystemProcessesAndThreadsInformation, // System Information class (LPVOID)&sysProcInfo, // buffer to receive data sizeof(SYSTEM_PROCESSES), // size of buffer &returnLength); // length needed
4、wtsapi32.dll的WTSOpenServer()、WTSEnumerateProcess()
打开终端服务器:使用WTSOpenServer
函数打开终端服务器,以便枚举远程会话中的进程。
WTS_SESSION_INFO* pSessionInfo = NULL; DWORD dwSessionCount = 0; WTSFreeMemory(pSessionInfo); WTSEnumerateSessions(WTS_CURRENT_SERVER_HANDLE, 0, 1, &pSessionInfo, &dwSessionCount);
枚举进程:使用WTSEnumerateProcess
函数枚举终端服务器会话中的进程。
for (int i = 0; i < dwSessionCount; i++) { WTS_PROCESS_INFO* pProcessInfo = NULL; DWORD dwProcessCount = 0; if (WTSEnumerateProcesses(WTS_CURRENT_SERVER_HANDLE, pSessionInfo[i].SessionId, 0, &pProcessInfo, &dwProcessCount)) { for (int j = 0; j < dwProcessCount; j++) { // 处理进程信息 } } WTSFreeMemory(pProcessInfo); }
方法各有优缺点,具体选择哪种方法取决于实际需求和应用场景,如果需要获取详细的进程信息,可以选择使用CreateToolhelp32Snapshot()、Process32First()和Process32Next();如果只需要简单的进程列表,可以使用EnumProcesses()。
小伙伴们,上文介绍了“api遍历进程”的内容,你了解清楚吗?希望对你有所帮助,任何问题可以给我留言,让我们下期再见吧。
原创文章,作者:K-seo,如若转载,请注明出处:https://www.kdun.cn/ask/699047.html