Verzweiflung!!!
-
Wie ermittle ich den vollständigen Pfad von laufenden Prozessen??? 
Bitte helft mir, is echt dringend!!
-
Hi,
Verwende GetModuleFileName (bzw. die Ex-Version).
PS: Überleg Dir beim nächsten Mal doch einen passenderen Namen für Deinen Thread
.
-
Das hast du ein paar threads weiter unten schon gefragt und ich hatte dir geantwortet. Wenn du nicht weißt wie man das debug-privileg setzt benutz doch mal google.
-
Hy Leute,
danke für die Vorschläge. Ich habe hier mal meinen Code:
Zu CodeFinder:
#include <windows.h> #include <tlhelp32.h> #include <stdio.h> #include <psapi.h> int main(int argc, char* argv[]) { HANDLE hSnapShot = CreateToolhelp32Snapshot ( TH32CS_SNAPPROCESS, 0); PROCESSENTRY32* processInfo = new PROCESSENTRY32; processInfo->dwSize = sizeof ( PROCESSENTRY32); while ( Process32Next ( hSnapShot,processInfo ) != FALSE) { TCHAR pfad[MAX_PATH]; HANDLE h=OpenProcess(PROCESS_ALL_ACCESS,FALSE,processInfo->th32ProcessID); GetModuleFileNameEx(h,NULL,pfad,sizeof(pfad)/sizeof(TCHAR)); printf ( "Prozess %05d: %s.\n", processInfo->th32ProcessID,processInfo->szExeFile); }; CloseHandle ( hSnapShot); delete processInfo; system("Pause"); return 0; }Jetzt bekomme ich aber immer die Fehlermeldung:
[Linker Error] undefined reference to 'GetModuleFileNameExA@16' Id returnded 1 exit statusKannste mir helfen?
Zu Black Shadow:
Ich habe das mit dem debug-privileg rausbekommen, aber der Pfad wird immer noch nicht angezeigt?!
Hier mein Code:
#include <windows.h> #include <tlhelp32.h> #include <stdio.h> #include <psapi.h> // Set/Unset specified privilige for given handle BOOL SetPrivilege(HANDLE hToken, /* token handle*/ LPCTSTR Privilege, /* Privilege to enable/disable*/ BOOL bEnablePrivilege /* TRUE to enable. FALSE to disable)*/) { TOKEN_PRIVILEGES tp; LUID luid; TOKEN_PRIVILEGES tpPrevious; DWORD cbPrevious=sizeof(TOKEN_PRIVILEGES); if(!LookupPrivilegeValue( NULL, Privilege, &luid )) return FALSE; // // first pass. get current privilege setting // tp.PrivilegeCount = 1; tp.Privileges[0].Luid = luid; tp.Privileges[0].Attributes = 0; AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(TOKEN_PRIVILEGES), &tpPrevious, &cbPrevious); if (GetLastError() != ERROR_SUCCESS) return FALSE; // // second pass. set privilege based on previous setting // tpPrevious.PrivilegeCount = 1; tpPrevious.Privileges[0].Luid = luid; if(bEnablePrivilege) { tpPrevious.Privileges[0].Attributes |= (SE_PRIVILEGE_ENABLED); } else { tpPrevious.Privileges[0].Attributes ^= (SE_PRIVILEGE_ENABLED & tpPrevious.Privileges[0].Attributes); } AdjustTokenPrivileges(hToken, FALSE, &tpPrevious, cbPrevious, NULL, NULL); if (GetLastError() != ERROR_SUCCESS) return FALSE; return TRUE; } int main(int argc, char* argv[]) { HANDLE hSnapShot = CreateToolhelp32Snapshot ( TH32CS_SNAPPROCESS, 0); PROCESSENTRY32* processInfo = new PROCESSENTRY32; processInfo->dwSize = sizeof ( PROCESSENTRY32); while ( Process32Next ( hSnapShot,processInfo ) != FALSE) { HANDLE h=OpenProcess(PROCESS_ALL_ACCESS,FALSE,processInfo->th32ProcessID); SetPrivilege( h,SE_DEBUG_NAME,TRUE); printf ( "Prozess %05d: %s.\n", processInfo->th32ProcessID,processInfo->szExeFile); }; CloseHandle ( hSnapShot); delete processInfo; system("Pause"); return 0; }Es gibt zwar keine Fehlermeldungen, aber der Pfad wird nicht angezeigt. Warum?
-
tsp schrieb:
(...) aber der Pfad wird nicht angezeigt. Warum?
Process32First/Next liefert immer nur den Namen des Prozesses, aber keinen Pfad. Einen "Prozesspfad" gibt es nicht.
Du musst Dir bei jedem Prozess mit Module32First/Next alle Module anzeigen lassen und "raten", welches der Module den Prozess "darstellt."
Das "Debug-Privileg" braucht Dein eigenes Programm (standardmässig disabled), da Module32First/Next sonst bei "Systemprozessen" nichts liefert.
// !!! Es wäre zu empfehlen einige Fehlerabfragen einzubauen !!! // !!! Sämtliche Funktionen sind wohldokumentiert !!! // 1. Debug-Privileg setzen : HANDLE h1; TOKEN_PRIVILEGES tp; RtlFillMemory (&tp,sizeof(tp),0); tp.PrivilegeCount = 1; tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; LookupPrivilegeValue (0,"SeDebugPrivilege",&tp.Privileges[0].Luid); OpenProcessToken (GetCurrentProcess(),TOKEN_ALL_ACCESS,&h1); AdjustTokenPrivileges (h1,0,&tp,0,0,0); CloseHandle (h1); // 2. Sämtliche Prozesse incl. Module anzeigen : HANDLE hSnapProcess; PROCESSENTRY32 processInfo; processInfo.dwSize = sizeof (processInfo); HANDLE hSnapModule; MODULEENTRY32 moduleInfo; moduleInfo.dwSize = sizeof (moduleInfo); hSnapProcess = CreateToolhelp32Snapshot (TH32CS_SNAPPROCESS,0); Process32First (hSnapProcess,&processInfo); // ! do { printf ("Prozess : %s\n",processInfo.szExeFile); // viel spass beim parsen :-) hSnapModule = CreateToolhelp32Snapshot (TH32CS_SNAPMODULE,processInfo.th32ProcessID); Module32First (hSnapModule,&moduleInfo); // ! do { printf (" Modul : %s\n",moduleInfo.szExePath); // dito } while ( Module32Next (hSnapModule,&moduleInfo) ); CloseHandle (hSnapModule); } while ( Process32Next (hSnapProcess,&processInfo) ); CloseHandle (hSnapProcess);
-
Danke merker,
das funzt schon sehr gut

aber irgendwie gibt mir das Programm nur ganz wenige prozesse aus (ca. 4-5)
Wieso, was mach ich falsch ?
-
Hy merker,

vergiss die letzt Frage, war mein Fehler, hab ihn schon beseitigt.
Echt noch mal vielen Dank. Genau das, was ich wollte!