AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi Problem mit Variablen bei ReadProcessMemory und WriteProcessMemory
Thema durchsuchen
Ansicht
Themen-Optionen

Problem mit Variablen bei ReadProcessMemory und WriteProcessMemory

Ein Thema von Helmi · begonnen am 22. Sep 2012 · letzter Beitrag vom 23. Sep 2012
Antwort Antwort
Benutzerbild von Helmi
Helmi

Registriert seit: 29. Dez 2003
Ort: Erding, Republik Bayern
3.312 Beiträge
 
Delphi XE2 Professional
 
#1

Problem mit Variablen bei ReadProcessMemory und WriteProcessMemory

  Alt 22. Sep 2012, 19:21
Hallo,

ich versuch gerade folgenden Code aus Luckies LuckieDips ans Laufen zu bekommen:

Delphi-Quellcode:
function GetDesktopIconInfo: TDesktopIconInfoArray;
var
  ListView : HWND;
  ProcessId : DWORD;
  Process : THandle;
  Size : Cardinal; // SIZE_T
  MemLocal : PLvItemBuffer;
  MemRemote : PLvItemBuffer;
  NumBytes : Cardinal; // SIZE_T
  IconCount : DWORD;
  IconIndex : Integer;
  IconLabel : string;
  IconPos : TPoint;
  DesktopIconInfoArray: TDesktopIconInfoArray;
begin
  // Fensterhandle des Desktop-ListView ermitteln und Prozess oeffnen
  ListView := GetDesktopListView;
  ProcessId := 0;
  GetWindowThreadProcessId(ListView, @ProcessId);
  Process := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_OPERATION or
    PROCESS_VM_READ or PROCESS_VM_WRITE, False, ProcessId);
  if Process <> 0 then
  try
    // Lokalen und entfernten (im Zielprozess) Puffer anlegen
    Size := SizeOf(TLvItemBuffer);
    MemLocal := VirtualAlloc(nil, Size, MEM_COMMIT, PAGE_READWRITE);
    MemRemote := VirtualAllocEx(Process, nil, Size, MEM_COMMIT, PAGE_READWRITE);
    if Assigned(MemLocal) and Assigned(MemRemote) then
    try
      // Anzahl der Symbole ermitteln und in einer Schleife durchlaufen
      IconCount := SendMessage(ListView, LVM_GETITEMCOUNT, 0, 0);
      Setlength(DesktopIconInfoArray, IconCount);
      for IconIndex := 0 to IconCount - 1 do
      begin
        // Symboltext auslesen
        // (es gibt zwei identische Strukturen, jeweils eine in diesem und eine
        // im Zielprozess. Wobei die Daten zwischen den Puffern hin und her
        // kopiert werden muessen. Dieser Aufwand ist noetig, da LVM_GETITEM
        // eine Struktur liest und schreibt, die sich im Adressraum des
        // Prozesses befindet, dem das entsprechende Fenster gehoert...)
        ZeroMemory(MemLocal, SizeOf(TLvItemBuffer));
        with MemLocal^ do
          if IsWow64Process(GetCurrentProcess) and
            not IsWow64Process(Process) then
          begin
            LvItem64.mask := LVIF_TEXT;
            LvItem64.iItem := IconIndex;
            LvItem64.pszText := Cardinal(MemRemote) + ItemBufferBlockSize;
            LvItem64.cchTextMax := High(MemLocal.ItemText) + 1;
          end
          else
          begin
            LvItem32.mask := LVIF_TEXT;
            LvItem32.iItem := IconIndex;
            LvItem32.pszText := Cardinal(MemRemote) + ItemBufferBlockSize;
            LvItem32.cchTextMax := High(MemLocal.ItemText) + 1;
          end;
        NumBytes := 0;
        if WriteProcessMemory(Process, MemRemote, MemLocal, Size, NumBytes)
          and
          Boolean(SendMessage(ListView, LVM_GETITEM, 0, LPARAM(MemRemote)))
          and
          ReadProcessMemory(Process, MemRemote, MemLocal, Size, NumBytes) then
        begin
          IconLabel := string(MemLocal.ItemText);
          // Position auslesen
          // (-1, -1 ist nur ein Indiz fuer einen Fehlschlag, da diese Position
          // natuerlich moeglich ist...)
          IconPos.X := -1;
          IconPos.Y := -1;
          if Boolean(SendMessage(ListView, LVM_GETITEMPOSITION, IconIndex, LPARAM(MemRemote)))
            and
            ReadProcessMemory(Process, MemRemote, MemLocal, Size, NumBytes) then
          begin
            IconPos := PPoint(MemLocal)^;
          end;
          // Speichern ;)
          DesktopIconInfoArray[IconIndex].Caption := IconLabel;
          DesktopIconInfoArray[IconIndex].Position.X := IconPos.X;
          DesktopIconInfoArray[IconIndex].Position.Y := IconPos.Y;
        end;
        result := DesktopIconInfoArray;
      end;
    except
      // Exceptions ignorieren
    end;
    // Aufraeumen
    if Assigned(MemRemote) then
      VirtualFreeEx(Process, MemRemote, 0, MEM_RELEASE);
    if Assigned(MemLocal) then
      VirtualFree(MemLocal, 0, MEM_RELEASE);
  finally
    CloseHandle(Process);
  end;
end;
Nur bekomm ich beim Compilieren einen Fehler bei den Functions ReadProcessMemory und WriteProcessMemory
Code:
[DCC Fehler] Unit2.pas(222): E2033 Die Typen der tatsächlichen und formalen Var-Parameter müssen übereinstimmen
Alle Typ-Definitionen hab ich aus LuckieDips übernommen.

Ich vermute mal es hat was mit meinem XE2 zu tun (im Vergleich).

Nur was müsste man ändern?

Nebenbei bemerkt: Mein Projekt ist kein NonVcl-Projekt
mfg
Helmi

>> Theorie ist Wissen, dass nicht funktioniert - Praxis ist, wenn alles funktioniert und keiner weiss warum! <<
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Problem mit Variablen bei ReadProcessMemory und WriteProcessMemory

  Alt 22. Sep 2012, 23:12
Sein Code dürfte wohl eher Delphi 7 entsprechen ... in der Zwischenzeit hat Borland/Codegear/Embarcadero so Einiges verändert.

- Pointer in VAR-Parameter verändert
- oder andersrum
- und vorallem endlich mal gemekt, daß man komplett falsche Typen verwendet hatte, bzw. seitdem jemand auf die saublöde Iddee gekommen ist, den Integer einzufrieren, die bisherrigen Typen daran angepasst.

Tipp: Schau nicht wie es andere machen, sondern schau nach, wie es "wirklich" (aktuell) deklariert ist und paß deine Variaben-Typen und deren Übergabe daran an. :zwinker

Aber was ist denn die Zeile 222 und vorallem, auf welches Target bezieht sich diese Aussage? (Win32?)
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (22. Sep 2012 um 23:18 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Helmi
Helmi

Registriert seit: 29. Dez 2003
Ort: Erding, Republik Bayern
3.312 Beiträge
 
Delphi XE2 Professional
 
#3

AW: Problem mit Variablen bei ReadProcessMemory und WriteProcessMemory

  Alt 23. Sep 2012, 09:29
Sein Code dürfte wohl eher Delphi 7 entsprechen ... in der Zwischenzeit hat Borland/Codegear/Embarcadero so Einiges verändert.

- Pointer in VAR-Parameter verändert
- oder andersrum
- und vorallem endlich mal gemekt, daß man komplett falsche Typen verwendet hatte, bzw. seitdem jemand auf die saublöde Iddee gekommen ist, den Integer einzufrieren, die bisherrigen Typen daran angepasst.

Tipp: Schau nicht wie es andere machen, sondern schau nach, wie es "wirklich" (aktuell) deklariert ist und paß deine Variaben-Typen und deren Übergabe daran an. :zwinker
Ich habe so etwas befürchtet - dann bleibt mir wohl nichts anderes übrig es umzurüsten...

Aber was ist denn die Zeile 222 und vorallem, auf welches Target bezieht sich diese Aussage? (Win32?)
Die Zeile 222 ist diese hier if WriteProcessMemory(Process, MemRemote, MemLocal, Size, NumBytes) also das erste Vorkommen von WriteProcessMemory.
Die Meldung ist aber bei jedem Vorkommen von WriteProcessMemory und ReadProcessMemory die gleiche.

Es geht hierbei um Win32
mfg
Helmi

>> Theorie ist Wissen, dass nicht funktioniert - Praxis ist, wenn alles funktioniert und keiner weiss warum! <<
  Mit Zitat antworten Zitat
Benutzerbild von Helmi
Helmi

Registriert seit: 29. Dez 2003
Ort: Erding, Republik Bayern
3.312 Beiträge
 
Delphi XE2 Professional
 
#4

AW: Problem mit Variablen bei ReadProcessMemory und WriteProcessMemory

  Alt 23. Sep 2012, 10:41
Peinlich Peinlich,

in den LuckieDips gibt es eine Unit namens: NcxVmx9x
Und darin gibt es auch WriteProcessMemory und ReadProcessMemory.

Wenn ich die Unit hinzufüge, dann funktionierts.
mfg
Helmi

>> Theorie ist Wissen, dass nicht funktioniert - Praxis ist, wenn alles funktioniert und keiner weiss warum! <<
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Problem mit Variablen bei ReadProcessMemory und WriteProcessMemory

  Alt 23. Sep 2012, 11:43
Wobei man an der Unit Windows nicht unbedingt sparren müßte. (außer daß er eben vermutlich ein paar Parametertypen anders deklariert hat, aber hoffentlich nichts mit Integer/LongInt, bzw. PInteger/PLongInt)
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


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 07:57 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