GetModuleFileNameEx如何查找某个进程,举个例子
时间: 2023-06-14 12:02:28 浏览: 108
GetModuleFileNameEx函数可以用来获取指定进程中指定模块的文件名。这个函数的原型如下:
```c++
DWORD GetModuleFileNameEx(
HANDLE hProcess,
HMODULE hModule,
LPWSTR lpFilename,
DWORD nSize
);
```
其中,参数`hProcess`表示要查找的进程句柄,参数`hModule`表示要查找的模块句柄(如果为NULL,则返回进程的可执行文件名),参数`lpFilename`是一个缓冲区,用来接收文件名,参数`nSize`表示缓冲区的大小。
下面举个例子,假设要获取进程ID为1234的进程中名为kernel32.dll的模块的文件名,可以按如下方式调用GetModuleFileNameEx函数:
```c++
#include <Windows.h>
#include <iostream>
int main()
{
DWORD pid = 1234;
HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, pid);
if (hProcess == NULL)
{
std::cout << "OpenProcess failed!" << std::endl;
return 1;
}
HMODULE hModule = GetModuleHandle(L"kernel32.dll");
WCHAR filename[MAX_PATH] = { 0 };
DWORD ret = GetModuleFileNameEx(hProcess, hModule, filename, MAX_PATH);
if (ret == 0)
{
std::cout << "GetModuleFileNameEx failed!" << std::endl;
CloseHandle(hProcess);
return 1;
}
std::wcout << L"The filename of kernel32.dll in process " << pid << " is: " << filename << std::endl;
CloseHandle(hProcess);
return 0;
}
```
在这个例子中,我们先用OpenProcess函数打开进程句柄,然后用GetModuleHandle函数获取kernel32.dll的模块句柄,最后调用GetModuleFileNameEx函数获取模块的文件名。注意,我们在调用OpenProcess函数时指定了PROCESS_QUERY_INFORMATION和PROCESS_VM_READ两个访问权限,这是因为GetModuleFileNameEx函数需要读取进程的内存信息。如果没有这两个访问权限,OpenProcess函数将会失败。
阅读全文