我一直在尝试通过枚举所有进程来获取可执行路径。我同时使用了GetModuleFileNameExA和QueryFullProcessImageNameA来获取可执行文件的路径。
它适用于几乎所有东西,除了少数像ntoskrnl.exe(系统,进程 ID:4)。当我使用这些方法时,获得的HANDLE不是 NULL但函数失败。
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;
}