无法获取进程ID 4(ntoskrnl.exe)的可执行路径

时间:2018-08-23 12:22:47

标签: c++ winapi visual-c++ getmodulefilename

我一直试图通过枚举所有进程来获取可执行路径。我同时使用 GetModuleFileNameExA QueryFullProcessImageNameA 来获取可执行文件的路径。

它几乎适用于所有内容,除了 ntoskrnl.exe (系统,进程ID:4 )之类的很少。当我使用这些方法时,获得的 HANDLE )为 NOT NULL ,但函数失败

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;
}

1 个答案:

答案 0 :(得分:0)

是的!答案是您无法获取ntoskrnl.exe的路径。我想知道任务管理器是如何做到的。我检查了几个小时才找到它! :P(应该花不了多少)。

Task Manager Screenshot

如果看到该屏幕截图,您会看到系统的图像路径名 C:\ WINDOWS ,而对于conhost.exe,它是C:\ Windows。 / p>

甚至所有窗口都已对该Exe进行了硬编码。他们已将其硬编码为%Systemroot%\ system32 \ ntoskrnl.exe 。仅当展开Systemroot时,您的值才为 C:\ WINDOWS 。使用诸如GetModuleFileNameEx之类的API时,路径为 C:\ Windows 。因此,从技术上讲,这是没有办法的。根据我的假设,由于安全原因,他们不允许任何用户获取Exe的路径。