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