Sto cercando di ottenere l'handle del processo, ad esempio example.exe, così posso chiamare TerminateProcess
su di esso. Come posso fare questo? Si noti, non ha una finestra in modo che FindWindow
non funzionerà.Come posso ottenere un handle di processo con il suo nome in C++?
risposta
#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;
}
Inoltre, se si desidera utilizzare PROCESS_ALL_ACCESS in OpenProcess, si potrebbe provare questo:
#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;
}
Partenza: MSDN Article
È possibile utilizzare GetModuleName
(credo?) Per ottenere il nome e verificare che contro.
La maggior parte del GetModuleName, del nome QueryFullProcessImage, ecc., Richiede un handle e pertanto non sarà molto utile. Toolhelp restituisce il nome del processo. – Michael
OpenProcess Funzione
Da MSDN:
per aprire un handle a un altro processo locale e ottenere i diritti di accesso completo, è necessario abilitare il privilegio SeDebugPrivilege.
Non ho il pID, solo il nome. – Malfist
SeDebugPrivilege non è assolutamente necessario per i processi in esecuzione come te. Se hai accesso al processo tramite il suo ACL (che generalmente fai per processi che crei allo stesso livello di integrità del tuo codice), non hai bisogno di SeDebugPrivilege. Dalla stessa pagina MSDN: Se il chiamante ha abilitato il privilegio SeDebugPrivilege, l'accesso richiesto è garantito indipendentemente dal contenuto del descrittore di sicurezza. – Michael
Sì, è necessario ottenere l'ID processo innanzitutto eseguendo processi iterativi. –
Esistono due tecniche di base. Il primo utilizza PSAPI; MSDN ha an example che utilizza EnumProcesses
, OpenProcess
, EnumProcessModules
e GetModuleBaseName
.
L'altro utilizza Toolhelp, che preferisco. Utilizzare CreateToolhelp32Snapshot
per ottenere un'istantanea dell'elenco dei processi, passarci sopra con Process32First
e Process32Next
, che fornisce il nome del modulo e l'ID del processo, fino a trovare quello desiderato, quindi chiamare OpenProcess
per ottenere un handle.
Il codice seguente mostra come è possibile utilizzare TOOLHELP e OpenProcess per ottenere un handle al processo . Gestione degli errori rimossa per brevità.
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;
}
Hai dimenticato una parentesi nella condizione "if (MatchProcessName (process.szExeFile, name)" –
Come la risposta di xian, questa ha una condizione di competizione ed è intrinsecamente pericolosa – benrg
@Occulta' if (string (process.szExeFile) == stringa (nome)) 'può essere usato al posto di questa funzione. Ho modificato la risposta di Michael. – bytecode77
- 1. Ottieni il nome del processo da pid o handle
- 2. Come ottenere il nome del processo in C++
- 3. C# - Uccidere un processo da una parte del suo nome
- 4. Come ottenere carattere con il suo nome (unicode) in Java?
- 5. Nome processo dal suo pid in linux
- 6. Come posso ottenere un selettore dal suo nome?
- 7. Ottenere gli handle di file di un determinato processo
- 8. Come enumerare gli handle di processo?
- 9. Posso ottenere un handle per - source?
- 10. Come posso ottenere il nome del processo di una porta aperta in C#?
- 11. Come posso selezionare una scheda IE dal suo handle
- 12. Win32API - Come ottenere il nome del file del processo dall'handle del processo?
- 13. Dato un nome di proprietà, come posso creare un delegato per ottenere il suo valore
- 14. Come posso istanziare un oggetto conoscendo solo il suo nome?
- 15. Trova ID processo per handle della finestra
- 16. Ottenere un percorso di un processo in esecuzione per nome
- 17. Come posso chiamare un metodo dato solo il suo nome?
- 18. Come posso ottenere il nome di un file generato con uno stream in C#?
- 19. Come posso aprire un file temporaneo E ottenere il suo nome file?
- 20. Come trovare il file con il suo nome parziale?
- 21. Ottieni gli handle su tutte le finestre di un processo
- 22. Come posso ottenere il nome del computer locale in C#?
- 23. Modificare il nome del processo in C#?
- 24. Come avviare un eseguibile all'interno di un programma C++ e ottenere il suo id di processo (in linux)?
- 25. Come verificare se un programma è in esecuzione con il suo nome con Qt (C++)
- 26. Come posso ottenere il nome di un oggetto in java?
- 27. Come posso ottenere il nome di un file in Dart?
- 28. Come posso ottenere lo stdin di un processo con un id di processo?
- 29. C++ Windows - Come ottenere il percorso del processo dal suo PID
- 30. Come ottenere il nome del colore pur avendo il suo valore RGB in C#?
Il codice salterà il primo processo nel sistema (tuttavia, il primo processo è molto probabilmente "SYSTEM" quindi nessun bug visibile all'utente.) – Michael
Il primo processo è SYSTEM, quindi va bene (ho preso letteralmente quel codice direttamente da uno di i miei progetti);) – xian
Quando tento di agire sul hProcess ottengo il codice di errore 6, che è ERROR_INVALID_HANDLE – Malfist