Einzelnen Beitrag anzeigen

Benutzerbild von sh17
sh17

Registriert seit: 26. Okt 2005
Ort: Radebeul
1.643 Beiträge
 
Delphi 11 Alexandria
 
#28

Re: Probleme mit TStrings.IndexOfName unter Vista

  Alt 10. Apr 2007, 19:41
Hallo NetSpy.

Also einen API-Hook für CompareStringW habe ich nicht geschrieben, sondern nur eine Überladung von Delphi-Funktionen. D.h. genauer nutze ich sie jetzt aber nicht, da mir beides wegen der unbekannten Nebenwirkungen zu unsicher ist. Einige unserer Komponenten sind nicht im Quelltext verfügbar. Und was weiss ich, was da passiert.

Wir haben jetzt alle betreffenden Funktionen (z.B. TStringList.IndexOf) noch mal gekapselt. Die Sortierung haben wir sowieso schon immer selbst gemacht.

Hier aber trotzdem das Beispiel zum Überladen einer Funktion:

Delphi-Quellcode:
procedure OverwriteProcedure(OldProcedure, NewProcedure: pointer; Data: POverwrittenData = nil);
{ OverwriteProcedure originally from Igor Siticov }
{ Modified by Jacques Garcia Vazquez }
var
  x: PAnsiChar;
  y: integer;
  ov2, ov: cardinal;
  p: pointer;
begin
  if Assigned(Data) then
  if (Data.Location <> nil) then
    exit; { procedure already overwritten }

  // need six bytes in place of 5
  x := PAnsiChar(OldProcedure);
  if not VirtualProtect(Pointer(x), 6, PAGE_EXECUTE_READWRITE, @ov) then
    RaiseLastOSError;

  // if a jump is present then a redirect is found
  // $FF25 = jmp dword ptr [xxx]
  // This redirect is normally present in bpl files, but not in exe files
  p := OldProcedure;

  if Word(p^) = $25FF then
  begin
    Inc(Integer(p), 2); // skip the jump
    // get the jump address p^ and dereference it p^^
    p := Pointer(Pointer(p^)^);

    // release the memory
    if not VirtualProtect(Pointer(x), 6, ov, @ov2) then
      RaiseLastOSError;

    // re protect the correct one
    x := PAnsiChar(p);
    if not VirtualProtect(Pointer(x), 6, PAGE_EXECUTE_READWRITE, @ov) then
      RaiseLastOSError;
  end;

  if Assigned(Data) then
  begin
    Move(x^, Data.OldCode, 6);
    { Assign Location last so that Location <> nil only if OldCode is properly initialized. }
    Data.Location := x;
  end;

  x[0] := AnsiChar($E9);
  y := integer(NewProcedure) - integer(p) - 5;
  x[1] := AnsiChar(y and 255);
  x[2] := AnsiChar((y shr 8) and 255);
  x[3] := AnsiChar((y shr 16) and 255);
  x[4] := AnsiChar((y shr 24) and 255);

  if not VirtualProtect(Pointer(x), 6, ov, @ov2) then
    RaiseLastOSError;
end;

function MyWideSameText(const S1, S2: WideString): Boolean;
begin
  Result := false;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  OverwriteProcedure(@SysUtils.WideSameText, @MyWideSameText);
end;
Sven Harazim
--
  Mit Zitat antworten Zitat