Pfad eines Prozesses finden

zacharyy

Grünschnabel
Hallo liebe Community,

ich würde gerne den Pfad eines Prozesses, der gerade (im Taskmanager) läuft, als string speichern.
Sodass ich hinterher an die Dateien komme des Ordners komme, wo auch die .exe drin liegt.

Sinn und Zweck?
Ich möchte von einem Spiel die Configs auslesen.
Das Spiel wäre in diesem Falle Counter-Strike.

Wenn die hl.exe gestartet wurde, soll sich mein Programm den Pfad von der hl.exe raussuchen (also z.B.: C:\Spiele\Steam\steamapps\accountname\counter-strike\)und dann die config.cfg, die im selben Ordner liegt, kopieren.

Hat jemand eine Ahnung wie ich das "leicht und effizient" lösen könnte?

Danke!

Mit freundlichen Grüßen
zacharyy
 

zacharyy

Grünschnabel
Habe jetzt folgenden Code im Inet gefunden:

Code:
BOOL GetProcessModule(DWORD dwPID, DWORD dwModuleID, LPMODULEENTRY32 lpMe32, DWORD cbMe32)
{
    BOOL bRet = FALSE;
    BOOL bFound = FALSE;
    HANDLE hModuleSnap = NULL;
    MODULEENTRY32 me32 = {0};
    ZeroMemory(&me32,sizeof(MODULEENTRY32));
    hModuleSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, dwPID);
    if (hModuleSnap == INVALID_HANDLE_VALUE)
        return (FALSE);
    me32.dwSize = sizeof(MODULEENTRY32);
    if (Module32First(hModuleSnap, &me32))
    {
        do
        {
            if (me32.th32ProcessID == dwPID)
            {
                CopyMemory (lpMe32, &me32, cbMe32);
                bFound = TRUE;
            }
        }
        while (!bFound && Module32Next(hModuleSnap, &me32));
        bRet = bFound;
    }
    else
        bRet = FALSE;
    CloseHandle(hModuleSnap);
    return bRet;
}

BOOL ListProcesses()
{
    HANDLE hProcessSnap = 0;
    HANDLE hToken;
    PROCESSENTRY32 pe32 = {0};
    DWORD dwPriorityClass;
    BOOL bGotModule = FALSE;
    HANDLE hProcess;
    MODULEENTRY32 me32 = {0};
    hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
    if(hProcessSnap == INVALID_HANDLE_VALUE)
        return FALSE;
    pe32.dwSize = sizeof(PROCESSENTRY32);
    if(Process32First(hProcessSnap,&pe32))
    {
        do
        {
            ZeroMemory(&me32,sizeof(MODULEENTRY32));
            hProcess = OpenProcess(PROCESS_ALL_ACCESS,FALSE,pe32.th32ProcessID);
            bGotModule = GetProcessModule(pe32.th32ProcessID, pe32.th32ModuleID, &me32, sizeof(MODULEENTRY32));
            dwPriorityClass = GetPriorityClass(hProcess);
            cout<<"File name: "<<pe32.szExeFile<<endl;
            cout<<"Path: "<<me32.szExePath<<endl;
            CloseHandle(hProcess);
        }while(Process32Next(hProcessSnap,&pe32));
    }
    return bGotModule;
}

Wie kriege ich das jetzt hin, das er NUR die "hl.exe" aus meinem TaskManager sucht und dann auch nur den PFAD von der "hl.exe" als string speichert?
 

mvp87

Mitglied
Hallo,
hier wird überprüft ob ein Prozess läuft:
Code:
int IsOpen(BOOL &bOpen)
{	
	DWORD aProcesses[1024], cbNeeded, cProcesses;
    unsigned int i = 0;

    if ( !EnumProcesses( aProcesses, sizeof(aProcesses), &cbNeeded ) )
	{
		//fehler
	}       

    // Calculate how many process identifiers were returned.
    cProcesses = cbNeeded / sizeof(DWORD);

    for ( i = 0; i < cProcesses; i++ )
	{
		IsInProcessList(aProcesses[i]);		
	}
}

int IsInProcessList(DWORD dwProcessID)
{
	TCHAR szProcessName[MAX_PATH] = _T("unknown");
	CString strExe= _T("hl.exe");
	
	HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION |
									   PROCESS_VM_READ,
									   FALSE, dwProcessID );

	if(hProcess != NULL)
	{
		HMODULE hMod;
        DWORD cbNeeded;

		if ( EnumProcessModules( hProcess, &hMod, sizeof(hMod), 
             &cbNeeded) )
        {
            GetModuleBaseName( hProcess, hMod, szProcessName, 
                               sizeof(szProcessName) );

			if(strExe.CompareNoCase(szProcessName) == 0)
			{
				//HL.exe Prozess gefunden! 
			}
        }		
	}

	CloseHandle( hProcess );	
}

Du kannst dir für die Schleife, die IsInProcessList noch eine Abbruchbedingung einfallen lassen (z.B.: BOOL Wert setzen, wenn Prozess gefunden)

Zum auslesen des Pfades findest du alle wichtigten Informationen hier:
http://msdn.microsoft.com/en-us/library/ms683198(VS.85).aspx
 

zacharyy

Grünschnabel
Hey! Danke erstmal fürs Antworten.

Wo genau liest dein Code denn den Pfad von der hl.exe aus?
Hier? "TCHAR szProcessName[MAX_PATH] = _T("unknown");"

Und leider kriege ich tausende Errors mit meinem Dev-C++, kannst du den Code evtl. dafür optimieren?
Errors sind folgende
error C2065: '_T' : undeclared identifier
error C2440: 'initializing' : cannot convert from 'int' to 'char [260]'
There are no conversions to array types, although there are conversions to references or pointers to arrays
error C2065: 'CString' : undeclared identifier
error C2146: syntax error : missing ';' before identifier 'strExe'
error C2065: 'strExe' : undeclared identifier
error C2065: 'EnumProcessModules' : undeclared identifier
error C2065: 'GetModuleBaseName' : undeclared identifier
error C2228: left of '.CompareNoCase' must have class/struct/union type
error C2065: 'EnumProcesses' : undeclared identifier

Danke schonmal!

||Edit||

Ich habe gerade folgenden Code über Google gefunden:

Code:
[/#include <Psapi.h>

#pragma comment(lib, "psapi.lib") // Nur Visual Studio: psapi.lib einbinden

void GetPathFromHandle(HWND hWnd, LPTSTR szPathFromHandle)
{
    DWORD lpdwProcessId;
    HANDLE hProcessHandle;
    GetWindowThreadProcessId(hWnd, &lpdwProcessId);   
    hProcessHandle = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, TRUE, lpdwProcessId);
    GetModuleFileNameEx(hProcessHandle, NULL, szPathFromHandle, MAX_PATH);
    CloseHandle(hProcessHandle);
}

Ist genau das was ich suche. Wie kriege ich denn jetzt den Handle von der "hl.exe"?
Danach würde ich den Pfad gern weiterverarbeiten, im Sinne von Configs auslesen.
 
Zuletzt bearbeitet: