Problem mit globalem Mouse-Hook/DLL-Load



  • Hi alle miteinander. Ich habe folgendes Problem: Ich möchte mir anhand eines Tutorials einen globalen Mouse-Hook erstellen und diesen für ein Pipettenprogramm benutzen. Doch anscheinend scheitert das Programm schon an zwei einfachen Dingen. Das ist meine DLL:

    HHOOK g_hMouseHook SHARED  = NULL;
    HINSTANCE g_hInstanceDll SHARED = NULL;
    
    bool WINAPI DllMain(HINSTANCE hInstanceDll, DWORD dwReason, LPVOID lpvReserved)
    {
        g_hInstanceDll = hInstanceDll;
    
        return true;
    }
    
    DLL_EXPORT bool InstallHook()
    {
        if (g_hMouseHook != NULL)
            return true;
    
        if ((g_hMouseHook = SetWindowsHookEx(WH_MOUSE, MouseProc, g_hInstanceDll, 0)) == NULL)
        {
            return false;
        }
    
        return true;
    }
    
    DLL_EXPORT bool UninstallHook()
    {
        if (g_hMouseHook == NULL)
            return true;
    
        if (!UnhookWindowsHookEx(g_hMouseHook))
            return false;
        g_hMouseHook = NULL;
        return true;
    }
    
    LRESULT CALLBACK MouseProc(int nCode, WPARAM wParam, LPARAM lParam)
    {
        if (nCode < 0)
            return CallNextHookEx(g_hMouseHook, nCode, wParam, lParam);
    
        if (nCode == HC_ACTION)
        {
            if (wParam == WM_LBUTTONDOWN || wParam == WM_NCLBUTTONDOWN)
            {
                LPMOUSEHOOKSTRUCT mhs = (LPMOUSEHOOKSTRUCT) lParam;
                HWND hCallingWindow = FindWindow("pipette", NULL);
                PostMessage(hCallingWindow, WM_USER+123, 0, MAKELPARAM(mhs->pt.x, mhs->pt.y));
            }
        }
        return CallNextHookEx(g_hMouseHook, nCode, wParam, lParam);
    }
    

    Das hier der dazugehörige Header:

    #ifndef __MAIN_H__
    #define __MAIN_H__
    
    #include <windows.h>
    
    /*  To use this exported function of dll, include this header
     *  in your project.
     */
    
    #ifdef BUILD_DLL
        #define DLL_EXPORT __declspec(dllexport)
    #else
        #define DLL_EXPORT __declspec(dllimport)
    #endif
    
    #ifndef __cplusplus
    extern "c"
    {
    #endif
    
    //Definitions for the use of shared variables
    
    #define SHARED __attribute__((section(".shr"), shared))
    
    //Forward Declarations here//
    DLL_EXPORT bool InstallHook();
    DLL_EXPORT bool UninstallHook();
    
    LRESULT CALLBACK MouseProc(int, WPARAM, LPARAM);
    
    #ifndef __cplusplus
    }
    #endif
    
    #endif // __MAIN_H__
    

    Soviel dazu. Das erste Problem tut sich beim Laden der Library auf. Ich hab die DLL, die beim Basteln dieses Projektes entstand in denselben Ordner gepackt, wie die Anwendung, von der ich hier einen kleinen Ausschnitt habe:

    if ((hInstanceToDll = LoadLibrary("HookingTutorials_easy.dll")) == NULL)
                throw std::string("Fehler in der Funktion LoadLibrary.");
            if ((InstallHook = (MYFUNC)GetProcAddress(hInstanceToDll, "InstallHook")) == NULL)
                throw std::string("Fehler bei GetProcAddress (InstallHook nicht gefunden)" + ConvertToString(GetLastError()));
            if ((UninstallHook = (MYFUNC)GetProcAddress(hInstanceToDll, "UninstallHook")) == NULL)
                throw std::string("Fehler bei GetProcAddress (UninstallHook nicht gefunden)");
    

    Das Laden mit LoadLibrary klappt ohne Probleme, doch bei

    InstallHook = (MYFUNC)GetProcAddress(hInstanceToDll, "InstallHook")
    

    springt er in die Exception mit dem Fehler-Code 127 (Modul nicht gefunden). Er findet die Funktion also nicht in der DLL, warum nicht?
    Habs dann über die .a Datei, die bei mir auch noch beim basteln entsteht unter den Eigenschaften meines Compilers gelinkt und dann funktionierts (Ohne LoadLibrary versteht sich). Doch das nächste Problem trat gleich darauf auf:

    if (!InstallHook())
                                        throw std::string((INSTALLHOOK_ERROR + ConvertToString(GetLastError())));
    

    Auch hier springt er in die Exception mit dem Error-Code 1438 (Kann keinen globalen Hook ohne Modul-Handle setzen). Was ist das Problem?

    Sry wenn ich meine Fragen schlecht formuliert habe ^^' bin noch recht neu im Hook-Metier :x
    Danke schonmal für die Antworten.



  • Sry für Doppelpost, aber kann nicht editieren.
    Nachdem ich mich auf MSDN ein wenig schlau gemacht habe, was ich bei GetProcAddress genau angeben muss und mir meine DLL mit IDA angeschaut habe, hab ich das erste Problem mit dem Fehler bei GetProcAddress behoben, denn meine Funktion heißt nicht InstallHook, sondern Windows oder wer auch immer ändert den Namen in _Z11InstallHookv. Mein GetProcAddress sieht jetzt wie folgt aus und funktioniert wie gedacht:

    if ((hInstanceToDll = LoadLibrary("HookingTutorials_easy.dll")) == NULL)
                throw std::string(LOADLIBRARY_ERROR);
            if ((pInstallHook =  BOOL_CALLBACK_VOID_CAST GetProcAddress(hInstanceToDll, "_Z11InstallHookv"))== NULL)
                throw std::string(GETPROCADDRESS_ERROR + ConvertToString(GetLastError()));
            if ((pUninstallHook = BOOL_CALLBACK_VOID_CAST GetProcAddress(hInstanceToDll, "_Z13UninstallHookv")) == NULL)
                throw std::string(GETPROCADDRESS_ERROR);
    

    Das Problem mit dem setzen des Hooks besteht allerdings immernoch. Folgende Funktion gibt immernoch false zurück:

    bool __declspec(dllexport) InstallHook()
    {
        if (g_hMouseHook != NULL)
            return true;
    
        if ((g_hMouseHook = SetWindowsHookEx(WH_MOUSE, MouseProc, g_hInstanceDll, 0)) == NULL)
        {
            return false;
        }
    
        return true;
    }
    

    g_hMouseHook ist eine Globale Variable von Typ HHOOK und MouseProc ist eine Globale Funktion vom Typ LRESULT CALLBACK (*) (int, WPARAM, LPARAM)
    Wo liegt mein Fehler? Programm auch schon als Admin ausgeführt und die g_hMouseHook als

    __attribute__((section(".shr"), shared))
    

    markiert. Was mach ich falsch?



  • Probelm gelöst. Kann geschlossen werden.



  • Ich bin Matrix... schrieb:

    Probelm gelöst. Kann geschlossen werden.

    Und das Problem hast du wie gelöst?



  • Das Problem lag darin, dass ich Hook im selben Modul erstellt habe, wo sich auch die Hook-Funktion befand (Nehm ich zumindest an, dass es daran lag). Hab mir jetzt eine kleine Klasse geschrieben, die sich um meinen Hook kümmert und diese in den Header der Exe-Datei gepackt. Dann ist der HOOKPROC in der Dll und die Install-&UninstallHook Funktionen in der Exe.



  • Ja wahrscheinlich 😕 🙄



  • Was ist dein Problem jetzt?


Anmelden zum Antworten