首页 > 系统相关 >Windows编程系列:进程遍历的几种方法

Windows编程系列:进程遍历的几种方法

时间:2024-03-20 17:58:56浏览次数:27  
标签:遍历 快照 函数 Windows 编程 TH32CS th32ProcessID 进程 DWORD

在应用层下,进程遍历有多种方式,这里介绍几种常用的方式:进程快照、ZwQuerySystemInformation/NtQuerySystemInformation、EnumProcesses函数、WMI等。

 

在C#中Process类提供了一个GetProcesses()函数,这个函数内部就是调用的NtQuerySystemInformation进行获取。

 

进程快照

这种方式比较简单方便。主要涉及以下几个函数

CreateToolhelp32Snapshot(TlHelp32.h)函数,获取进程信息为指定的进程、进程使用的堆、模块、线程建立一个快照。

函数声明如下:

1 HANDLE
2 WINAPI
3 CreateToolhelp32Snapshot(
4     DWORD dwFlags,
5     DWORD th32ProcessID
6     );

参数说明:

dwFlags

含义
TH32CS_INHERIT
0x80000000
指示快照句柄是可继承的。
TH32CS_SNAPALL
包括系统中的所有进程和线程,以及 th32ProcessID 中指定的进程的堆和模块。 等效于指定使用 OR 操作 (“|”组合的TH32CS_SNAPHEAPLIST、TH32CS_SNAPMODULE、TH32CS_SNAPPROCESS和TH32CS_SNAPTHREAD值) 。
TH32CS_SNAPHEAPLIST
0x00000001
包括快照 th32ProcessID 中指定的进程的所有堆。 若要枚举堆,请参阅 Heap32ListFirst
TH32CS_SNAPMODULE
0x00000008
包括快照 th32ProcessID 中指定的进程的所有模块。 若要枚举模块,请参阅 Module32First。 如果函数失败并 出现ERROR_BAD_LENGTH,请重试该函数,直到成功。
TH32CS_SNAPMODULE32
0x00000010
从 64 位进程调用时,包括快照中 th32ProcessID 中指定的进程的所有 32 位模块。 此标志可以与 TH32CS_SNAPMODULE 或 TH32CS_SNAPALL结合使用。 如果函数失败并 出现ERROR_BAD_LENGTH,请重试该函数,直到成功。
TH32CS_SNAPPROCESS
0x00000002
包括系统中快照中的所有进程。 若要枚举进程,请参阅 Process32First
TH32CS_SNAPTHREAD
0x00000004
包括快照系统中的所有线程。 若要枚举线程,请参阅 Thread32First

若要标识属于特定进程的线程,请在枚举线程时将其进程标识符与 THREADENTRY32 结构的 th32OwnerProcessID 成员进行比较。

枚举进程的话使用TH32CS_SNAPPROCESS就可以了,也可以枚举其它的内容,可以自行尝试。

 

th32ProcessID指定将要快照的进程ID。如果该参数为零,则表示快照当前进程。该参数只有在设置了TH32CS_SNAPHEAPLIST或者

TH32CS_SNAPMODULE后才有效,在其他情况下应忽略该参数,快照所有的进程。

 

返回值:

成功,返回快照句柄

失败,返回INVALID_HANDLE_VALUE

 

注意,进程枚举完成后需要CloseHandle关闭快照句柄。

 

Process32First函数,用于检索系统快照中遇到的第一个进程信息。在调用CreateToolhelp32Snapshot成功后,就可以调用这个函数来获取第一个进程信息。函数声明如下:

1 BOOL
2 WINAPI
3 Process32FirstW(
4     HANDLE hSnapshot,
5     LPPROCESSENTRY32W lppe
6     );

 

参数说明:

hSnapshot

CreateToolhelp32Snapshot函数返回的快照句柄

 

lppe

指向PROCESSENTRY32结构的指针。

 

PROCESSENTRY32结构定义如下:

 1 typedef struct tagPROCESSENTRY32W
 2 {
 3     DWORD   dwSize;                     // size
 4     DWORD   cntUsage;                   // obselete(keep 0)
 5     DWORD   th32ProcessID;              // this process
 6     ULONG_PTR th32DefaultHeapID;        // obselete(keep 0)
 7     DWORD   th32ModuleID;               // associated exe
 8     DWORD   cntThreads;                 // The number of execution threads started by the process.
 9     DWORD   th32ParentProcessID;        // this process's parent process
10     LONG    pcPriClassBase;             // Base priority of process's threads
11     DWORD   dwFlags;                    // obselete(keep 0)
12     WCHAR   szExeFile[MAX_PATH];        // Path
13 } PROCESSENTRY32W;

 

