【发布时间】:2018-08-23 12:22:46
【问题描述】:
我一直在尝试通过枚举所有进程来获取可执行路径。我同时使用了 GetModuleFileNameExA 和 QueryFullProcessImageNameA 来获取可执行文件的路径。
它适用于几乎所有东西,除了少数像 ntoskrnl.exe(系统,进程 ID:4)。当我使用这些方法时,获得的 HANDLE 是 NOT NULL 但函数 fail。
GetLastError 结果是 31
代码是否有任何问题或必须采取任何解决方法? 注意:我的 EXE 是 32 位 EXE,我有 64 位操作系统。这有关系吗?
INT32 GetFileNameAndPath(DWORD processId,string &filePath,string &fileName)
{
CHAR path[MAX_PATH];
DWORD size=MAX_PATH;
smatch match;
HANDLE hProcess = OpenProcess(PROCESS_QUERY_LIMITED_INFORMATION,FALSE,processId);
if(hProcess != NULL)
{
regex regx("[^\\\\]+$");
if(GetModuleFileNameExA(hProcess,NULL,path,size) != 0)
{
filePath = path;
if(regex_search(filePath,match,regx))
fileName = match.str();
}
else if(QueryFullProcessImageNameA(hProcess,0,path,&size) != 0)
{
filePath = path;
if(regex_search(filePath,match,regx))
fileName = match.str();
}
else
{
cout<<GetLastError();
}
}
CloseHandle(hProcess);
return SUCCESS;
}
【问题讨论】:
标签: c++ winapi visual-c++ getmodulefilename