AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi uallcollection - GetRealModule Handle win speicherverwaltung
Thema durchsuchen
Ansicht
Themen-Optionen

uallcollection - GetRealModule Handle win speicherverwaltung

Ein Thema von Arnulf · begonnen am 22. Jul 2005 · letzter Beitrag vom 20. Jul 2006
Antwort Antwort
Seite 2 von 2     12   
NicoDE
(Gast)

n/a Beiträge
 
#11

Re: uallcollection - GetRealModule Handle win speicherverwal

  Alt 24. Jul 2005, 08:33
Zitat von Arnulf:
Wenn man mir wortfetzen zuwirft, dann muß ichs einfach wissen so bin ich hald
Ich bin stillschweigend davon ausgegangen, dass Du die
Microsoft Portable Executable and Common Object File Format Specification
auswendig gelernt hast

Was ich sagen wollte ist, dass Einträge in der Export-Tabelle normalerweise auf Relative Virtuelle Adresse der exportierten Funktionen zeigen. Sonderfall: Wenn nun aber die RVA in die Export-Tabelle selbst zeigt, dann ist dort keine Funktion zu finden, sondern ein String der Form "module.function" (der Forwarder-String der auf die referenzierte Funktion verweist).
...die Erklärung ist auch nicht viel länger geworden *g*
  Mit Zitat antworten Zitat
Arnulf

Registriert seit: 28. Okt 2004
Ort: Wien
271 Beiträge
 
#12

Re: uallcollection - GetRealModule Handle win speicherverwal

  Alt 24. Jul 2005, 09:54
Hi
nein ich hab das alles von hier:
http://www.thecodeproject.com/win32/...asp?print=true

von microsoft kannte ich das noch garnicht.
Du meinst damit man könnte sich GetRealModuleHandle sparen, wenn man in der export tabelle nachsieht ob die exportierte funktion auf die export tabelle zeigt oder nicht.
Bisher hab ich ja nur import hooks gesehen - was man mit der export tabelle anstellen kann weiß ich ja noch garnicht
Oder hab ich den zusammenhang schon wieder verpasst?
Arnulf
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.115 Beiträge
 
Delphi 12 Athens
 
#13

Re: uallcollection - GetRealModule Handle win speicherverwal

  Alt 20. Jul 2006, 17:22
ich weiß ... 'n bissl spät, aber besser, als nie

In Windows werden die Specherblöcke immer nur in 64 KB-Blöcken reserviert, also alle $10000 Byte ein neuer Block und weil es nunmal bei 0 beginnt, liegen die unteren Bits innerhalb einens Blocks.
Mit h := cardinal(addr) and $FFFF0000; wird also erstmal an den anfang des ersten Blocks gesprungen.

Tja, und dann geht es, in 'ner netten Schleife, Block für Block zurück:
Delphi-Quellcode:
repeat
  
  dec(h, $10000);
until ... (h = 0);
Und das solange, bis man 'nen Modulnamen, also mehr als 0 Zeichen zurückgeliefert bekommt:
Delphi-Quellcode:
repeat
  i := GetModuleFilename(h,buf,255);

until (i <> 0) ...;

Am Ende wird dann (wenn was gefunden wurde) wieder ein Block hinzugezählt, denn dieser wurde ja nach dem Auffinden (per GetModuleFilename) von diesem DEC abgezogen (man ist dann also vor dem Modul, obwohl man ja die Adresse des Moduls wollte).

Delphi-Quellcode:
. i := GetModuleFilename(h,buf,255);
  dec(h,$10000);
until (i <> 0) or (h = 0);
if (h = 0) then .. else result := h+$10000;
Man könnte natürlich auch erstmal was zurechnen und die Abfrage umdrehen:
(da h am Ende eh dem Result zugewiesen wird, kann man auch gleich Result verwenden)
Delphi-Quellcode:
function GetRealModuleHandle(addr: pointer): cardinal; stdcall;
var i: cardinal;
    buf: array[0..MAX_PATH-1] of char;
begin
  Result := (cardinal(addr) + $0000FFFF) and $FFFF0000;
  repeat
    dec(Result, $10000);
    i := GetModuleFilename(h, buf, MAX_PATH);
  until (i <> 0) or (Result = 0);
end;
Delphi-Quellcode:
function GetRealModuleHandle(addr: pointer): cardinal; stdcall;
var buf: array[0..MAX_PATH-1] of char;
begin
  Result := (cardinal(addr) + $0000FFFF) and $FFFF0000;
  repeat
    dec(Result, $10000);
  until (GetModuleFilename(h, buf, MAX_PATH) <> 0) or (Result = 0);
end;
Schneller geht es, wenn man direkt anfragt, wo der Anfang ist und gleich noch prüft was da ist.
Delphi-Quellcode:
function GetRealModuleHandle(addr: pointer): cardinal;
var MBI: MEMORY_BASIC_INFORMATION;
begin
  if (VirtualQuery(addr, MBI, SizeOf(MBI)) <> 0)
    and (MBI.Type_9 = MEM_IMAGE) and (MBI.State = MEM_COMMIT) then
    Result := cardinal(MBI.AllocationBase) else Result := 0;
end;
außerdem bekommt man so einen richtigen Wert, denn die Funktion von uallcollection sucht ja solange, bis sie was findet, aber ob dieses noch zum selben Speicherblock gehört is dem Teil egal.

Theoretisch könnte man den Pointer hinter einem Modul positionieren, also irgendwo (z.B. in einem nicht reserviertem Specherbereich, oder in irgendwas Anderem), halt nur nicht in einem nicht Modul.
Und obwohl man dann 0 als ergebnis haben müßte (ohne Modul gibt's ja auch keine Adresse, wo es (was ja nicht da ist) beginnt ... aber so würde es jedes Modul finden, welche einfach nur vor dem Pointer beginnt.

Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 20:24 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