C/C++遍历进程和进程ID的小工具

原文:http://blog.csdn.net/qq78442761/article/details/54646010

当我们写某些具有破坏性的程序时就需要对进程进行遍历和提取ID

对于上述功能,我们先介绍几个API

1.CreateToolhelp32Snapshout function

得到进程、模块或者线程的快照

语法如下:

[cpp] view plain copy

  1. HANDLE WINAPI CreateToolhelp32Snapshot(
  2. _In_ DWORD dwFlags,
  3. _In_ DWORD th32ProcessID
  4. );

第一个参数:快照中包含了系统的一部分,参数如下:

我们这里用TH32CS_SNAPPROCESS

快照包含了系统里面的所有进程。

第二个是关于 PROCESSENTRY32结构体

语法如下:

[cpp] view plain copy

  1. typedef struct tagPROCESSENTRY32 {
  2. DWORD     dwSize;
  3. DWORD     cntUsage;
  4. DWORD     th32ProcessID;
  5. ULONG_PTR th32DefaultHeapID;
  6. DWORD     th32ModuleID;
  7. DWORD     cntThreads;
  8. DWORD     th32ParentProcessID;
  9. LONG      pcPriClassBase;
  10. DWORD     dwFlags;
  11. TCHAR     szExeFile[MAX_PATH];
  12. } PROCESSENTRY32, *PPROCESSENTRY32;

这描述了一个入口,这个入口是当快照被调用时系统地址空间里面的进程被读取。

这里只介绍szExeFile[MAX_PATH]和

th32ParentProcessID:这是创建进程后的进程的标识(父进程)

szExeFile:进程里面可执行文件的名字

下面是源代码!部分函数没有讲解,但可以通过注释或者字面意思可以了解

[cpp] view plain copy

  1. #include <Windows.h>
  2. #include <stdio.h>
  3. #include <TlHelp32.h>
  4. int main()
  5. {
  6. HANDLE hProceessnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
  7. if (hProceessnap == INVALID_HANDLE_VALUE)
  8. {
  9. printf_s("创建进行快照失败\n");
  10. return -1;
  11. }
  12. else
  13. {
  14. PROCESSENTRY32 pe32;
  15. pe32.dwSize = sizeof(pe32);
  16. BOOL hProcess = Process32First(hProceessnap, &pe32);
  17. char buff[1024];
  18. while (hProcess)
  19. {
  20. wsprintf(buff, "进程名:%s--------------------进程ID:%d", pe32.szExeFile, pe32.th32ParentProcessID);
  21. printf_s("%s\n", buff);
  22. memset(buff, 0x00, 1024);
  23. hProcess = Process32Next(hProceessnap, &pe32);
  24. }
  25. }
  26. CloseHandle(hProceessnap);
  27. return 0;
  28. }

运行结果如下

1
时间: 2024-10-12 22:41:30

C/C++遍历进程和进程ID的小工具的相关文章

进程控制(十一)---更改进程的用户ID和组ID

Linux提供了setuid函数和seteuid函数来更改与进程相关的用户ID,和进程相关的用户ID有“实际用户ID.有效用户ID和保存的设置用户ID” ====================================================== 函数原型: 函数参数: uid:要设置的用户ID 返回值: 调用成功时返回 0 调用失败时返回 -1 ==================================================== 当进程的有效用户ID是roo

文件和目录详解(二)---与进程有关的ID详解

与进程有关的 ID 大概有 6 种左右,如下图所示 ====================================================== 进程实际用户ID:就是创建此进程的用户的 ID: 进程有效用户ID:是进程用来评定对系统资源访问权限的用户 ID: 进程创建新文件的时候新文件的所有者被设置成进程的有效用户. 保存的设置用户ID:就是用来备份进程有效用户 ID 的:(后面的笔记再详细介绍) 通常情况下,进程的实际用户ID和有效用户ID是相同的.但是如果可执行文件的set

C#中遍历当前所有进程时存在的陷阱