返回值:

TRUE,进程列表的第一个条目已经复制到缓冲区

FALSE,失败,调用GetLastError()获取错误信息

 

Process32Next函数,检索系统快照中记录的下一个进程信息。这个函数的声明和Process32First一样,使用方法也一样,这是在第一个进程的基础上,继续向下遍历 。

 

返回值:

TRUE,

 

标签:遍历,快照,函数,Windows,编程,TH32CS,th32ProcessID,进程,DWORD
From: https://www.cnblogs.com/zhaotianff/p/18085620

相关文章

  • Android第一行代码——快速入门 Kotlin 编程(3.7 Kotlin课堂:标准函数和静态方法)
    目录3.7        Kotlin课堂:标准函数和静态方法3.7.1    标准函数with、run和apply3.7        Kotlin课堂:标准函数和静态方法        现在我们即将进入本书首次的Kotlin课堂,之后的几乎每一章中都会有这样一个环节。虽说目前你已经可......
  • Android第一行代码——快速入门 Kotlin 编程(3.6 Activity 的最佳实践)
    目录3.6        Activity的最佳实践3.6.1    知晓当前是在哪一个Activity3.6.2    随时随地退出程序 3.6.3    启动Activity的最佳写法3.6        Activity的最佳实践        关于Activity,你已经掌握了非常多......
  • C# Fortran混合编程
    基本目标:利用c#调用fortran中的souroutine或者function方法。通过把fortran代码编译成.dll(windows)/.so(unix)动态库,放到c#的执行路径下。再通过c#中的DllImport方法导入库函数,实现在c#中调用fortran方法。1.DllImport方法该方法来自System.Runtime.In......
  • 编程语言设计,编程哲学
    机器代码-汇编代码-高级语言语言处在机器高效执行与人类可读性的平衡点最好json>yaml>tomljson有{},可以压缩空格;规则简单;存在较少的转义号yaml去掉{},改用空格层级(类似python);规则较复杂静态语言:rust>zig>C#>JAVA>C++>Crust用{},更及时释放内存;报错智......
  • windows系统下使用pip安装 Superset
    windows系统下使用pip安装Superset一安装ANACONDAAnaconda官方网站就是可以便捷获取包且对包能够进行管理,同时对环境可以统一管理的发行版本。Anaconda包含了conda、Python在内的超过180个科学包及其依赖项。下载地址:免费下载(anaconda.com)直接点击下一步完成安装二......
  • Windows Server 2019 Oracle 19c Restore & Recovery
    RMAN>CONNECTTARGET/;RMAN>run{ SQL>shutdownimmediate; startupmountforce; startupmount; setuntiltime"to_date('2024-03-1905:36:58','yyyy-mm-ddhh24:mi:ss')"; restoredatabase; recoverdatabase; al......
  • Leecode 二叉树的中序遍历
    Day6第三题这是一道让我崩溃的题,因为一个笔误root.right写成了root.left改了好久。classSolution{publicList<Integer>inorderTraversal(TreeNoderoot){List<Integer>listRoot=newArrayList<Integer>();if(root!=null){listRo......
  • 掌握Go语言:Go语言通道,并发编程的利器与应用实例(20)
    通道(Channel)是用来在Go程序中传递数据的一种数据结构。它是一种类型安全的、并发安全的、阻塞式的数据传输方式,用于在不同的Go协程之间传递消息。基本概念创建通道:使用make()函数创建一个通道。ch:=make(chanint)//创建一个整型通道发送数据:使用<-操作符向通......
  • windows下启停jar并指定application.yml配置文件
    启动脚本start.bat@echooffREM设置jar文件名和application.yml文件名setJAR_FILE=xxx-boot.jarsetYML_FILE=application-prod.ymlsetACTIVE=prodsetPORT=8080REM启动jar:startjava-jar%JAR_FILE%--server.port=%PORT%--spring.profiles.active=%ACTIVE%--s......
  • 102. 二叉树的层序遍历C
    /***Definitionforabinarytreenode.*structTreeNode{*intval;*structTreeNode*left;*structTreeNode*right;*};*//***Returnanarrayofarraysofsize*returnSize.*Thesizesofthearraysarereturnedas*returnC......