Hook wird nicht gesetzt, wieso?



  • tag'chen.
    ich wollte mich eigentlich erst mal an etwas ganz leichtes ran machen, und zwar mit einen hook die WM_QUIT message eines processes abfangen.
    hier mal die DLL.

    /*******************************************************************************
    
        File    : funcDLL.cpp
        Remark  : This file contains definitions of hook function.
    
    *******************************************************************************/
    
    //--- Includes -----------------------------------------------------------------
    
    #include <windows.h>
    #include "funcDLL.h"
    
    //--- Globals ------------------------------------------------------------------
    
    #pragma argsused
    HINSTANCE hDLLInst;
    HHOOK hHook;
    
    //--- Prototypes ---------------------------------------------------------------
    
    LRESULT CALLBACK MessageProc( int, WPARAM, LPARAM );
    
    //--- DllMain ------------------------------------------------------------------
    
    BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fwdreason, LPVOID lpvReserved) {
    
        switch( fwdreason ) {
    
            case DLL_PROCESS_ATTACH: {
    
                hDLLInst = hinstDLL;
                break;
            }
    
            case DLL_THREAD_ATTACH: {
    
                break;
            }
    
            case DLL_PROCESS_DETACH: {
    
                break;
            }
    
            case DLL_THREAD_DETACH: {
    
                break;
            }
        }
        return true;
    }
    
    //--- Definition ---------------------------------------------------------------
    
    LRESULT CALLBACK MessageProc( int nCode, WPARAM wParam, LPARAM lParam ) {
    
        MSG *msg = (MSG*)lParam;
    
        switch( msg->message ) {
    
            case WM_QUIT: {
    
                MessageBox( 0, "WM_QUIT was hooked :)", "Atantion!", MB_OK | MB_ICONERROR );
                break;
            }
        }
        return( CallNextHookEx( hHook, nCode, wParam, lParam ) );
    }
    
    EXPORT bool setHook( DWORD processID ) {
    
        hHook = SetWindowsHookEx( WH_GETMESSAGE, (HOOKPROC)MessageProc, hDLLInst, processID );
    
        if( !hHook ) {
    
            return false;
        }
        return true;
    }
    
    EXPORT bool removeHook( ) {
    
        if( ( UnhookWindowsHookEx( hHook ) ) == 0 ) {
    
            return false;
        }
        return true;
    }
    
    //--- EXIT ---------------------------------------------------------------------
    

    und hier die anwendung die den hook in einem anbderen setzen soll

    //--- Includes -----------------------------------------------------------------
    
    #include <windows.h>
    #include <iostream>
    #include <conio.h>
    #include "funcDLL.h"
        using namespace std;
    
    //--- Globals ------------------------------------------------------------------
    
    #pragma hdrstop
    #pragma argsused
    
    #define ESCAPE 27
    
    char szWindowName[ 128 ];
    HWND hWnd;
    DWORD dwProcessID;
    int vKey;
    
    //--- Prototypes ---------------------------------------------------------------
    
    //--- Main ---------------------------------------------------------------------
    
    int main(int argc, char* argv[]) {
    
        cout << " Enter the name of running window, which you want to hook!" << endl;
        cout << " WindowName :  ";
        cin.getline( szWindowName, sizeof( szWindowName ) );
    
        hWnd = FindWindow( 0, szWindowName );
        if( !hWnd ) {
    
            cout << "\n\n Couldn't found window named \"" << szWindowName << "\".";
            Sleep( 2000 );
            return 0;
        }
    
        GetWindowThreadProcessId( hWnd, &dwProcessID );
    
        if( (setHook( dwProcessID ) ) ) {
    
            cout << "\n\n The MessageHook was successful loaded in process of \"" << szWindowName << "\".";
        }
        else {
    
            cout << "\n\n Hooking failed!";
            Sleep( 2000 );
            return 0;
        }
    
        cout << "\n\n To unhook the prcoess press escape ...";
        do {
    
            if( kbhit( ) ) {
    
                vKey = getch( );
            }
    
        } while( vKey != ESCAPE );
    
        if( ( removeHook( ) ) ) {
    
            cout << "\n\n The MessageHook was successful removed from process of \"" << szWindowName << "\".";
        }
        else {
    
            cout << "\n\n The MessageHook couldn't successfully removed from process of \"" << szWindowName << "\".";
        }
        Sleep( 2000 );
        return 0;
    }
    
    //--- Definitions --------------------------------------------------------------
    
    //--- EXIT ---------------------------------------------------------------------
    

    also das problem ist: er fliegt IMMER bei "Hooking failed " raus.
    GetLastError() sagt, "Falscher Parameter"
    die dll lade ich statisch ins project, die dllmain wird auch durchlaufen

    ich weiss echt nicht wo es hackt...

    Gruß Tobi.



  • *s.c.h.i.e.b*



  • kann mir hier keiner helfen oder will niemand?



  • Ideen?


  • Mod

    Wenn WM_QUIT gesendet wurde, wird dein MessageBox nicht mehr aufgehen. In dem Moment in dem PostQuitMessage ausgeführt wurde werden keine weiteren Fenster mehr erzeugt. Die MessageBox verpufft also ohne Wirkung.

    Es kann auch folgendes zutreffen:
    WM_QUIT nicht in die MessageProc geschoben, sondern es wird ein Flag gesetzt. Dadurch returniert GetMessage WM_QUIT!



  • hi martin,
    ja das ist aber im moment nicht das problem. der hook wird gesetzt wenn ich es Global fuer alle process mache, ABER NICHT FUER EIN BESTIMMTEN PROCESS!
    wieso kommt immer nen fehler das der hook fuer ein bestimmtes programm nicht gesetzt werden konnte?

    Gruß Tobi.



  • Habe den Code jetzt nicht getestet, aber wenn ich das in der PSDK auf die Schnelle richtig gelesen habe, wird im Funktionsaufruf SetWindowsHookEx folgender Parameter dein Problem sein:

    hMod
    [in] Handle to the DLL containing the hook procedure pointed to by the lpfn parameter. The hMod parameter must be set to NULL if the dwThreadId parameter specifies a thread created by the current process and if the hook procedure is within the code associated with the current process.



  • nein, das ist es auch nicht. habs schon versucht. passiert trotzdem nichts.



  • Du übergibst eine process ID wo du eine thread ID übergeben solltest.
    Bissi MSDN gucken schadet meist nicht.



  • also mit GetThreadId(), ok werds zu hause mal ausprobieren, danke.

    Gruß Tobi.


  • Mod

    Ich sehe keinen Fehler in Deinem Code.

    Ich bin mir nichtganz sicher was hustbaer meint.
    Du besorgst Dir korrekt die Process ID des Fensters.

    Was ich allerdings nicht sehe:
    Um einen globalen Hook zu installieren muss auch die hHook Information an den anderen Prozess über shared memory weitergeben werden. So kann das nicht gehen!



  • Martin Richter schrieb:

    Ich bin mir nichtganz sicher was hustbaer meint.
    Du besorgst Dir korrekt die Process ID des Fensters.

    Also er verwendet SetWindowsHookEx. Die Doku zu SetWindowsHookEx sagt der letzte Parameter ist ne thread ID, nicht eine process ID.
    Ich denke schon dass das nen Unterschied macht... nicht?

    Auf jeden Fall wüsste ich nicht wieso das gehen sollte/müsste wenn man eine process ID anstelle einer thread ID übergibt.



  • Frage: ein process kann doch mehrere threads haben, dem zu folge auch mehrere threadIDs, welche nemm ich?


  • Mod

    hustbaer schrieb:

    Martin Richter schrieb:

    Ich bin mir nichtganz sicher was hustbaer meint.
    Du besorgst Dir korrekt die Process ID des Fensters.

    Also er verwendet SetWindowsHookEx. Die Doku zu SetWindowsHookEx sagt der letzte Parameter ist ne thread ID, nicht eine process ID.
    Ich denke schon dass das nen Unterschied macht... nicht?

    Auf jeden Fall wüsste ich nicht wieso das gehen sollte/müsste wenn man eine process ID anstelle einer thread ID übergibt.

    Du hast recht. Ich war auf dem Holzweg. Tut mir leid für die Fehlinfo...



  • meine frage ??!"!!



  • T0bi schrieb:

    Frage: ein process kann doch mehrere threads haben, dem zu folge auch mehrere threadIDs, welche nemm ich?

    Ich würde es mal mit der ID des Threads versuchen der die Nachrichten des Fensters abarbeitet an dem du interessiert bist.

    Das ist im übrigen der Returnwert von GetWindowThreadProcessId, also so:

    //GetWindowThreadProcessId( hWnd, &dwProcessID ); 
    dwThreadID = GetWindowThreadProcessId( hWnd, 0 );
    

    Der Hook gilt dann aber natürlich auch nur für den einen Thread, für einen ganzen Prozess geht es nicht - entweder global (alle Threads, alle Prozesse) oder nur für einen Thread.



  • ok so hab ich das auch schon ausprobiert.... hat aber immer noch nicht funktioniert.
    Wieso geht das nicht 😡 😡 😡

    Gruß Tobi.



  • *schieb* also wieso genau klappt das net?


Anmelden zum Antworten