Autor Beitrag
Singlepin
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 36
Erhaltene Danke: 4

WinXP
Delphi6 MySQL
BeitragVerfasst: Do 29.09.11 17:38 
Hallo Gemeinde,

ich habe einen globalen Haken ins System gehauen und kann damit folgende Infos erhalten,


lParam: soll die Struktur mit den Infos die ich brauche enthalten
wParam: steht auf 1
message: enthält die richtige Nummer zum Anzeigen der Balloon-Message
hWnd: das Handle auf die Anwendung die die Balloon-Message sendet, stimmt auch.

soweit so gut, nun kommt das Problem:

hier mal ein bißchen Code:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
 hFile:=CreateFile('...\messageinfo.log',GENERIC_WRITE or GENERIC_READ,0,nil,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,0);

...

  try
   SetFilePointer(hFile, 0nil, FILE_END);
   PID:=GetCurrentProcessID;
   FileSatz.PID:=PID;
   FileSatz.lParam:=lParam;
   FileSatz.wParam:=wParam;
   FileSatz.a.lParam:=CWPS(Pointer(LParam)^).lParam;
   FileSatz.a.wParam:=CWPS(Pointer(LParam)^).wParam;
   FileSatz.a.message:=CWPS(Pointer(LParam)^).message;
   FileSatz.a.hWnd:=CWPS(Pointer(LParam)^).hwnd;
// bis hier get es
   if FileSatz.a.message=wm_IconMessages then
    begin
    IconData:=NOTIFYICONDATA(Pointer(FileSatz.a.lParam)^);
    WriteFile(hFile,IconData,Sizeof(IconData),sizewritten,nil);
    end;
// der Rest geht auch
  finally CloseHandle(hFile);
  end;

Die FileWrite Anweisung kann es auch nicht sein. Die hatte ich zuvor zum Schreiben von FileSatz benutzt.
Offenbar bekomme ich beim Auslesen der Daten zum zuweisen für IconData die Zugriffsverletzung.

Die Frage lautet: "warum"?
Singlepin Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 36
Erhaltene Danke: 4

WinXP
Delphi6 MySQL
BeitragVerfasst: Sa 08.10.11 18:46 
OK, ich war nicht untätig.
Der Fehler tritt auf, da ich versuche im Speicher einer anderen Anwendung zu lesen. Windows verhindert das.
Ich dachte nun, daß mit „ReadProcessMemory“ und „Toolhelp32ReadProcessMemory“ diese Schutzfunktion zu umgehen ist. In beiden Fällen werden 0 Byte gelesen. Wenn ich ein beliebiges Handle in die vorgenannten Funktionen einsetze wird der Speicher ausgelesen. Was aber keinen Wert hat, da das Bereiche sind die keinen Sinnvollen Inhalt enthalten.
Meine Frage ist nun, ob unter Windows XP, der Speicher der von anderen Anwendungen belegt wird überhaupt ausgelesen werden kann und wenn ja welchen Schalter muß ich umlegen?
-------------------------------------------------------------------------------------------------------------------
Hilf dir selbst, wenn dir geholfen werden soll!

ReadProcessMemory geht schon!
Wenn man die falsche "lpBaseAddress" hat sieht es manchmal so aus als ob es nicht
richtig funktioniert. Na gut Lehrgeld muß sein.

Die Lösung:
Fensterhandle mit "FindWindow" vom Programm besorgen welches die Ballonmessage sendet.
Mit einem globalem Hook prüfen, ob die Message "Ballonmeldung aktualisieren" kommt und mit
dem Fensterhandle abgleichen.

Nun kommt der schwierige Teil.
Die Adresse der Meldung finden. Dazu habe ich den gesamten Speicher der Anwendung durchsucht.
Kleines Programm macht das automatisch. (kann man den Wert nicht irgentwo abfragen?)
Zumindest bei meiner Testanwendung ist es immer dieselbe Adresse.
Text mit "ReadProcessMemory" auslesen, fertig.
Nun muß ich das Ganze nur noch auf meinen Anwendungsfall applizieren.