Zwei Fragen zu Prozessen



  • Hallo,

    Ich habe zwei Fragen zu Prozessen. Ich hoffe jemand kann mir helfen.

    1. Ich liste mit CreateToolhelp32Snapshot alle laufenden Prozesse auf. Wie kann ich nun herausfinden ob es sich bei dem einzelnen Prozess um ein 32 oder 64 bit Prozess handelt? Die PROCESSENTRY32 Struktur enthält darüber leider keine Informationen. Gibt es einen Weg jeden einzelnen Prozess darauf zu untersuchen? PID und Prozessname habe ich ja durch die Struktur.

    2. Kann ich für meinen oder einen anderen Prozess noch später während der Laufzeit Administratorrechte anfordern? Normal bettet man die UAC-Informationen schon vorab in das Manifest ein, doch ob das Anfordern auch später manuell geht würde mich sehr interessieren.

    Liebe Grüße,

    Marlene Baumann



  • Die Zweite Frage würde mich auch intressieren...



  • Marlene Baumann schrieb:

    2.

    Kurze Antwort: Nein. Laaaange Antwort: Windows 7 UAC whitelist: Code-injection Issue, Anti-Competitive API, Security Theatre.



  • Habe mir schon irgendwie gedacht das es aus Sicherheitsgründen nicht nicht geht bzw. nicht gehen darf. Hat jemand eine Idee/Lösung für meine zweite Frage?

    Lg
    Marlene Baumann



  • Hier ein beispiel aus der MSDN:

    Execute elevated
    Here is a little snippet of code that is useful for requesting user elevation in case higher priviledges are required:
    // csApp = _T("regedit");
    // csParams = _T("/s C:\example.reg");
    HINSTANCE nResult = ShellExecute(
      NULL,
      NULL,     // do not request elevation unless needed
      csApp,
      csParams, // params 
      NULL,     // directory
      SW_HIDE);
    if((int)nResult == SE_ERR_ACCESSDENIED) {
      nResult = ShellExecute(
        NULL,
        _T("runas"), // Trick for requesting elevation, this is a verb not listed in the documentation above.
        csApp,
        csParams,    // params
        NULL,        // directory
        SW_HIDE);
    }
    

    http://msdn.microsoft.com/en-us/library/windows/desktop/bb762153(v=vs.85).aspx



  • Die 64 Frage:

    Eigentlich sollte es mit IsWow64Process() Funktion gehen.

    BOOL IsWow64(HANDLE hProcess)
      {
      BOOL bIsWow64 = FALSE;
    
      fnIsWow64Process = (LPFN_ISWOW64PROCESS) GetProcAddress(
            GetModuleHandle(TEXT("kernel32")),"IsWow64Process");
    
      if(NULL != fnIsWow64Process) {
         if(hProcess == NULL ) hProcess = GetCurrentProcess()
         if(!fnIsWow64Process(hProcess, &bIsWow64)) {
                //handle error
         }
      }
      return bIsWow64;
    }
    

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



  • merano schrieb:

    Die 64 Frage:

    Eigentlich sollte es mit IsWow64Process() Funktion gehen.

    BOOL IsWow64(HANDLE hProcess)
      {
      BOOL bIsWow64 = FALSE;
    
      fnIsWow64Process = (LPFN_ISWOW64PROCESS) GetProcAddress(
            GetModuleHandle(TEXT("kernel32")),"IsWow64Process");
    
      if(NULL != fnIsWow64Process) {
         if(hProcess == NULL ) hProcess = GetCurrentProcess()
         if(!fnIsWow64Process(hProcess, &bIsWow64)) {
                //handle error
         }
      }
      return bIsWow64;
    }
    

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

    Also dass lässt sich sicher nicht compilieren!



  • Naja, bis auf die Variablendeklaration, das typedef (und das Semikolon) ...

    Oder soll ich es auch noch in Geschenkpapier einpacken ?



  • Ein Snippet aus meiner Library zu 1:

    int berry::process::bitness() const
    {
        ASSERT_PROCESS();
    
        // First check if we are on a 64bit Windows, else its always 32bit.
        if(!::GetSystemWow64DirectoryW(nullptr, 0))
        {
            if(GetLastError() == ERROR_CALL_NOT_IMPLEMENTED)
                return 32;
        }
    
        // Check the Wow64 state.
        ::BOOL is_wow64;
        if(!::IsWow64Process(m_data.handle, &is_wow64))
        {
            std::error_code error(::GetLastError(), std::system_category());
            throw std::system_error(error,
                "berry::process::bitness : ::IsWow64Process failed");
        }
    
        // If the process is running under Wow64, it's 32bit for sure.
        return is_wow64 ? 32 : 64;
    }
    


  • Microsoft schreibt nicht ohne Grund:

    IsWow64Process is not available on all supported versions of Windows.
    

    Wo ist der Rest der benötigten Teile aus der Klasse ?

    Mit VS2005 kompiliert kommt sowas raus:

    iswow64proc.cpp(10) : error C3861: "ASSERT_PROCESS": Bezeichner wurde nicht gefunden.
    iswow64proc.cpp(13) : error C2065: 'nullptr': nichtdeklarierter Bezeichner
    iswow64proc.cpp(21) : error C2065: 'm_data': nichtdeklarierter Bezeichner
    iswow64proc.cpp(21) : error C2228: Links von ".handle" muss sich eine Klasse/Struktur/Union befinden.
    iswow64proc.cpp(23) : error C2653: 'std': Keine Klasse oder Namespace
    iswow64proc.cpp(23) : error C2065: 'error_code': nichtdeklarierter Bezeichner
    iswow64proc.cpp(23) : error C2146: Syntaxfehler: Fehlendes ';' vor Bezeichner 'error'
    iswow64proc.cpp(23) : error C2653: 'std': Keine Klasse oder Namespace
    iswow64proc.cpp(23) : error C3861: "error": Bezeichner wurde nicht gefunden.
    iswow64proc.cpp(23) : error C3861: "system_category": Bezeichner wurde nicht gefunden.
    iswow64proc.cpp(24) : error C2653: 'std': Keine Klasse oder Namespace
    iswow64proc.cpp(24) : error C3861: "system_error": Bezeichner wurde nicht gefunden.
    

    Und schliesslich war die Frage wie man das für einen anderen als den eigenen
    Process rausbekommt z.B. mit einer Process-ID.



  • Mal abgesehen davon, dass man sich an meranos Link/Code orientieren sollte: Warum ein int als Rückgabewert, wenn dieser Werte von 32 oder 64 sein kann?
    Oder plantst du schon die schnelle Portierung auf 128/256/512 Bit Versionen von Windows 😃 ?
    Vielleicht sollte er dann eher als unsigned oder gleich als size_t deklariert werden 😃 .



  • merano schrieb:

    Microsoft schreibt nicht ohne Grund:

    IsWow64Process is not available on all supported versions of Windows.
    

    Ab XP funktioniert es. XP ist knappe 10 Jahre alt und wird bereits nicht mehr von Microsoft unterstützt. Wieso sollte man dann Versionen unterstützen, die einfach gnadenlos outdated sind? Win2k ? Win98? Win95? Ich bitte dich.

    Wo ist der Rest der benötigten Teile aus der Klasse ?
    Mit VS2005 kompiliert kommt sowas raus:

    iswow64proc.cpp(10) : error C3861: "ASSERT_PROCESS": Bezeichner wurde nicht gefunden.
    iswow64proc.cpp(13) : error C2065: 'nullptr': nichtdeklarierter Bezeichner
    iswow64proc.cpp(21) : error C2065: 'm_data': nichtdeklarierter Bezeichner
    iswow64proc.cpp(21) : error C2228: Links von ".handle" muss sich eine Klasse/Struktur/Union befinden.
    iswow64proc.cpp(23) : error C2653: 'std': Keine Klasse oder Namespace
    iswow64proc.cpp(23) : error C2065: 'error_code': nichtdeklarierter Bezeichner
    iswow64proc.cpp(23) : error C2146: Syntaxfehler: Fehlendes ';' vor Bezeichner 'error'
    iswow64proc.cpp(23) : error C2653: 'std': Keine Klasse oder Namespace
    iswow64proc.cpp(23) : error C3861: "error": Bezeichner wurde nicht gefunden.
    iswow64proc.cpp(23) : error C3861: "system_category": Bezeichner wurde nicht gefunden.
    iswow64proc.cpp(24) : error C2653: 'std': Keine Klasse oder Namespace
    iswow64proc.cpp(24) : error C3861: "system_error": Bezeichner wurde nicht gefunden.
    

    Ich habe dem Leser ein Mindestmaß an Selbstständigkeit zugeschrieben. Dass man fremde Fehlerbehandlung nicht übernehmen kann (vor allem wenn sie C++11 erfordert und man nen Compiler mit Bart hat) sollte klar sein, dass man Assert-Routinen nicht zwingend übernehmen kann und dass man sein eigenes Prozess-Handle einfügen sollte, halte ich für verständlich.

    Und schliesslich war die Frage wie man das für einen anderen als den eigenen
    Process rausbekommt z.B. mit einer Process-ID.

    Die TE hat offensichtlich eine Liste aller Prozesse mit Hilfe der Tlhelp32-API erhalten. Wenn man jetzt einfach nur eine der WinAPI-Calls auf der MSDN nachschlägt, sieht man sofort

    A handle to the process. The handle must have the PROCESS_QUERY_INFORMATION or PROCESS_QUERY_LIMITED_INFORMATION access right. For more information, see Process Security and Access Rights.

    Mit meinem Post wollte ich einen schönen Lösungsweg aufzeigen und keine fertige Lösung abliefern. 2 Minuten Eigeninitiative wird man ja wohl noch verlangen dürfen.

    Wie du selbst sagtest:

    Oder soll ich es auch noch in Geschenkpapier einpacken ?

    Mal abgesehen davon, dass man sich an meranos Link/Code orientieren sollte: Warum ein int als Rückgabewert, wenn dieser Werte von 32 oder 64 sein kann?
    Oder plantst du schon die schnelle Portierung auf 128/256/512 Bit Versionen von Windows 😃 ?
    Vielleicht sollte er dann eher als unsigned oder gleich als size_t deklariert werden 😃 .

    Es gibt eben auf x86/amd64 keinen Grund hier einen kleineren Integer zu verwenden. Man verbaut sich den selben Speicherplatz und 8/16 bit-Operationen sind geringfügig ineffizienter.



  • Ethon schrieb:

    merano schrieb:

    Microsoft schreibt nicht ohne Grund:

    IsWow64Process is not available on all supported versions of Windows.
    

    Ab XP funktioniert es. XP ist knappe 10 Jahre alt und wird bereits nicht mehr von Microsoft unterstützt. Wieso sollte man dann Versionen unterstützen, die einfach gnadenlos outdated sind? Win2k ? Win98? Win95? Ich bitte dich.

    Natürlich kann man sagen ist zu alt; geht halt nicht mehr. Allerdings bin ich
    der Meinung das man das nicht ohne Not so handhaben sollte. Solange es möglich
    ist Software mit geringem Aufwand so zu schreiben, das sie auch auf älteren Installationen läuft sollte man das auch machen.


Anmelden zum Antworten