Zitat von
thkerkmann:
meiner Meinung nach müssen die Handles sogar lokal sein. Sie gehören dem Prozess, der den Hook (in der
dll) installiert, damit er sich daraus wieder verabschieden kann. Global muss also nicht das
Handle sein, sondern die HookProcedure muss global zur Verfügung gestellt werden - und das geht eben über die
dll.
Meinung zaehlt nicht sondern nur die Realitaet.
Das Problem ist der Aufruf von NextHookEx. DLLs in verschiedenen Prozessen sind immer in Kopie geladen.
Die Datensegmente werden nie kopiert. Nur eine der Kopien hat daher eine von SetWindowsHookEx mit einem Wert versehene Hook-Variable und diese wird nun mal in allen Kopien fuer NextHookEx gebraucht.
Zitat von
thkerkmann:
Die
dll wird bei systemweiten Hooks nämlich nicht mit der Beendigung deines Programmes entladen, sondern erst, wenn keine Ereignisse mehr über sie laufen, d.h. ALLE Prozesse, die in die Hook-Kette eingeklinkt sind, beendet wurden. Im spätesten Fall erst beim Windows beenden.
Quatsch. Da die
DLL pro Prozess separat geladen wird, wird sie einfach mit dem Prozess entladen und faellt aus der Verwaltung fuer die Hook-Chain.
Ruft man UnhookWindowsHookEx auf so wird die Hook-Chain sprich die Funktionsaufrufe aufgegeben. 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).