Я пытался получить исполняемый путь путем перечисления всех процессов. Я использовал оба 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;
}
Да! Ответ в том, что вы не можете получить путь к ntoskrnl.exe. Мне было интересно, как менеджер задач это делает. Я нашел это после проверки в течение нескольких часов! : P (Не стоило так много).
Если вы видите этот скриншот, вы можете увидеть, что процесс Путь к образу системы было C: \ WINDOWS тогда как для conhost.exe это был C: \ Windows.
Даже окна жестко закодированы для этого Exe. Они жестко закодировали это как % SystemRoot% \ system32 \ ntoskrnl.exe. Только когда вы расширяете Systemroot, вы получаете значение как C: \ WINDOWS. Когда вы делаете с API, таким как GetModuleFileNameEx, вы получаете путь как C: \ Windows. Так что технически нет выхода. И, по моему предположению, по соображениям безопасности они не позволили ни одному пользователю получить путь к Exe.
Других решений пока нет …