获取系统进程快照 c语言实现

简介: [cpp] view plaincopy /************************************************************************/   /* 云守护      email:542335496@qq.com                                



[cpp]  view plain copy
  1. /************************************************************************/  
  2. /* 云守护 
  3.     email:542335496@qq.com                                                                     */  
  4. /************************************************************************/  
  5. #include <stdio.h>  
  6. #include <windows.h>  
  7. #include <TLHELP32.H>  
  8. #include <ntsecapi.h>  
  9. //需升级windows sdk,静态调用  
  10. #include    "psapi.h"  
  11. #pragma comment (lib,"psapi.lib")  
  12.   
  13.   
  14. //设置字体颜色  
  15. void SetColor(unsigned short ForeColor=4,unsigned short BackGroundColor=0)  
  16. {  
  17.     HANDLE hCon = GetStdHandle(STD_OUTPUT_HANDLE);//获得缓冲区句柄  
  18.     SetConsoleTextAttribute(hCon,ForeColor|BackGroundColor);//设置文本及背景颜色,可以使用color -?查看  
  19. };  
  20. //通过系统快照获取进程  
  21. BOOL GetProcessList(){  
  22.   
  23.     HANDLE hProcessSnap;  
  24.     HANDLE hModuleSnap;  
  25.     BOOL bRet=FALSE;  
  26.     BOOL bModule=FALSE;  
  27.     PROCESSENTRY32 pe32={0};  
  28.     MODULEENTRY32 me32={0};  
  29.     pe32.dwSize=sizeof(PROCESSENTRY32);  
  30.     me32.dwSize=sizeof(MODULEENTRY32);  
  31.     hProcessSnap=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);  
  32.     bRet=Process32First(hProcessSnap,&pe32);  
  33.     while(bRet){  
  34.           
  35.         SetColor(0,2);  
  36.         printf("进程:%s\n",pe32.szExeFile);  
  37.         SetColor(0,7);  
  38.         hModuleSnap=CreateToolhelp32Snapshot(TH32CS_SNAPMODULE,0);  
  39.         bModule=Module32First(hModuleSnap,&me32);  
  40.         while(bModule){  
  41.             printf("\t模块:%s\n",me32.szExePath);  
  42.             bModule=Module32Next(hModuleSnap,&me32);  
  43.   
  44.         }  
  45.         bRet=Process32Next(hProcessSnap,&pe32);  
  46.     }  
  47.     CloseHandle(hProcessSnap);  
  48.     CloseHandle(hModuleSnap);  
  49.   
  50.     return TRUE;  
  51. }  
  52. //第二种方法 PSAPI 静态调用  
  53. BOOL GetProcessListByPSAPi(){  
  54.   
  55.     DWORD ProcessCount;  
  56.     DWORD cbNeeded;  
  57.     DWORD ProcessId[1024];  
  58.       
  59.     EnumProcesses(ProcessId,sizeof(ProcessId),&cbNeeded);  
  60.     ProcessCount = cbNeeded/sizeof(DWORD);  
  61.       
  62.     HMODULE hModule;  
  63.     char    szPath[MAX_PATH];  
  64.       
  65.     for(DWORD i = 0; i < ProcessCount; i ++)  
  66.     {  
  67.         HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ,FALSE,ProcessId[i]);  
  68.         if(hProcess)  
  69.         {  
  70.             EnumProcessModules(hProcess,&hModule,sizeof(hModule),&cbNeeded);  
  71.             GetModuleFileNameEx(hProcess,hModule,szPath,sizeof(szPath));  
  72.             SetColor(0,6);  
  73.             printf("PID:%d ",ProcessId[i]);  
  74.             SetColor(0,7);  
  75.             printf("\t%s\n",szPath);  
  76.         }  
  77.         else  
  78.             continue;  
  79.     }  
  80.     return TRUE;  
  81.   
  82. }  
  83.   
  84. //第三种方法 WTSAPI  
  85. typedef struct _WTS_PROCESS_INFO{  
  86.     DWORD SessionId;  
  87.     DWORD ProcessId;  
  88.     LPTSTR pProcessName;  
  89.     PSID pUserSid;  
  90. }WTS_PROCESS_INFO,*PWTS_PROCESS_INFO;  
  91.   
  92. typedef HANDLE (WINAPI *WTSOPENSERVER)(LPTSTR pServerName);  
  93.   
  94. typedef BOOL (WINAPI *WTSENUMRATEPROCESSES)(HANDLE hServer,DWORD Reserved,DWORD Version,PWTS_PROCESS_INFO* ppProcessInfo,DWORD *pCount);  
  95.   
  96. //动态调用,合适用于windows NT/2000终端服务  
  97. BOOL GetProcessByWTSAPI(){  
  98.   
  99.     HMODULE hWtsApi32 = LoadLibrary("wtsapi32.dll");  
  100.     if(hWtsApi32==NULL){  
  101.         printf("请升级sdk,没有找到wtsapi.dll");  
  102.         return FALSE;  
  103.     }  
  104.     WTSOPENSERVER pWtsOpenServer = (WTSOPENSERVER)GetProcAddress(hWtsApi32,"WTSOpenSeverA");  
  105.     WTSENUMRATEPROCESSES pWtsEnumrateProcesses = (WTSENUMRATEPROCESSES)GetProcAddress(hWtsApi32,"WTSEnumrateProcessesA");  
  106.     //终端服务名字,可以使用nbtstat -an 命令查看  
  107.     char *szServerName = " 1FB978629C104D4";  
  108.     HANDLE hWtsServer = pWtsOpenServer(szServerName);  
  109.       
  110.     PWTS_PROCESS_INFO pWtsapi;  
  111.     DWORD dwCount;  
  112.       
  113.     if(!pWtsEnumrateProcesses(hWtsServer,0,1,&pWtsapi,&dwCount))  
  114.         return FALSE;  
  115.       
  116.     for(DWORD i = 0; i < dwCount; i ++)  
  117.     {  
  118.         printf("ProcessID: %d (%s)\n",pWtsapi[i].ProcessId,pWtsapi[i].pProcessName);  
  119.     }  
  120.   
  121.     return TRUE;  
  122. }  
  123. //第四种方法  
  124. #define SystemProcessesAndThreadsInformation    5  
  125. // 动态调用  
  126. typedef DWORD (WINAPI *ZWQUERYSYSTEMINFORMATION) (DWORD,  
  127.                                                   PVOID,  
  128.                                                   DWORD,  
  129.                                                   PDWORD);  
  130. // 结构定义  
  131. typedef struct _SYSTEM_PROCESS_INFORMATION{  
  132.     DWORD       NextEntryDelta;  
  133.     DWORD       ThreadCount;  
  134.     DWORD       Reserved1[6];  
  135.     FILETIME    ftCreateTime;  
  136.     FILETIME    ftUserTime;  
  137.     FILETIME    ftKernelTime;  
  138.     UNICODE_STRING ProcessName;  
  139.     DWORD       BasePriority;  
  140.     DWORD       ProcessId;  
  141.     DWORD       InheritedFromProcessId;  
  142.     DWORD       HandleCount;  
  143.     DWORD       Reserved2[2];  
  144.     DWORD       VmCounters;  
  145.     DWORD       dCommitCharge;  
  146.     PVOID       ThreadInfos[1];  
  147. }SYSTEM_PROCESS_INFORMATION, *PSYSTEM_PROCESS_INFORMATION;  
  148.   
  149.   
  150. BOOL GetProcessListByNTDLL(){  
  151.   
  152.     // 导出函数  
  153.     HMODULE hNtDll = GetModuleHandle("ntdll.dll");  
  154.     ZWQUERYSYSTEMINFORMATION ZwQuerySystemInformation = (ZWQUERYSYSTEMINFORMATION)GetProcAddress(hNtDll,"ZwQuerySystemInformation");  
  155.       
  156.     ULONG  cbBuffer = 0x10000;  
  157.     LPVOID pBuffer  = NULL;  
  158.       
  159.     pBuffer = malloc(cbBuffer);  
  160.     if(pBuffer == NULL)  
  161.         return -1;    
  162.     // 获取进程信息  
  163.     ZwQuerySystemInformation(SystemProcessesAndThreadsInformation,pBuffer,cbBuffer,NULL);  
  164.     // 指针指向链表头部  
  165.     PSYSTEM_PROCESS_INFORMATION pInfo = (PSYSTEM_PROCESS_INFORMATION)pBuffer;     
  166.     // 输出结果  
  167.     for(;;)  
  168.     {  
  169.         SetColor(0,13);  
  170.         printf("PID:%d  ",pInfo->ProcessId);  
  171.         SetColor(0,7);  
  172.         printf("\t%ls\n",pInfo->ProcessName.Buffer);  
  173.         if(pInfo->NextEntryDelta == 0)  
  174.             break;        
  175.         // 读取下一个节点  
  176.         pInfo = (PSYSTEM_PROCESS_INFORMATION)(((PUCHAR)pInfo)+pInfo->NextEntryDelta);  
  177.     }  
  178.     // 释放缓冲区  
  179.     free(pBuffer);  
  180.   
  181.     return TRUE;  
  182. }  
  183. void main(){  
  184.   
  185.     //GetProcessList();  
  186.     //GetProcessListByPSAPi();  
  187.     //GetProcessByWTSAPI();  
  188.     GetProcessListByNTDLL();  
  189. }  

