Prozess durch Dateinamen finden



  • hallo,
    ich möchte gerne ein handle von einem prozess haben,
    aber ich weiß net wie!
    Ich weiß wie der Prozess heißt (*.exe) aber wie bekomme ich das handle?
    habe alles in google abgeklappert, aber ich finde nischts.

    hilfee



  • AeroX schrieb:

    habe alles in google abgeklappert, aber ich finde nischts.

    Da solltest du aber mal üben ... 😃

    Bei M$ gibt es das in der MSDN Hilfe komplett mit Quelltext!!

    // MSDN Hilfe V8.0: "Enumerating All Processes"

    The EnumProcesses function retrieves the process identifier for each process object in the system.

    HMODULE hMod;
      DWORD cbNeeded;
    
      BOOL EnumProcesses(DWORD* pProcessIds, DWORD cb, DWORD* pBytesReturned);
    
      HANDLE hProcess = OpenProcess (
           PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, processID );
    
      EnumProcessModules( hProcess, &hMod, sizeof(hMod), &cbNeeded);
    
      GetModuleBaseName( hProcess, hMod, 
           szProcessName,sizeof(szProcessName)/sizeof(TCHAR) );
    

    alternativ auch

    // MSDN Hilfe V8.0: "Taking a Snapshot and Viewing Processes"

    This simple console application obtains a list of running processes.
    First, the GetProcessList function takes a snapshot of currently executing
    processes in the system ...

    Natuerlich braucht man ein Plattform-SDK, aber das ist beim VS dabei und
    laesst sich auch ansonsten online nutzen oder kostenlos bei MS downloaden.



  • Also, danke für die schnelle antwort,
    aber es geht nicht.

    Dein code funktioniert nicht weil processID, szProcessName... nicht deklariert ist.

    und bei msdn: "Enumerating All Processes"
    kommt nur:

    Fehler	1	error LNK2001: Nicht aufgelöstes externes Symbol "_EnumProcessModules@16".	ReadMemory.obj
    

    hilfe!



  • schau Dir das Beispiel an, da is alles Beschrieben.

    http://msdn.microsoft.com/en-us/library/ms682623(VS.85).aspx

    Gruß Matthias



  • @Matthias: genau das meinte ich 🙂

    Vielleicht sollte man dann auch gleich das ganze Kapitel PSAPI lesen.
    http://msdn.microsoft.com/en-us/library/ms684884(VS.85).aspx

    Wenn der Linker das o.a. Symbol nicht auflösen kann ist in den Projekteigenschaften vermutlich unter Linker/Zusätzliche Abhängigkeiten die psapi.lib nicht richtig eingebunden.

    Möglicherweise fehlt auch der Pfad zum Platform-SDK unter Extras/Optionen/Projekte../VC++ Verzeichnisse.



  • nach nedlich, ich habs jetzt.

    habe die "Psapi.lib" gesucht und den link dann so verwendet...

    #pragma comment(lib, "C:\\Programme\\Microsoft SDKs\\Windows\\v6.0A\\Lib\\Psapi.Lib")
    


  • Ups, habe vergessen den Quellcode vergessen^^

    für alle die damit noch probleme haben werden...

    HANDLE GetHandle(const wchar_t *pName)
    {
        DWORD aProcesses[1024], cbNeeded, cProcesses;
    
        if ( !EnumProcesses( aProcesses, sizeof(aProcesses), &cbNeeded ) )
    	{
    		cout << "EnumProcesses threw an error!" << '\n';
    		system("pause");
    		exit(1);
    	}
    
        cProcesses = cbNeeded / sizeof(DWORD);
    
        for (unsigned int i = 0; i < cProcesses; i++ )
    	{
            if( aProcesses[i] != 0 )
    		{
    
    			TCHAR szProcessName[32];
    
    			HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, aProcesses[i]);
    
    			if (NULL != hProcess )
    			{
    				HMODULE hMod;
    				DWORD cbNeeded;
    
    				if ( EnumProcessModules( hProcess, &hMod, sizeof(hMod), &cbNeeded) )
    				{
    					GetModuleBaseName( hProcess, hMod, szProcessName, sizeof(szProcessName)/sizeof(TCHAR) );
    					if (_wcsicmp(pName, szProcessName))
    					{
    						return hProcess;
    					}
    				}
    			}
    			CloseHandle( hProcess );
    		}
    	}
    	return 0;
    }
    

    Beispiel: HANLDE pHandle = GetHandle(L"WINmine.exe");



  • Schon sehr schön.

    Wollte noch anmerken, wenn man den Pfad noch wissen muss kann man GetProcessImageFileName verwenden.

    DWORD WINAPI GetProcessImageFileName(
      __in   HANDLE hProcess,
      __out  LPTSTR lpImageFileName,
      __in   DWORD nSize);
    

    Retrieves the name of the executable file for the specified process.

    lpImageFileName: A pointer to a buffer that receives the full path to the executable file.

    --

    Ich würde auch GetHandle(_T("WINmine.exe")) verwenden.

    VG
    merano


Anmelden zum Antworten