Einzelnen Beitrag anzeigen

originalhanno

Registriert seit: 20. Feb 2006
33 Beiträge
 
#15

Re: warum HookHandle global machen?

  Alt 18. Apr 2006, 13:10
Hallo zusammen,

Zitat von Robert Marquardt:
Ob die DLLs entladen werden oder ob Windows sie einfach als Zombies stehen laesst weiss ich nicht. Da sie nun funktionslos sind ist das ja theoretisch egal (praktisch sind Hooks Angriffsvektoren fuer allerlei Sauereien).
Zitat:
You can release a global hook procedure by using UnhookWindowsHookEx, but this function does not free the DLL containing the hook procedure. This is because global hook procedures are called in the process context of every application in the desktop, causing an implicit call to the LoadLibrary function for all of those processes. Because a call to the FreeLibrary function cannot be made for another process, there is then no way to free the DLL. The system eventually frees the DLL after all processes explicitly linked to the DLL have either terminated or called FreeLibrary and all processes that called the hook procedure have resumed processing outside the DLL.

An alternative method for installing a global hook procedure is to provide an installation function in the DLL, along with the hook procedure. With this method, the installing application does not need the handle to the DLL module. By linking with the DLL, the application gains access to the installation function. The installation function can supply the DLL module handle and other details in the call to SetWindowsHookEx. The DLL can also contain a function that releases the global hook procedure; the application can call this hook-releasing function when terminating.
Ich hoffe das hilft

Nun aber noch mal zu den Kopien des Datenteils:
frisch ausgeschlafen habe ich dein posting noch mal gelesen.
Ich denke, das ich mich nicht 100% klar ausgedrückt habe, und wir deshalb aneinander vorbeigeredet haben.
Also:
Soweit ich das verstanden habe, ist es so:
- Die DLL wird injected -> sie wird 1 mal vom Betriebssystem (BS) geladen
- Prozess A wird gestartet -> A legt extra Speicher an, aber nur für den Datenteil der DLL
- Prozess B wird gestartet -> B legt extra Speicher an, aber nur für den Datenteil der DLL
- A + B greifen gemeinsam auf den Programmteil der DLL zu
- A + B haben einen getrennten Datenteil, jeder hat seinen eigenen

Wenn nun A + B Daten gemeinsam nutzen wollen, müssen die das z.B. über shared segments tun.

Ist das soweit richtig?

Nun kommt der zweite Teil:
- Die DLL wird durch Aufruf von InstallHooks (ich bleib mal bei meinem Beispiel oben) installiert, also injected.
- Nur hier wird hMouseHook initialisiert, also mit der Adresse von MouseHookProc belegt.
- Wenn nun diese Variable lokal gehalten wird, also im separaten Datenteil jedes Prozesses, woher soll dann Prozess A wissen, welche Adresse in hMouseHook steht?
Die Adresse übergibt A aber an "CallNextHookEx(hMouseHook, nCode, wParam, lParam)".
Genauso natürlich Prozess B.
Soweit also für mich einsichtig, dass man globale "Variablen" braucht.

ABER:
Wieso in aller Welt funktioniert mein Programm dann auch, wenn ich die Variable hMousHook nicht in ein shared segment lege?

Für eine Antwort auf besonders diese Frage währe ich sehr dankbar.

@ thkerkmann:
Ich habe auch in der MSDN nix von globalen Variablen gelesen. Mir erscheint es jedoch wie oben beschrieben am logischsten.


Danke nochmals für die grauen Zellen



  Mit Zitat antworten Zitat