Не удалось получить путь к исполняемому файлу для идентификатора процесса 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.