Da es nur Hooks innerhalb Deiner Anweisung und nicht systemweit sein müssen, hält sich der Streß in Grenzen, denke ich
Schaue Dir mal die
executehook.zip hier an. Davon brauchst Du quasi nur die
HookUnit.pas, bzw. sogar nur einzelne Funktionen daraus (nämlich FinalFunctionAddress und PatchAddress).
Grob gesagt, machst Du ein:
Code:
type
TMessageBoxA = function(hWnd: HWND; lpText, lpCaption: PAnsiChar; uType: UINT): Integer; stdcall;
TMessageBoxW = function(hWnd: HWND; lpText, lpCaption: PWideChar; uType: UINT): Integer; stdcall;
var
OldMessageBox: TOldMessageBoxA; // unter DXE: *W
OldMessageBoxA: TOldMessageBoxA;
OldMessageBoxW: TOldMessageBoxW;
...
procedure NewMessageBoxA(hWnd: HWND; lpText, lpCaption: PAnsiChar; uType: UINT): Integer; stdcall;
begin
// log message to some kind of log instead.
// to display message box, call OldMessageBoxA here.
end;
procedure NewMessageBoxW(hWnd: HWND; lpText, lpCaption: PWideChar; uType: UINT): Integer; stdcall;
begin
// log message to some kind of log instead.
// to display message box, call OldMessageBoxA here.
end;
...
initialization
@OldMessageBox := FinalFunctionAddress(MessageBox);
@OldMessageBoxA := FinalFunctionAddress(MessageBoxA);
@OldMessageBoxW := FinalFunctionAddress(MessageBoxW);
PatchAddress(@OldMessageBox, @NewMessageBox);
PatchAddress(@OldMessageBoxA, @NewMessageBoxA);
PatchAddress(@OldMessageBoxW, @NewMessageBoxW);
finalization
PatchAddress(@NewMessageBox, @OldMessageBox);
PatchAddress(@NewMessageBoxA, @OldMessageBoxA);
PatchAddress(@NewMessageBoxW, @OldMessageBoxW);
end;
Das ist jetzt kein getesteter Code, sondern nur per copy'n'paste an Deine Situation angepasst, damit Du das Schema versteht. Ich arbeite inzwischen mit madCodeHook, kann mich daher nur noch grob erinnern, wie diese Methode ging.