用快照对进程、模块、线程进行遍历(代码段)

前置知识:windows提供了一组快照API,使用前需要包含TlHelp32.h头文件。

  1.能够给当前系统中的所有进程拍一个快照,能够获取所有进程的一些基本信息;

  2.能够给当前系统中的线程拍一个快照;

  3.能够给某一个进程拍模块快照;

  4.能够给某一个进程拍堆快照。

一:遍历进程

  

int _tmain(int argc, _TCHAR* argv[])
{
	HANDLE         hProcessSnap;   // 进程快照句柄
	HANDLE         hProcess;       // 进程句柄
	PROCESSENTRY32 stcPe32 = { 0 };  // 进程快照信息
	stcPe32.dwSize = sizeof(PROCESSENTRY32);
	
	// 1. 创建一个进程相关的快照句柄
	hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
	if (hProcessSnap == INVALID_HANDLE_VALUE)
		return false;

	// 2. 通过进程快照句柄获取第一个进程信息
	if (!Process32First(hProcessSnap, &stcPe32))
	{
		CloseHandle(hProcessSnap);
		return false;
	}
	// 3. 循环遍历进程信息
	do {
		// 3.2 获取优先级信息
		hProcess = OpenProcess(PROCESS_QUERY_INFORMATION, FALSE,
			stcPe32.th32ProcessID);
		if (hProcess)
		{
			int nPriority = GetPriorityClass(hProcess);//获取进程优先级
			
			CloseHandle(hProcess);                           //关闭句柄
		}
		// 3.3 获取进程的其他相关信息
	
		printf("进程ID:%d   ",stcPe32.th32ProcessID);
		printf("线程数:%d   ",stcPe32.cntThreads);
		printf("父进程ID:%d",stcPe32.th32ParentProcessID);
		printf("进程路径:%s",stcPe32.szExeFile);
		printf("\n");
	} while (Process32Next(hProcessSnap, &stcPe32));
	// 4. 关闭句柄退出函数
	CloseHandle(hProcessSnap);

	return 0;
}

二:遍历模块

HANDLE        hModuleSnap = INVALID_HANDLE_VALUE;
	MODULEENTRY32 me32 = { sizeof(MODULEENTRY32) };
	// 1. 创建一个模块相关的快照句柄
	hModuleSnap = CreateToolhelp32Snapshot(
		TH32CS_SNAPMODULE,  // 指定快照的类型
		dwPId);            // 指定进程
	if (hModuleSnap == INVALID_HANDLE_VALUE)
		return false;
	// 2. 通过模块快照句柄获取第一个模块信息
	if (!Module32First(hModuleSnap, &me32)) {
		CloseHandle(hModuleSnap);
		return false;
	}
	// 3. 循环获取模块信息
	do {
		//me32.th32ProcessID;
		printf("模块句柄%d  ",me32.hModule);
		printf("加载基址%d  ",me32.modBaseAddr);
		printf("模块名%s  ",me32.szExePath);
		printf("\n");
	} while (Module32Next(hModuleSnap, &me32));
	// 4. 关闭句柄并退出函数
	CloseHandle(hModuleSnap);

  

原文地址:https://www.cnblogs.com/wingss/p/5124006.html