Einzelnen Beitrag anzeigen

Benutzerbild von stoxx
stoxx

Registriert seit: 13. Aug 2003
1.111 Beiträge
 
#42

Re: Subclassing einer fremden Application, warum funzt das n

  Alt 11. Nov 2003, 01:58
Hallo Hagen,

hab zwar noch nicht das Gefühl, dass ich das wirklich allein hinbekomme .. habe aber dennoch schonmal angefangen, Deinen Pseudocode umzuwandeln

Bis hierin bin ich gekommen, lässt sich aber nicht compilieren.

Bei dem Assembler Code sagt er mir in Zeile: JMP [EAX].VirtualFree
"Ungültige Kombination von Opcode und Operanden". ?

Hier der Quelltext:


Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type

  PHookData = ^THookData;
  THookData = packed record
    SaveWindowProc: Pointer;
    hWnd: HWnd;
    GetWindowLong: function(hWnd : HWND; nIndex : INTEGER ): LongInt; stdcall;
    SetWindowLong: function(hWnd : HWND; nIndex : INTEGER; wNewLong : LongInt): LongInt; stdcall;
    ExitThread: procedure(dwExitCode : DWORD); stdcall;
    CallWndProc: function(lpPrevWndFunc : TFNWndProc; hWnd: HWND; Msg: WORD; wParam: WPARAM; lParam: LPARAM): lResult; stdcall;
    VirtualFree: function(lpAddress : Pointer; dwSize : DWORD; dwFreeType : DWORD) : bool; stdcall; // richtige Parameter ?
    WindowProc: array[0..0] of Byte; // hier wird MyWndProc rein kopiert
    ThreadCode: array[0..0] of Byte; // hier wird ThreadProc hineinkopiert
  end;



  TForm1 = class(TForm)
    Button1: TButton;
  private

  public

  end;



var
  Form1: TForm1;

implementation

{$R *.dfm}


function MyWndProc(hWnd: HWND; Msg: WORD; wParam: WPARAM; lParam: LPARAM): lResult; stdcall;
var
  Memory: PHookData;
begin
  asm
     CALL @@1
@@1: POP EAX
     AND EAX,$FFFFF000 // align
     MOV Memory,EAX
  end;
  if Msg = wm_Destroy then
  begin
    Memory.CallWndProc(Memory.SaveWindowProc, hWnd, Msg, wParam, lParam);

// hier Memory freigeben, wichtig dabei das der aktuelle Code ja in diesem Memory^ liegt
// wir müssen also die Reücksrungadresse aus dem Stack holen. Dann Memory auf den Stack pushen
// danach Rücksrungadresse pushen und einem Jump nach VirtualFree() durchführen.
// Somit kehrt VirtualFree NICHT in unseren nun freigegebene Memory zurück, sondern zum
// Aufrufer von MyWndProc().
    asm
      POP EDX
      MOV EAX,Memory
      PUSH EAX
      PUSH EDX
      JMP [EAX].VirtualFree
    end;
  end else
    if Msg = wm_Close then
    begin
    end else
      Result := Memory.CallWndProc(Memory.SaveWindowProc, hWnd, Msg, wParam, lParam);
end;




end.
  Mit Zitat antworten Zitat