Я пытаюсь получить дескриптор процесса, например example.exe, поэтому я могу называть его TerminateProcess
. Как я могу это сделать? Обратите внимание, что у него нет окна, поэтому FindWindow
не будет работать.
Как я могу получить дескриптор процесса по его имени в С++?
Ответ 1
#include <cstdio>
#include <windows.h>
#include <tlhelp32.h>
int main( int, char *[] )
{
PROCESSENTRY32 entry;
entry.dwSize = sizeof(PROCESSENTRY32);
HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);
if (Process32First(snapshot, &entry) == TRUE)
{
while (Process32Next(snapshot, &entry) == TRUE)
{
if (stricmp(entry.szExeFile, "target.exe") == 0)
{
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, entry.th32ProcessID);
// Do stuff..
CloseHandle(hProcess);
}
}
}
CloseHandle(snapshot);
return 0;
}
Кроме того, если вы хотите использовать PROCESS_ALL_ACCESS в OpenProcess, вы можете попробовать следующее:
#include <cstdio>
#include <windows.h>
#include <tlhelp32.h>
void EnableDebugPriv()
{
HANDLE hToken;
LUID luid;
TOKEN_PRIVILEGES tkp;
OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken);
LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luid);
tkp.PrivilegeCount = 1;
tkp.Privileges[0].Luid = luid;
tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
AdjustTokenPrivileges(hToken, false, &tkp, sizeof(tkp), NULL, NULL);
CloseHandle(hToken);
}
int main( int, char *[] )
{
EnableDebugPriv();
PROCESSENTRY32 entry;
entry.dwSize = sizeof(PROCESSENTRY32);
HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL);
if (Process32First(snapshot, &entry) == TRUE)
{
while (Process32Next(snapshot, &entry) == TRUE)
{
if (stricmp(entry.szExeFile, "target.exe") == 0)
{
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, entry.th32ProcessID);
// Do stuff..
CloseHandle(hProcess);
}
}
}
CloseHandle(snapshot);
return 0;
}
Ответ 2
Следующий код показывает, как вы можете использовать toolhelp и OpenProcess, чтобы получить дескриптор процесса. Обработка ошибок удалена для краткости.
HANDLE GetProcessByName(PCSTR name)
{
DWORD pid = 0;
// Create toolhelp snapshot.
HANDLE snapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
PROCESSENTRY32 process;
ZeroMemory(&process, sizeof(process));
process.dwSize = sizeof(process);
// Walkthrough all processes.
if (Process32First(snapshot, &process))
{
do
{
// Compare process.szExeFile based on format of name, i.e., trim file path
// trim .exe if necessary, etc.
if (string(process.szExeFile) == string(name))
{
pid = process.th32ProcessID;
break;
}
} while (Process32Next(snapshot, &process));
}
CloseHandle(snapshot);
if (pid != 0)
{
return OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
}
// Not found
return NULL;
}
Ответ 3
Существует два основных метода. Первый использует PSAPI; В MSDN пример, который использует EnumProcesses
, OpenProcess
, EnumProcessModules
и GetModuleBaseName
.
Другой использует Toolhelp, который я предпочитаю. Используйте CreateToolhelp32Snapshot
, чтобы получить снимок списка процессов, пройдите по нему с помощью Process32First
и Process32Next
, который предоставляет имя модуля и идентификатор процесса, пока не найдете тот, который вы хотите, а затем вызовите OpenProcess
, чтобы получить дескриптор.
Ответ 4
Отъезд: Статья MSDN
Вы можете использовать GetModuleName
(я думаю?), чтобы получить имя и проверить на это.
Ответ 5
OpenProcess Функция
Из MSDN:
Чтобы открыть дескриптор другого локального процесса и получить права полного доступа, вы должны включить привилегию SeDebugPrivilege.