zoukankan      html  css  js  c++  java
  • 用快照对进程、模块、线程进行遍历(代码段)

    前置知识: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);
    

      

  • 相关阅读:
    将MySQL中的数据导入到Solr
    Solr中schema.xml的Field介绍
    Window下Nginx的安装和启动
    Idea中运行shell脚本
    window10 下安装Mysql5.6
    Solr Admin管理界面使用说明
    Solr 整合中文分词器mmseg4j
    Solr安装和使用
    ActiveMQ 安装和使用
    AbstractQueuedSynchronizer源码解析
  • 原文地址:https://www.cnblogs.com/wingss/p/5124006.html
Copyright © 2011-2022 走看看