Не удалось получить путь к исполняемому файлу для идентификатора процесса 4 (ntoskrnl.exe)

Я пытался получить исполняемый путь путем перечисления всех процессов. Я использовал и GetModuleFileNameExA, и QueryFullProcessImageNameA, чтобы получить путь к исполняемым файлам.

Он работает практически для всего, кроме немногих, таких как ntoskrnl.exe (система, идентификатор процесса: 4). Когда я использую эти методы, полученная РУЧКА НЕ НЕДЕЙСТВИТЕЛЬНА, но функции терпят неудачу.

GetLastError оказывается 31

Есть ли какие-либо проблемы с кодом или какой-либо обходной путь должен быть сделан? ПРИМЕЧАНИЕ. Мой EXE-файл - 32-разрядный, и у меня 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;
}

1 ответ

Да! Ответ в том, что вы не можете получить путь к ntoskrnl.exe. Мне было интересно, как менеджер задач это делает. Я нашел это после проверки в течение нескольких часов!:P (Не стоило так много).

Скриншот диспетчера задач

Если вы видите этот снимок экрана, вы можете видеть, что путь к образу системного образа был C:\WINDOWS, тогда как для conhost.exe это было C:\Windows.

Даже окна жестко закодированы для этого Exe. Они жестко закодировали его как % Systemroot% \ system32 \ ntoskrnl.exe. Только при развертывании Systemroot вы получите значение как C:\WINDOWS. Когда вы делаете с API, таким как GetModuleFileNameEx, вы получаете путь как C: \ Windows. Так что технически нет выхода. И, по моему предположению, по соображениям безопасности они не позволили ни одному пользователю получить путь к Exe.

Другие вопросы по тегам