我一直试图通过枚举所有进程来获取可执行路径。我同时使用 GetModuleFileNameExA 和 QueryFullProcessImageNameA 来获取可执行文件的路径。
它几乎适用于所有内容,除了 ntoskrnl.exe (系统,进程ID:4 )之类的很少。当我使用这些方法时,获得的 HANDLE (
GetLastError原来是 31
代码是否存在问题或必须采取任何解决方法? 注意:我的EXE是32位EXE,我有64位OS。这有关系吗?
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;
}
答案 0 :(得分:0)
是的!答案是您无法获取ntoskrnl.exe的路径。我想知道任务管理器是如何做到的。我检查了几个小时才找到它! :P(应该花不了多少)。
如果看到该屏幕截图,您会看到系统的图像路径名是 C:\ WINDOWS ,而对于conhost.exe,它是C:\ Windows。 / p>
甚至所有窗口都已对该Exe进行了硬编码。他们已将其硬编码为%Systemroot%\ system32 \ ntoskrnl.exe 。仅当展开Systemroot时,您的值才为 C:\ WINDOWS 。使用诸如GetModuleFileNameEx之类的API时,路径为 C:\ Windows 。因此,从技术上讲,这是没有办法的。根据我的假设,由于安全原因,他们不允许任何用户获取Exe的路径。