在应用层下,进程遍历有多种方式,这里介绍几种常用的方式:进程快照、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
值 | 含义 |
---|---|
|
指示快照句柄是可继承的。 |
|
包括系统中的所有进程和线程,以及 th32ProcessID 中指定的进程的堆和模块。 等效于指定使用 OR 操作 (“|”组合的TH32CS_SNAPHEAPLIST、TH32CS_SNAPMODULE、TH32CS_SNAPPROCESS和TH32CS_SNAPTHREAD值) 。 |
|
包括快照 th32ProcessID 中指定的进程的所有堆。 若要枚举堆,请参阅 Heap32ListFirst。 |
|
包括快照 th32ProcessID 中指定的进程的所有模块。 若要枚举模块,请参阅 Module32First。 如果函数失败并 出现ERROR_BAD_LENGTH,请重试该函数,直到成功。
64 位 Windows: 在 32 位进程中使用此标志包括 th32ProcessID 中指定的进程的 32 位模块,而在 64 位进程中使用它包括 64 位模块。 若要从 64 位进程包括 th32ProcessID 中指定的进程的 32 位模块,请使用 TH32CS_SNAPMODULE32 标志。 |
|
从 64 位进程调用时,包括快照中 th32ProcessID 中指定的进程的所有 32 位模块。 此标志可以与 TH32CS_SNAPMODULE 或 TH32CS_SNAPALL结合使用。 如果函数失败并 出现ERROR_BAD_LENGTH,请重试该函数,直到成功。 |
|
包括系统中快照中的所有进程。 若要枚举进程,请参阅 Process32First。 |
|
包括快照系统中的所有线程。 若要枚举线程,请参阅 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