有时候我们希望我们所写的exe在机器上同一时间只能有一个实例进行运行.通常我们会采取遍历当前所有的进程,如果有的进程exe所在的物理路径就是当前exe的物理路径的话,那么说明这个exe已经启动过一次了,就不再启动了.但是注意,这里有一些需要注意的小细节. 有时候对于编写一个应用程序的守护进程的时候,也要用到这个遍历方法.即我需要另外启动一个进程,这个进程启动后,要查看所有的进程,看看其所检测的进程是否已经启动.那么怎么判断遍历的那个进程是否是其目标进程呢?那么就需要看这个进程exe所在的路径是否

pidof---查找指定名称的进程的进程号id号。

pidof命令用于查找指定名称的进程的进程号id号. 语法 pidof(选项)(参数) 选项 -s:仅返回一个进程号: -c:仅显示具有相同"root"目录的进程: -x:显示由脚本开启的进程: -o:指定不显示的进程ID. 参数 进程名称:指定要查找的进程名称. 实例 pidof nginx 13312 5371 pidof crond 1509 pidof init 1 原文地址:https://www.cnblogs.com/jianlibao/p/9995857.html

Android之——杀死选中的进程(释放进程占用的空间)

转载请注明出处:http://blog.csdn.net/l1028386804/article/details/47277691 这篇文章是基于上一篇文章<Android之--获取进程.内存.任务列表>完善的,大家可以先阅读一下上一篇博文<Android之--获取进程.内存.任务列表>,做到心中有数.这篇文章中我主要向大家介绍,如何杀死我们在列表中选中的进程,释放进程所占用的空间.好了,不废话了,咱们直接进入主题吧. 一.原理 老规矩,还是先唠叨一下这个原理级别的东东吧. 基于上

C++ 实现 查找进程, 杀死进程, 启动进程, 进程重启

头文件: #include <Windows.h>#include <tlhelp32.h>#include <tchar.h>#include <ShellAPI.h> 查找进程: 就是调用windowApi遍历所有启动进程,  实现如下 bool FindProcess(std::string strProcessName, DWORD& nPid) { TCHAR tszProcess[64] = { 0 }; lstrcpy(tszProce

孤儿进程 &amp;&amp; 僵尸进程

background: unix: 每个子进程退出,内核释放该进程所有资源,打开的文件,占用的内存 保留的信息:the process ID,the termination status of the process,the amount of CPU time taken by the process 父进程用wait()/waitpid()释放子进程的保留信息 父进程不调用wait()/waitpid()进程号一直被占用,系统所能提供的进程号有限,没有可用的进程号导致系统不能产生新的进程 Z

linux内核之进程的基本概念(进程,进程组,会话关系)

进程是操作系统的一个核心概念.每个进程都有自己唯一的标识:进程ID,也有自己的生命周期.一个典型的进程的生命周期如图4-1所示. 进程都有父进程,父进程也有父进程,这就形成了一个以init进程为根的家族树.除此以外,进程还有其他层次关系:进程.进程组和会话. 进程组和会话在进程之间形成了两级的层次:进程组是一组相关进程的集合,会话是一组相关进程组的集合. 这样说来,一个进程会有如下ID: ·PID:进程的唯一标识.对于多线程的进程而言,所有线程调用getpid函数会返回相同的值. ·PGID:进

(转)进程间关系:进程、僵尸进程、孤儿进程、进程组、前台进程组、后台进程组、孤儿进程组、会话、控制终端

不同的shell对使用管道线时创建子进程的顺序不同,本文以bash为例,它是支持作业控制的shell的典型代表. 僵尸进程与孤儿进程 僵尸进程:先于父进程终止,但是父进程没有对其进行善后处理(获取终止子进程有关信息,释放它仍占有的资源).消灭僵尸进程的唯一方法是终止其父进程.孤儿进程:该进程的父进程先于自身终止.其特点是PPID=1(init进程的ID).一个孤儿进程可以自成孤儿进程组. 文中用到的缩写 PID = 进程ID (由内核根据延迟重用算法生成)PPID = 父进程ID(只能由内核修改