使用windowsAPI进程进程检索
所使用的Windows API 原型
CreateToolhelp32Snapshot 函数 (tlhelp32.h)
CreateToolhelp32Snapshot API功能是获取指定进程以及这些进程使用的堆,模块和线程的快照
HANDLE CreateToolhelp32Snapshot(
[in] DWORD dwFlags,//要包含在快照中的系统部分
[in] DWORD th32ProcessID//系统进程标识符
);
OpenProcess函数(processthreadsapi.h)
HANDLE OpenProcess(//打开现有的本地进程对象。
[in] DWORD dwDesiredAccess,//对进程对象的访问,参数是一个进程的访问权限。具体的参数可以查看处理安全性和访问权限 - Win32 apps | Microsoft Learn
[in] BOOL bInheritHandle,//一个BOOL值 使用TRUE,进程创建的子进程会继承这个句柄(对系统进程的枚举使用FALSE)。
[in] DWORD dwProcessId//进程的PID
);
Process32First 函数 (tlhelp32.h)
BOOL Process32First API功能检索有关系统快照的第一个进程的信息(
[in] HANDLE hSnapshot,//快照的句柄,该句柄是从CreateToolhelp32Snapshot函数返回的
[in, out] LPPROCESSENTRY32 //指向PROCESSSNTRY32的结构的指针 它包含进程信息 比如可执行文件的名称 进程标识符 和父进程的标识符
);
Process32Next 函数 (tlhelp32.h)
BOOL Process32Next 检索快照中记录的下一个进程的信息(
[in] HANDLE hSnapshot,//从CreateToolhelp32Snapshot函数的上一次调用返回的快照句柄
[out] LPPROCESSENTRY32W lppe//指向PROCESSENTRY32W结构的指针
);
Module32First 函数 (tlhelp32.h)
BOOL Module32First(//检索与进程相关联的第一个模块的相关信息
[in] HANDLE hSnapshot,//从CreateToolhelp32Snapshot函数的上一次调用返回的快照句柄
[in, out] LPMODULEENTRY32 lpme//指向MODULEENTRY32结构的指针
);
Module32Next 函数 (tlhelp32.h)
Module32Next//检索与进程或线程关联的下一个模块的相关信息
BOOL Module32Next(
[in] HANDLE hSnapshot,//CreateToolhelp32Snapshot函数返回的句柄
[out] LPMODULEENTRY32 lpme//指向MODULEENTRY32结构的指针
);
closeHandle 函数 (handleapi.h)
BOOL CloseHandle(//关闭对象打开的进程
[in] HANDLE hObject//打开的进程句柄
);
代码
代码功能要求
代码功能为对系统运行的进程进行检测,并输出当前进程所使用的模块和调用模块的PID,调用该进程的父进程。(代码未写出主函数,需要使用自行写入 代码参考MSCN文档[枚举进程的所有模块 - Win32 apps | Microsoft Learn](https://learn.microsoft.com/zh-cn/windows/win32/psapi/enumerating-all-modules-for-a-process))
代码功能实现
1 | BOOL GetProcessList() |
代码功能测试
测试程序在高内存使用时候是否可以正常进行使用,所以运行slay the spire.exe 进行测试。但是在运行时并没有找到slay the spire.exe这个进程,有一个javaw.exe在运行当时发现这个进程但是没有注意(javaw.exe虚拟机中运行了这个java架构的游戏,java代码的运行是实际上是在java虚拟机中运行的)。大佬建议我使用进程命令行去查找,是否程序是进程代理启动,java代码对游戏进行了启动。
jps(JVM命令)
1 | jps -v |
命令可以显示java虚拟机启动传递的JVM参数
1 | jps-l |
命令可以枚举所有正在运行的PID和进程名,查找对应的进程号可以确定端口号
netstat -ano |findstr <PID>
命令可以枚举所有端口 |findstr 可以查看指定的PID 显示哪一个进程占用了端口。
1 |
|
命令可以检查对应的进程的详细信息
代码在两个状态下运行,左图是未运行状态,右图是运行状态。运行状态下多了三个使用的模块。
事实上代码并没有在高内存占用的情况下崩溃。