原文地址


http://blog.csdn.net/earbao/article/details/8464715

目录
相关文章
|
1月前
|
监控 关系型数据库 MySQL
在CentOS系统中,如何统计哪个进程打开了文件描述符?
利用上述方法,你可以有效地监控和统计CentOS系统中的进程打开的文件描述符数量,以帮助排查错误或优化系统配置。通过组合使用各种工具和命令,可以获得对系统状态和行为的深入了解,进而做出相应的调整和
114 5
|
存储 安全 数据管理
C语言之考勤模拟系统平台(千行代码)
C语言之考勤模拟系统平台(千行代码)
220 4
麒麟系统mate-indicators进程占用内存过高问题解决
【10月更文挑战第7天】麒麟系统mate-indicators进程占用内存过高问题解决
1350 2
|
程序员 C语言 开发者
pymalloc 和系统的 malloc 有什么区别
pymalloc 和系统的 malloc 有什么区别
|
8月前
|
弹性计算 运维 监控
基于进程热点分析与系统资源优化的智能运维实践
智能服务器管理平台提供直观的可视化界面,助力高效操作系统管理。核心功能包括运维监控、智能助手和扩展插件管理,支持系统健康监控、故障诊断等,确保集群稳定运行。首次使用需激活服务并安装管控组件。平台还提供进程热点追踪、性能观测与优化建议,帮助开发人员快速识别和解决性能瓶颈。定期分析和多维度监控可提前预警潜在问题,保障系统长期稳定运行。
354 17
|
11月前
|
IDE 编译器 开发工具
【C语言】全面系统讲解 `#pragma` 指令:从基本用法到高级应用
在本文中,我们系统地讲解了常见的 `#pragma` 指令,包括其基本用法、编译器支持情况、示例代码以及与传统方法的对比。`#pragma` 指令是一个强大的工具,可以帮助开发者精细控制编译器的行为,优化代码性能,避免错误,并确保跨平台兼容性。然而,使用这些指令时需要特别注意编译器的支持情况,因为并非所有的 `#pragma` 指令都能在所有编译器中得到支持。
989 41
【C语言】全面系统讲解 `#pragma` 指令:从基本用法到高级应用
|
10月前
|
监控 搜索推荐 开发工具
2025年1月9日更新Windows操作系统个人使用-禁用掉一下一些不必要的服务-关闭占用资源的进程-禁用服务提升系统运行速度-让电脑不再卡顿-优雅草央千澈-长期更新
2025年1月9日更新Windows操作系统个人使用-禁用掉一下一些不必要的服务-关闭占用资源的进程-禁用服务提升系统运行速度-让电脑不再卡顿-优雅草央千澈-长期更新
1052 2
2025年1月9日更新Windows操作系统个人使用-禁用掉一下一些不必要的服务-关闭占用资源的进程-禁用服务提升系统运行速度-让电脑不再卡顿-优雅草央千澈-长期更新
如何在 Linux 系统中查看进程占用的内存?
如何在 Linux 系统中查看进程占用的内存?
1771 58
|
11月前
|
存储 监控 Linux
嵌入式Linux系统编程 — 5.3 times、clock函数获取进程时间
在嵌入式Linux系统编程中,`times`和 `clock`函数是获取进程时间的两个重要工具。`times`函数提供了更详细的进程和子进程时间信息,而 `clock`函数则提供了更简单的处理器时间获取方法。根据具体需求选择合适的函数,可以更有效地进行性能分析和资源管理。通过本文的介绍,希望能帮助您更好地理解和使用这两个函数,提高嵌入式系统编程的效率和效果。
505 13
|
9月前
|
监控 关系型数据库 MySQL
【01】客户端服务端C语言-go语言-web端PHP语言整合内容发布-优雅草网络设备监控系统-硬件设备实时监控系统运营版发布-本产品基于企业级开源项目Zabbix深度二开-分步骤实现预计10篇合集-自营版
【01】客户端服务端C语言-go语言-web端PHP语言整合内容发布-优雅草网络设备监控系统-硬件设备实时监控系统运营版发布-本产品基于企业级开源项目Zabbix深度二开-分步骤实现预计10篇合集-自营版
281 0