![]() |
Problem mit Variablen bei ReadProcessMemory und WriteProcessMemory
Hallo,
ich versuch gerade folgenden Code aus Luckies LuckieDips ans Laufen zu bekommen:
Delphi-Quellcode:
Nur bekomm ich beim Compilieren einen Fehler bei den Functions
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;
Delphi-Quellcode:
und
ReadProcessMemory
Delphi-Quellcode:
WriteProcessMemory
Code:
Alle Typ-Definitionen hab ich aus LuckieDips übernommen.
[DCC Fehler] Unit2.pas(222): E2033 Die Typen der tatsächlichen und formalen Var-Parameter müssen übereinstimmen
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 |
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?) |
AW: Problem mit Variablen bei ReadProcessMemory und WriteProcessMemory
Zitat:
Zitat:
Delphi-Quellcode:
also das erste Vorkommen von WriteProcessMemory.
if WriteProcessMemory(Process, MemRemote, MemLocal, Size, NumBytes)
Die Meldung ist aber bei jedem Vorkommen von WriteProcessMemory und ReadProcessMemory die gleiche. Es geht hierbei um Win32 |
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. |
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 09:20 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz