AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Verständnisfrage zu SetWindowsHookEx und CallNextHookEx
Thema durchsuchen
Ansicht
Themen-Optionen

Verständnisfrage zu SetWindowsHookEx und CallNextHookEx

Ein Thema von SirThornberry · begonnen am 12. Jun 2007 · letzter Beitrag vom 7. Mär 2008
Antwort Antwort
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#1

Verständnisfrage zu SetWindowsHookEx und CallNextHookEx

  Alt 12. Jun 2007, 16:14
Hallo,

Wenn man mit SetWindowsHookEx einen Hook installiert bekommtman ja ein Hookhandle zurück geliefert und die HookProcedure wird in jeden Prozess geladen (inclusive dll)?! (ich hoffe das ist nicht schon die erste stelle wo ich mich irre).

In der HookProcedure ist es ja laut Hilfe dann des öfteren nötige bzw. wird dringend empfohlen, die Funktion CallNextHookEx aufzurufen welche eben das HookHandle haben will. Aber woher bekomm ich das Handle, schließlich hab ich das ja nur innerhalb der DLL-Instanz in der ich den Hookinstalliere, oder?
Delphi-Quellcode:
library APIHook;

uses
  Windows;

var
  HookHandle: THandle;

function HookProc(code: Integer; ALParam: Integer; AWParam: Integer): Integer; stdcall;
begin
  //kann ich hier auf HookHandle zugreifen? Eigentlich ist dieses doch nur in der DLL-Instanz initialisiert in welcher der Hook instanziert wurde.
  result := CallNextHookEx(HookHandle, ALParam, AWParam);
end;

//diese funktion wird nur in im Prozess aufgerufen der den Hook installiert?!
procedure StartHook; stdcall;
begin
  //Da die Funktion nur dem Prozess aufgerufen wird welche den Hook installiert sollte HookHandle ja auch nur in diesem Prozess verfügbar sein bzw. initialisiert sein
  HookHandle := SetWindowsHookEx(WH_GETMESSAGE, @GetMsgProc, HInstance, 0);
end;

procedure StopHook; stdcall;
begin
  UnhookWindowsHookEx(HookHandle);
  UnHookFunctions;
end;

exports
  StartHook,
  StopHook;

begin
  HookFunctions;
end.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#2

Re: Verständnisfrage zu SetWindowsHookEx und CallNextHookEx

  Alt 12. Jun 2007, 16:16
Das ist genau der Punkt bei globalen Hooks. Der Hook-Handle muss in allen Kopien der DLL zugreifbar sein. Bei Visual C++ kann man per Pragma die Variable in ein shared Segment bugsieren. Bei Delphi nutzt man ma einfachsten ein Memory Mapped File.
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#3

Re: Verständnisfrage zu SetWindowsHookEx und CallNextHookEx

  Alt 12. Jun 2007, 16:23
ok
Daraus ergibt sich das nächste Problem (vielleicht seh ich das auch einfach nru schlimmer als es ist):
Und war ist der Hook ja aktiv sobald die Funktion SetWindowsHookEx abgearbeitet wurde, also auch bevor das Result von SetWindowsHookEx in meiner Variablen bzw. einem MemoryMappedFile steckt. Das ist zwar nur im Bruchteil von Millisekunden so aber letztendlich ist dadurch ja für kurze Zeit das HookHandle undefiniert und kann nicht verwendet werden. Gibt es dafür eine Lösung?

[OT]
Wie macht es der C-Compiler möglich das die Variable in allen Prozessen verfügbar ist, wird diese dann auch in einem gemeinsam genutzen Speicherbereich abgelegt?
[/OT]
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#4

Re: Verständnisfrage zu SetWindowsHookEx und CallNextHookEx

  Alt 12. Jun 2007, 16:45
Der Hook ist nicht aktiv bevor die Zuweisung stattgefunden hat. Da passt Windows schon auf.
Visual C++ erlaubt einfach das man in der Programmsource Anweisungen an den Linker platziert. Es wird die Variable in ein eigenes Segment verlagert, statt dem normalen DATA oder BSS. Das Segment bekommt das shared flag und wird damit in alle Kopien der DLL eingeblendet. Das CODE-Segment funktioniert ja genauso. Die DLL-Kopien nutzen natuerlich den Code gemeinsam.
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#5

Re: Verständnisfrage zu SetWindowsHookEx und CallNextHookEx

  Alt 12. Jun 2007, 16:55
Wenn die DLL-Kopien den Code gemeinsam nutzen, wäre es dann nicht auch möglich das ich zur Laufzeit die Hookprocedure patche so dass, das Hookhandle direkt drin steht?
Also:
1.) SetWindowsHookEx aufrufen
2.) die Adresse von der HookProcedure holen
3.) das Hookhandle an das entsprechende Offset bedingt aus der adresse von Schritt schreiben.

Dürfte das nicht auch funktionieren?
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.483 Beiträge
 
Delphi 10.1 Berlin Professional
 
#6

Re: Verständnisfrage zu SetWindowsHookEx und CallNextHookEx

  Alt 12. Jun 2007, 18:41
Nein, denn das CodeSegment ist CopyOnWrite. Das heißt, wenn du etwas daran änderst, wird die Speicherseite in deinen Prozess kopiert und die originale bleibt für die anderen Prozesse erhalten.
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#7

Re: Verständnisfrage zu SetWindowsHookEx und CallNextHookEx

  Alt 12. Jun 2007, 19:40
Es geht aber trotzdem. Bei CodeGear in der Codesammlung steht ein Tool von Petr Vones das nachtraeglich ein Shared Segment einpatcht. ich hab jetzt gerade keine Lust das zu suchen, aber "Petr Vones" und "shared segment" fuer die Suche bei CodeGear sollte es finden.
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#8

Re: Verständnisfrage zu SetWindowsHookEx und CallNextHookEx

  Alt 12. Jun 2007, 19:42
hmm, ich hätte es sonst mit mmf's gelöst.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von bitsetter
bitsetter

Registriert seit: 17. Jan 2007
1.169 Beiträge
 
Turbo Delphi für Win32
 
#9

Re: Verständnisfrage zu SetWindowsHookEx und CallNextHookEx

  Alt 7. Mär 2008, 18:40
Zitat von Robert Marquardt:
Das ist genau der Punkt bei globalen Hooks. Der Hook-Handle muss in allen Kopien der DLL zugreifbar sein. Bei Visual C++ kann man per Pragma die Variable in ein shared Segment bugsieren. Bei Delphi nutzt man ma einfachsten ein Memory Mapped File.
Hallo,

es wird ja sehr oft auf das Mouse- und Tastatur-Hooks Tutorial von Olli verwiesen das würde ja bedeuten, dass der Code nicht ganz korrekt ist. Da er einen globalen Hook installiert, müsste er zum Beispiel mit MMF arbeiten damit auf das korrekte Hook-Handle in allen Kopien der DLL zugegriffen werden kann. Das Hook-Handle wird ja für die Funktion CallNextHookEx() benötigt.
Ansonsten wird das Handle nur innerhalb der DLL-Instanz in der ich den Hook installiere ungleich Null sein.
Gruß bitsetter
"Viele Wege führen nach Rom"
Wolfgang Mocker (geb. 1954), dt. Satiriker und Aphoristiker
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:15 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz