[C++] Alle aktiven Prozesse mit PID auflisten
-
Hi Leute,
ich würde gerne ein Programm schreiben, welches ein Programm öffnet, wenn es geschlossen ist, und es schließt, wenn es geöffnet ist.
Daher wollte ich erstmal damit anfangen alle Prozesse auszulesen und auflisten zu können.
Deshalb hab ich was recherchiert und bin auf den Code gestoßen:#include "stdafx.h" #include <iostream> #include <conio.h> #include <clocale> #include <Windows.h> #include <Psapi.h> using namespace std; void PrintProcessNameAndID(DWORD processID) { HMODULE hMod; DWORD cbNeeded; TCHAR szProcessName[MAX_PATH] = TEXT("<unbekannt>"); HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, processID); if (hProcess != NULL) { if (EnumProcessModules(hProcess, &hMod, sizeof(hMod), &cbNeeded)) { GetModuleBaseName(hProcess, hMod, szProcessName, sizeof(szProcessName) / sizeof(TCHAR)); } } _tprintf(TEXT("%s (PID: %u)\n"), szProcessName, processID); CloseHandle(hProcess); } int _tmain(int argc, _TCHAR* argv[]) { DWORD aProcesses[1024], cbNeeded, cProcesses; unsigned int i; setlocale(LC_ALL, "German"); EnumProcesses(aProcesses, sizeof(aProcesses), &cbNeeded); cProcesses = cbNeeded / sizeof(DWORD); for (i = 0; i <= cProcesses; i++) { if (aProcesses[i] != 0) { PrintProcessNameAndID(aProcesses[i]); } } _getch(); return 0; }
Ich kompiliere in Visual C++ 2013. Wenn ich jedoch das Programm jetzt laufen lasse, dann zeigt es mir nur 32-bit Prozesse an. Wenn ich das Programm als 64-bit laufen lasse, dann zeigt es 32-bit & 64-bit Prozesse an, jedoch werden dennoch nicht alle angezeigt. Als Administrator ausführen hab ich auch schon versucht.
Nun meine Frage: Wie kann ich es schaffen, dass das Programm alle Prozesse auflistet?
Hab da auch schon ein bischen gegoogelt, auf eine Lösung bin ich aber nicht gestoßen.Würde mich freuen, wenn mir da jemand helfen kann.
LG
jkhsjdhjs
-
Bei mir gehts... (Mal davon abgesehen dass der Code leicht fehlerhaft ist)
Welche Prozesse fehlen denn ?
-
DarkShadow44 schrieb:
Bei mir gehts...
Hast du ein 32bit System?
DarkShadow44 schrieb:
(Mal davon abgesehen dass der Code leicht fehlerhaft ist)
An welcher Stelle ist der Code denn fehlerhaft?
DarkShadow44 schrieb:
Welche Prozesse fehlen denn ?
Also, bei der 32bit Exe werden angezeigt:
NvBackend.exe
DTLite.exe
AnyDVDtray.exe
Dropbox.exe
jusched.exe
HD-Agent.exe
iTunesHelper.exe
PTBSync.exe
firefox.exe
Programm.exe (das Programm selbst)Also fehlen:
ADVDDiscHlp64.exe (wird bei der 64bit-Version angezeigt)
AppleMobileDeviceService.exe
ApplicationWebServer.exe
armsvc.exe
conhost.exe (6x) (wird bei der 64bit-Version 2x angezeigt)
csrss.exe (2x)
dasHost.exe
DeskDrive.exe (wird bei der 64bit-Version angezeigt)
dllhost.exe (wird bei der 64bit-Version angezeigt)
dpupdchk.exe (wird bei der 64bit-Version angezeigt)
dwm.exe
explorer.exe (wird bei der 64bit-Version angezeigt)
GoogleUpdate.exe
HD-BlockDevice.exe
HD-LogRotatorService.exe
HD-Network.exe
HD-Service.exe
HD-ShaderFolder.exe
iPodService.exe
ipoint.exe (wird bei der 64bit-Version angezeigt)
livecomm.exe
lkads.exe
lkcitdl.exe
lktsrv.exe
lsass.exe
mDNSResponder.exe
MsMpEng.exe
nidmsrv.exe
nidmsrvResponder.exe
NisSrv.exe
NvNetworkService.exe
nvSCPAPISvr.exe
nvstreamsvc.exe (2x)
nvtray.exe (wird bei der 64bit-Version angezeigt)
nvvsvc.exe (2x)
nvxdsymc.exe
PnkBstrA.exe
PsiService.exe
PTBSync.exe (steht schon oben, ist aber 2x vorhanden)
RAVCpl64.exe (wird bei der 64bit-Version angezeigt)
RuntimeBroker.exe
SbieSvc.exe
SearchIndexer.exe
services.exe
SettingSyncHost.exe (wird bei der 64bit-Version angezeigt)
SkyDrive.exe (wird bei der 64bit-Version angezeigt)
smss.exe
spoolsv.exe
sqlservr.exe
sqlwriter.exe
Start8_64.exe
Start8Srv.exe
svchost.exe (12x)
SystemWebServer.exe
taskeng.exe
taskhostex.exe (wird bei der 64bit-Version angezeigt)
TeamViewer_Service.exe
wininit.exe
winlogon.exe
WmiPrvSE.exe
wmpnetwk.exe
WUDFHost.exe (2x)Also werden bei der 32bit Version ausschließlich 32bit Programme angezeigt.
Verschiedene 64bit Prozesse werden bei der 64bit Version angezeigt, aber dennoch nicht alle.EDIT: Habe die Programme beide Male als Administrator ausgeführt.
-
for (i = 0; i <= cProcesses; i++)
muss
for (i = 0; i < cProcesses; i++)
sein.
Und ohne Änderungen kompiliert der Code bei mir nicht, aber das kann auch an mir liegen...Ich hab ein Win7 x64, und bei mir werden sowohl als 32 als auch bei 64 Bit Programm alle Prozesse aufgelistet.
Habs grad auch nochmal inner VM ausgetestet (auch 64Bit), selbes Ergebnis.
-
DarkShadow44 schrieb:
for (i = 0; i <= cProcesses; i++)
muss
for (i = 0; i < cProcesses; i++)
sein.
Und ohne Änderungen kompiliert der Code bei mir nicht, aber das kann auch an mir liegen...Ok, Danke. Werde das ändern.
Dass er das bei dir ohne die Änderung nicht kompiliert, liegt warscheinlich am Compiler. ^^
Ich nutze ja Visual Studio, da akzeptiert er das so.DarkShadow44 schrieb:
Ich hab ein Win7 x64, und bei mir werden sowohl als 32 als auch bei 64 Bit Programm alle Prozesse aufgelistet.
Habs grad auch nochmal inner VM ausgetestet (auch 64Bit), selbes Ergebnis.Ich hab Win8.1 x64. Liegt dann warscheinlich daran. Oder könntest du mir mal deine kompilierte Version, also die exe, schicken damit ich die mal bei mir ausprobieren kann?
-
Ich verwende auf VS. Ich denke an der Exe wird nicht viel anders sein, denke das liegt an irgendwelchen Rechteeinstellungen.
Schonmal mit "CreateToolhelp32Snapshot" probiert ?
-
DarkShadow44 schrieb:
Ich verwende auf VS. Ich denke an der Exe wird nicht viel anders sein, denke das liegt an irgendwelchen Rechteeinstellungen.
Schonmal mit "CreateToolhelp32Snapshot" probiert ?Nope, kannte die Funktion nicht. Werd mir sie mal anschaun. Danke
-
-
Hi schrieb:
Ja, das hab ich auch schon vorher gehört. Deshalb hab ich es ja auch als 64bit Anwendung kompiliert. Leider hat es dann immer noch nicht funktioniert. Dann probier ich das jetzt mit CreateToolhelp32Snapshot!
-
So, habs jetzt mit CreateToolhelp32Snapshot!
Funktioniert 1A!Danke für die ganze Hilfe!
#include "stdafx.h" #include <iostream> #include <conio.h> #include <windows.h> #include <tlhelp32.h> using namespace std; void ListRunningProcesses() { int i = 0; HANDLE hProcessSnapshot; PROCESSENTRY32 pe32; hProcessSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL); pe32.dwSize = sizeof(PROCESSENTRY32); if (!Process32First(hProcessSnapshot, &pe32)) { CloseHandle(hProcessSnapshot); } do { wcout << "Prozess: " << pe32.szExeFile << endl; i++; } while (Process32Next(hProcessSnapshot, &pe32)); CloseHandle(hProcessSnapshot); cout << endl << i << " Prozesse laufen." << endl; } int _tmain(int argc, _TCHAR* argv[]) { cout << "Liste aller laufenden Prozesse:" << endl; ListRunningProcesses(); _getch(); return 0; }
EDIT: So, hier mal mein aktueller Code. Habe da aber noch ne Frage:
// Hamachi Launcher.cpp : Definiert den Einstiegspunkt für die Konsolenanwendung. // #include "stdafx.h" #include <iostream> #include <conio.h> #include <windows.h> #include <tlhelp32.h> #include <clocale> #include <comdef.h> #include <string> using namespace std; bool CheckForProcessRunning(string process) { string ExeFile; HANDLE hProcessSnapshot; PROCESSENTRY32 pe32; hProcessSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, NULL); pe32.dwSize = sizeof(PROCESSENTRY32); if (!Process32First(hProcessSnapshot, &pe32)) { CloseHandle(hProcessSnapshot); } do { _bstr_t ExeFileSTR(pe32.szExeFile); ExeFile = ExeFileSTR; if (ExeFile == process) { CloseHandle(hProcessSnapshot); return true; } } while (Process32Next(hProcessSnapshot, &pe32)); CloseHandle(hProcessSnapshot); return false; } int _tmain(int argc, _TCHAR* argv[]) { setlocale(LC_ALL, "German"); string UI = "hamachi-2-ui.exe", Service = "hamachi-2.exe"; LPCTSTR lpServiceName = L"Hamachi2Svc"; SC_HANDLE hSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS); if (hSCManager == 0) { cout << "Es sind Fehler aufgetreten!" << endl; cout << GetLastError() << endl; } SC_HANDLE hService = OpenService(hSCManager, lpServiceName, SC_MANAGER_ALL_ACCESS); if (hService == 0) { cout << "Es sind Fehler aufgetreten!" << endl; cout << GetLastError() << endl; } if (CheckForProcessRunning(Service) == false) { if (StartService(hService, NULL, NULL) == TRUE) { cout << "Der Dienst \"LogMeIn Hamachi Tunneling Engine\" wurde erfolgreich gestartet!"; } else { cout << "Der Dienst \"LogMeIn Hamachi Tunneling Engine\" konnte nicht gestartet werden!" << endl; cout << GetLastError() << endl; } Sleep(2000); if (CheckForProcessRunning(UI) == false) { ShellExecute(NULL, NULL, L"C:\\Program Files (x86)\\LogMeIn Hamachi\\hamachi-2-ui.exe", NULL, NULL, SW_SHOW); } } else { ControlService(hService, SERVICE_CONTROL_STOP, NULL); cout << GetLastError(); cout << "Der Dienst wurde gestoppt!"; } _getch(); return 0; }
Und zwar soll das Programm den Hamachi Dienst starten, wenn er nicht schon gestartet ist. Sollte er schon gestartet sein, soll es ihn beenden.
Nur aus irgendeinem Grund erhalte ich immer beiControlService(hService, SERVICE_CONTROL_STOP, NULL); cout << GetLastError();
Error 487. Habe schon gegoogelt, das heißt wohl Attempt to access invalid address. Nur warum? StartService funktioniert schließlich einwandfrei.
Hat da jemand von euch einen Rat oder nen Fehler gefunden?
-
Also so ein bisschen komisch ist das schon, bei mir nutzen jedenfalls beide Funktionen intern die selbe API...
Zu deinem Problem:
SERVICE_STATUS out; ControlService(hService, SERVICE_CONTROL_STOP, &out);
Der dritte Paramter ist nicht optional
-
DarkShadow44 schrieb:
Also so ein bisschen komisch ist das schon, bei mir nutzen jedenfalls beide Funktionen intern die selbe API...
Zu deinem Problem:
SERVICE_STATUS out; ControlService(hService, SERVICE_CONTROL_STOP, &out);
Der dritte Paramter ist nicht optional
Achso, da hab ich gestern in der msdn opt wohl mit out verwechselt ^^
Danke
Funktioniert jetzt alles einwandfrei!