[Solved] Name der .exe - welche dieser Methoden verwenden? (auch: Was bringt PSAPI_VERSION)



  • Hallo zusammen,

    ich möchte für eine gegebene process ID den Name der executable bekommen (bzw. den Pfad). Ich habe hierfür verschiedene Funktionen gefunden, welche alle funktionieren:

    GetModuleFileNameExA Retrieves the fully qualified path for the file containing the specified module.
    QueryFullProcessImageNameA Retrieves the full name of the executable image for the specified process.
    GetProcessImageFileName Retrieves the name of the executable file for the specified process.

    Kennt jemand noch weitere?... lach
    Welche dieser Funktionen, die bei mir alle dasselbe Ergebnis liefern, sollte man bevorzugen?

    Ich habe irgendwo gelesen, die QueryFullProcessImageNameA sei effizienter, weil psapi.dll nicht geladen werden muss. Allerdings steht bei den anderen Funktionen, dass kernel32.dll verwendet wird, außer wenn PSAPI_VERSION=1 ist, und bei mir ist PSAPI_VERSION=2. Also ist das Argument für mich nicht relevant, ich linke nicht einmal mit psapi.lib.

    Dazu auch eine zweite kleine Frage: Was macht dieses PSAPI_VERSION Makro und sollte mich das interessieren? Hat das was mit 32bit und 64bit zu tun?

    Ich könnte natürlich einfach würfeln, und mich mit einer der Funktionen zufriedengeben, aber ich würde lieber etwas dazulernen und eine begründete Entscheidung treffen.

    Vielen Dank im Voraus.



  • Naja, ein bisschen mehr steht da noch (ich kenne mich mit Windows nicht aus!).

    In den Bemerkungen steht ja noch "The GetModuleFileNameEx function is primarily designed for use by debuggers and similar applications that must extract module information from another process. (...) " (Hervorhebung von mir)

    Wie ist das denn bei dir? Für eigene oder fremde Prozesse?

    Die anderen beiden Funktionen scheinen sich nur in dem Rückgabeformat zu unterscheiden:
    "The GetProcessImageFileName function returns the path in device form, rather than drive letters.
    (...)
    To retrieve the name of the main executable module for a remote process in win32 path format, use the QueryFullProcessImageName function."

    Das wäre zumindest das, was ich der Doku entnehme.



  • @HarteWare sagte in Name der .exe - welche dieser Methoden verwenden? (auch: Was bringt PSAPI_VERSION):

    Dazu auch eine zweite kleine Frage: Was macht dieses PSAPI_VERSION Makro und sollte mich das interessieren? Hat das was mit 32bit und 64bit zu tun?

    Mit Windows 7 sind einige Funktionen aus psapi direkt in den Kernel gewandert und die entsprechenden Definitionen in psapi.h sind defines die je nach Wert von PSAPI_VERSION unterschiedlich aussehen.



  • Oh man... ich weiß nicht, wie ich das hier übersehen habe:

    To retrieve the name of the main executable module for a remote process, use the GetProcessImageFileName or QueryFullProcessImageName function. This is more efficient and more reliable than calling the GetModuleFileNameEx function with a NULL module handle.

    Allerdings stimmt das mit der device form nicht... Ich bekomme immer den drive letter vorne, auch bei GetProcessImageFileNameA. Keine Ahnung warum mein Ergebnis nicht mit der Doku übereinstimmt.
    Stimmt nicht, es gab einen Fehler beim Aufruf... Always check your return codes!

    Toller bug, so schnell kanns gehen:

    CHAR buf[512]{};
    DWORD bufsz{ sizeof(buf) };
    QueryFullProcessImageNameA(proc, 0, buf, &bufsz); // overwrites bufsz
    cout << buf << '\n';
    GetProcessImageFileName(proc, buf, bufsz);
    cout << buf << '\n';
    

    Fehler: ERROR_INSUFFICIENT_BUFFER facepalm

    Vielen Dank für eure Antworten.



  • @HarteWare Mein Programm, das Eingabeaufforderungen durchsichtig macht, benutzt QueryFullProcessImageName, um zu überprüfen, ob ein geöffnetes Fenster eine Eingabeaufforderung ist.


Log in to reply