列出Windows进程和模块
Listing Windows Processes and Modules
我最近一直在摆弄Windows API,我遇到了一个问题,我需要一点帮助。实际上,确切地说,有两个问题。
我将首先展示代码,然后解释我遇到的困难:
#pragma once
#pragma comment(lib, "Psapi.lib")
#include <stdlib.h>
#include <stdio.h>
#include <Windows.h>
#include <TlHelp32.h>
#include <Psapi.h>
void ProcessError(DWORD error);
int main() {
FILE* file = fopen("C:\Users\Administrator\Desktop\processes.txt", "w");
DWORD count, i, modulesCount;
WCHAR buffer[128] = {0};
HMODULE modules[128] = {0};
HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);
PROCESSENTRY32 pEntry;
pEntry.dwSize = sizeof(PROCESSENTRY32);
count = 0;
if(snapshot != INVALID_HANDLE_VALUE) {
if(!Process32First(snapshot, &pEntry)) {
ProcessError(GetLastError());
CloseHandle(snapshot);
ExitProcess(EXIT_FAILURE);
}
do {
HANDLE hProc = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, pEntry.th32ProcessID);
GetModuleFileNameEx(hProc, NULL, (LPWSTR)memset(buffer, 0, 128), 128);
fwprintf(file, L"-------------------------------------------------------n");
fwprintf(file, L"%st pid: %dn", pEntry.szExeFile, pEntry.th32ProcessID);
fwprintf(file, L"%sn", buffer);
if(hProc != INVALID_HANDLE_VALUE) {
if(EnumProcessModules(hProc, (HMODULE*)memset(modules, 0, 128), 128, &modulesCount)) {
modulesCount = modulesCount <= 128 ? modulesCount : 128;
for(i = 0; i < modulesCount; ++i) {
GetModuleFileName(modules[i], (LPWSTR)memset(buffer, 0, 128), 128);
if(wcslen(buffer) > 0) {
fwprintf(file, L"tt0x%X Module: %sn", modules[i], buffer);
}
}
}
else {
ProcessError(GetLastError());
}
CloseHandle(hProc);
}
else {
ProcessError(GetLastError());
}
count++;
} while(Process32Next(snapshot, &pEntry));
fwprintf(file, L"Process count: %dn", count);
}
else {
ProcessError(GetLastError());
CloseHandle(snapshot);
ExitProcess(EXIT_FAILURE);
}
fclose(file);
CloseHandle(snapshot);
ExitProcess(EXIT_SUCCESS);
}
void ProcessError(DWORD error) {
printf("Error in thread 0x%X, code: 0x%Xn", GetThreadId(GetCurrentThread()), error);
}
那么,第一个问题与以下内容有关:
if(EnumProcessModules(hProc, (HMODULE*)memset(modules, 0, 128), 128, &modulesCount))
有时我得到INVALID_HANDLE错误,我真的不知道为什么。Process句柄不是无效的,也没有任何其他参数传递给函数。如果有人能给我解释一下,或者至少给我指出一些方向(这是更可取的解决方案,因为我对学习更感兴趣:D)这会对我有好处。
其次,由于某种原因,当我枚举进程的模块和GetModuleFileName()时,它还包括当前进程的位置。
当我写入文件时,我会得到以下内容:TuneUpUtilitiesApp32.exe pid: 2744 D:Program FilesTuneUp Utilities 2012TuneUpUtilitiesApp32.exe 0x76F60000 Module: C:WindowsSYSTEM32ntdll.dll 0x75FE0000 Module: C:Windowssystem32kernel32.dll 0x75370000 Module: C:Windowssystem32KERNELBASE.dll 0x761A0000 Module: C:Windowssystem32USER32.dll 0x770D0000 Module: C:Windowssystem32GDI32.dll 0x77130000 Module: C:Windowssystem32LPK.dll 0x76EC0000 Module: C:Windowssystem32USP10.dll 0x75F20000 Module: C:Windowssystem32msvcrt.dll 0x755D0000 Module: C:Windowssystem32ADVAPI32.dll 0x75590000 Module: C:WindowsSYSTEM32sechost.dll 0x757D0000 Module: C:Windowssystem32RPCRT4.dll 0x77120000 Module: C:Windowssystem32PSAPI.DLL 0x755B0000 Module: C:Windowssystem32IMM32.DLL 0x75670000 Module: C:Windowssystem32MSCTF.dll 0x10000000 Module: C:Windowssystem32guard32.dll 0x750D0000 Module: C:Windowssystem32VERSION.dll 0x750C0000 Module: C:Windowssystem32fltlib.dll 0x0 Module: C:UsersAdministratordocumentsvisual studio 2010ProjectsFunWithWindowsAPIReleaseFunWithWindowsAPI.exe 0x0 Module: C:UsersAdministratordocumentsvisual studio 2010ProjectsFunWithWindowsAPIReleaseFunWithWindowsAPI.exe 0x0 Module: C:UsersAdministratordocumentsvisual studio 2010ProjectsFunWithWindowsAPIReleaseFunWithWindowsAPI.exe 0x0 Module: C:UsersAdministratordocumentsvisual studio 2010ProjectsFunWithWindowsAPIReleaseFunWithWindowsAPI.exe 0x0 Module: C:UsersAdministratordocumentsvisual studio 2010ProjectsFunWithWindowsAPIReleaseFunWithWindowsAPI.exe 0x0 Module: C:UsersAdministratordocumentsvisual studio 2010ProjectsFunWithWindowsAPIReleaseFunWithWindowsAPI.exe
它确实对我可以从中提取模块的每个进程都这样做。任何帮助将非常感激!
您没有正确使用返回的"modulesCount"。它是而不是模块的数量,它是以字节为单位的数组大小。你需要除以sizeof(HMODULE)来得到模块的数量。
第二个问题是,你希望的pEntry。当您开始迭代流程条目时,th32ProcessID仍然有效。这是徒劳的希望,进程可能在迭代时终止。你不检查这个,你不验证OpenProcess()是否返回一个有效句柄。它也可能因为您没有足够的权限来访问该进程而失败。
关注CreateToolhelp32Snapshot()可以做什么,它还支持Module32First/Next()。它将更加可靠,因为该函数能够创建快照。
相关文章:
- boost::进程间消息队列引发错误
- 尝试导入pybind-opencv模块时出现libgtk错误
- 在进程中对同一管道进行读取和写入时C++管道出现问题
- 是否可以通过C++扩展强制多个python进程共享同一内存
- IPC使用多个管道和分支进程来运行Python程序
- 异常属于C++中的线程还是进程
- WMI检测进程创建事件-c++
- c++多进程编写一个唯一的文件
- 如何在C++中将函数发送到另一个进程
- 枚举进程模块在有效句柄上返回无效句柄
- 通过进程模块C 枚举时,访问被拒绝
- Visual Studio 在附加到进程时不会加载模块
- 强制卸载进程的模块
- 在同一进程中使用的两个模块中具有同步对象的通用名称是否安全
- 从其他进程获取模块句柄
- 使用Module32First/Next从64位进程中枚举32位进程模块
- 如何将事件处理程序附加到本机 Node.js 模块中的进程出口?
- 内存模块是否映射到进程的虚拟空间?
- 无法在具有无限循环的 boost.python 模块中通过 Ctrl-c 杀死进程
- 列出Windows进程和模块