| |
|
|
- Seite 1 - |
|
Matthias Arlt | Bei der Fehlersuche in einem meiner Programme ist mir aufgefallen, dass ein schreibender Zugriff mit "UpdateResource" auf die Runtime (bzw. Interpreter) regelmäßig die Datei unbrauchbar macht. Soweit ich herausgefunden habe, oder dies jedenfalls annehme, wird der Schreibvorgang zwar ausgeführt, aber die Änderung nicht im Header eingetragen... Dies führt dann beim Startversuch der Datei zu unterschiedlichen Fehlermeldungen. Meist "Nur ein Teil der ReadProcessMemory- oder WriteProcessMemory-Anforderung wurde abgeschlossen" oder "Falscher Parameter...". Es betrifft auch ausschliesslich FreeProfan, die XProfan-Versionen sind von diesem Effekt nicht betroffen.
Gruß Matthias |
|
|
| WinXP SP2, Win7 - XProfan 10/11/FreeProfan32 - Xpia | 10.04.2016 ▲ |
|
|
|
| |
|
- Seite 2 - |
|
|
Matthias Arlt | Aber ich bin der Sache schon ein Stück näher gekommen. Die Ursache für die Verschiebung liegt darin begründet, dass bei FreeProfan 3 Sektionen fehlen. Das sind .tls,.rdata und .reloc Diese liegen bei XProfan unmittelbar vor .rsrc Bei FreeProfan ist ein Teil des Platzes den diese Sektionen einnehmen würden mit Auffüll-Nullen besetzt, um das FileAlignment (mod 512) zu gewährleisten. Die API kümmert sich um diese Nullen nicht und interpretiert den Platz als frei. Das Einfachste wäre nun, entweder eine Sektion dieser Größe als Dummy einzufügen oder die bei FreeProfan vor .rsrc liegende .edata um diesen Betrag zu vergrößern. Also natürlich nur den Größen-Eintrag im Header.
Gruß Matthias |
|
|
| WinXP SP2, Win7 - XProfan 10/11/FreeProfan32 - Xpia | 20.04.2016 ▲ |
|
|
|
|
Matthias Arlt | So, ich hab das jetzt mal gemacht. Alles scheint optimal zu funktionieren. Es reicht demnach aus, in der originalen Runtime die Größe von .edata zu erhöhen, damit kein Platz zwischen .edata und .rsrc bleibt...
Nach weiteren Tests kann ich sagen, es scheint nicht nur zu funktionieren, sondern tut es auch zuverlässig !
Zum Nachvollziehen: bei (long(runtime#,60) + 124) [Diese Adresse ist immer gleich] steht die Größe von .edata, nämlich $C8. Diesen Wert um die Differenz zu .rsrc (also um 312) erhöhen, dort also $200 eintragen.
Das Gleiche dann nochmal bei (.edata + 8) und bei (.edata + 16)
Das wars auch schon... für FreeProfan32.
Wie das bei 64 aussieht, kann ich nicht testen. Das FileAlignment beträgt dort jedenfalls (mod 1024), womit sich die Differenzwerte dementsprechend ändern...
Gruß Matthias |
|
|
| WinXP SP2, Win7 - XProfan 10/11/FreeProfan32 - Xpia | 20.04.2016 ▲ |
|
|
|
|
RGH | Danke! Das werde ich gleich mal ausprobieren!
Aber wieso trägt das der FreePascal-Compiler nicht gleich so ein? So muss ich nach jedem Compile-Vorgang die entstandenen EXE-Dateien (Ok, beim Compiler ist es nicht nötig) patchen, damit sie korrekt funktionieren. Da werde ich mir wohl ein kleines XProfan-Progrämmelchen schreiben müssen ...
Gruß Roland |
|
|
| XProfan X3Intel Duo E8400 3,0 GHz / 4 GB RAM / 1000 GB HDD - ATI Radeon HD 4770 512 MB - Windows 7 Home Premium 32Bit - XProfan X4 | 20.04.2016 ▲ |
|
|
|
|
RGH | EDIT: Da muss ich mich eben vertippt haben! Beim zweiten Versuch klappt es jetzt. Sorry!
Gruß Roland
FALSCHMELDUNG von vorhin: Also ich habe jetzt in der PRFRUN32.EXE an diesen drei Stellen die Bytefolge $C8 $00 (= $00C8) durch $00 $02 (= $0200) ersetzt. Erfolg: Die EXE ist gleich unbrauchbar! |
|
|
| Intel Duo E8400 3,0 GHz / 4 GB RAM / 1000 GB HDD - ATI Radeon HD 4770 512 MB - Windows 7 Home Premium 32Bit - XProfan X4 | 20.04.2016 ▲ |
|
|
|
|
Matthias Arlt | Na wunderbar. Nun muss es nur noch bei 64 klappen... Du kannst ja den Kompiler im 'winexecwait' laufen lassen und wenn er fertig ist, den Patch ausführen.
Gruß Matthias |
|
|
| WinXP SP2, Win7 - XProfan 10/11/FreeProfan32 - Xpia | 20.04.2016 ▲ |
|
|
|
|
Michael W. | C:\FPC\fpc-3.0.0\compiler\systems\t_win.pas wäre die Stelle im FreePascal-Compiler wo die Daten gewurstelt werden.
Vielleicht läßt sich ja daran etwas drehen. |
|
|
| |
|
|
|
Matthias Arlt | Wäre 'ne Möglichkeit. Aber ob es die einfachere ist...? |
|
|
| WinXP SP2, Win7 - XProfan 10/11/FreeProfan32 - Xpia | 20.04.2016 ▲ |
|
|
|
|
Michael W. | Sieht schwer aus, wäre dann aber für 86/64.
Evtl wird es dort auch nur generiert und es muss in den asm86 asm64 Unterbereichen geändert werden.
Bin zu müde... (evtl. ist das auch schon in der JediLib verbessert, wer weiß) |
|
|
| System: Windows 8/10, XProfan X4 Programmieren, das spannendste Detektivspiel der Welt. | 20.04.2016 ▲ |
|
|
|
|
Matthias Arlt | Ich würde den Compiler erstmal nicht verändern. Man kann den ja wohl mit verschiedenen Optionen aufrufen...und erschafft sich dann evtl. weitere Macken... |
|
|
| WinXP SP2, Win7 - XProfan 10/11/FreeProfan32 - Xpia | 21.04.2016 ▲ |
|
|
|
|
Matthias Arlt | Was FreeProfan64 angeht, so kann ich es zwar nicht testen, habe mir aber trotzdem mal die Binary unter die Lupe genommen.
Hier liegt vor .rsrc nicht .edata, sondern .idata
Der erste zu ändernde Wert liegt an Offset (long(runtime#,60) + 148) [bei 64bit auch immer an dieser Stelle]. Dort wäre $6000 einzutragen. Die anderen beiden Offsets wären (.idata + 8) und (.idata + 16) Bei (.idata + 8) wären auch wieder $6000 einzutragen. Allerdings differieren bei FreeProfan64 die virtuelle Größe und die Rohdaten-Größe. Bei den Rohdaten, also an (.idata + 16) wären es demnach nur $5800. Ansonsten sollte die Vorgehensweise identisch sein... Sollte es nicht auf Anhieb klappen, einfach mal an allen 3 Offsets mit beiden Werten, $6000 oder $5800, experimentieren. Oder besser nur an den ersten 2 Offsets, denn bei (.idata + 16) dürfen es ja maximal $5800 sein.
Etwas erstaunt war ich übrigens, dass bei FreeProfan64 die Runtime auch mit Prfrun32 benannt ist....
Gruß Matthias |
|
|
| WinXP SP2, Win7 - XProfan 10/11/FreeProfan32 - Xpia | 21.04.2016 ▲ |
|
|
|
|
RGH | Vielen Dank für Deine Mühe! Das werde ich dann demnächst mal austesten!
Matthias Arlt (21.04.2016)
Etwas erstaunt war ich übrigens, dass bei FreeProfan64 die Runtime auch mit Prfrun32 benannt ist....
Das liegt ganz einfach daran, dass ich für 64Bit exakt den gleichen Quellcode benutze. Kleinere Unterschiede werden durch Compilerschalter erledigt. Aber damit befinde ich mich in guter Gesellschaft, wenn man so einige Dateinamen von Windows betrachtet.
Gruß Roland |
|
|
| Intel Duo E8400 3,0 GHz / 4 GB RAM / 1000 GB HDD - ATI Radeon HD 4770 512 MB - Windows 7 Home Premium 32Bit - XProfan X4 | 21.04.2016 ▲ |
|
|
|
|
Matthias Arlt | Nix zu danken...das war mir ein Vergnügen...und der Lerneffekt ist auch nicht zu verachten.
Aber damit befinde ich mich in guter Gesellschaft, wenn man so einige Dateinamen von Windows betrachtet.
Dem ist nichts hinzuzufügen...
Gruß Matthias |
|
|
| WinXP SP2, Win7 - XProfan 10/11/FreeProfan32 - Xpia | 21.04.2016 ▲ |
|
|
|