Registriert seit: 29. Dez 2003
Ort: Erding, Republik Bayern
3.323 Beiträge
Delphi XE2 Professional
|
Problem mit Variablen bei ReadProcessMemory und WriteProcessMemory
22. Sep 2012, 20: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! <<
|