Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Problem mit Variablen bei ReadProcessMemory und WriteProcessMemory (https://www.delphipraxis.net/170553-problem-mit-variablen-bei-readprocessmemory-und-writeprocessmemory.html)

Helmi 22. Sep 2012 19:21

Problem mit Variablen bei ReadProcessMemory und WriteProcessMemory
 
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
Delphi-Quellcode:
ReadProcessMemory
und
Delphi-Quellcode:
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

himitsu 22. Sep 2012 23:12

AW: Problem mit Variablen bei ReadProcessMemory und WriteProcessMemory
 
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?)

Helmi 23. Sep 2012 09:29

AW: Problem mit Variablen bei ReadProcessMemory und WriteProcessMemory
 
Zitat:

Zitat von himitsu (Beitrag 1184011)
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...

Zitat:

Zitat von himitsu (Beitrag 1184011)
Aber was ist denn die Zeile 222 und vorallem, auf welches Target bezieht sich diese Aussage? (Win32?)

Die Zeile 222 ist diese hier
Delphi-Quellcode:
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

Helmi 23. Sep 2012 10:41

AW: Problem mit Variablen bei ReadProcessMemory und WriteProcessMemory
 
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.

himitsu 23. Sep 2012 11:43

AW: Problem mit Variablen bei ReadProcessMemory und WriteProcessMemory
 
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)


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:44 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