home *** CD-ROM | disk | FTP | other *** search
/ PC World 1999 June / PCWorld_1999-06_cd.bin / Hardware / Drivers / tppatch / TPPATCH.DOC < prev    next >
Text File  |  1997-09-13  |  4KB  |  93 lines

  1. Inzwischen wisst ihr ja alle von dem Bug in der Unit Crt, der auf sehr  
  2. schnellen Computern (PPro 200Mhz+) einen Runtime-Error 200 auslöst.
  3. Der Fehler liegt im Startupcode von Delay(), bei einer Division wird das  
  4. Ergebnis zu groß und passt nicht mehr in das Zielregister.
  5.  
  6. Ich habe jetzt in den letzten Tagen einen Bugfix geschrieben, der alle mit  
  7. Pascal kompilierte EXE-Dateien patchen kann, darunter auch *Crosspoint*.
  8. Dieses Verfahren funktioniert auch bei Programmen für den Protected Mode.
  9.  
  10. Um Programme zu fixen, die im Quelltext vorliegen, kann man auch andere
  11. Verfahren, insbesondere das Ersetzen von Delay(), anwenden.
  12.  
  13. Dadurch läuft Delay auf allen langsamen Maschinen weiterhin korrekt,  
  14. ebenso wie auf Maschinen mit 200Mhz. Wenn es dann bald noch schnellere  
  15. Prozessoren gibt, wartet Delay() auf diesen dann aber etwas zu wenig, aber  
  16. abstürzen wird diese Stelle auf keinen Fall mehr.
  17.  
  18. Hier jetzt die Erklärung:
  19.  
  20. >530B:0087 E83C02         call   02C6
  21. >530B:008A F7D0           not    ax
  22. >530B:008C F7D2           not    dx
  23. >530B:008E B93700         mov    cx,0037
  24. >530B:0091 F7F1           div    cx
  25.                           ^^^^^^^^^
  26. >530B:0093 A35C00         mov    [005C],ax
  27.  
  28. Diese Division an der Stelle CS:0091 bzw. CS:0099 verursacht eine  
  29. Exception #0 und damit einen Runtime-Error 200.
  30. Die erste Prozedur (hier bei CS:0087) ermittelt, wie weit die CPU einen  
  31. Zähler in ca. 55ms herunterzählen kann. Durch die beiden folgenden NOT- 
  32. Befehle wird der Wert negiert und dann durch 55 geteilt. (37h=55d)
  33. Dieser Wert, der dann in einer Variablen (hier [005C]) gespeichert wird,  
  34. wird später in Delay() verwendet, um 1ms zu warten.
  35.  
  36. Ich habe die Stelle so abgeändert:
  37.  
  38. >  cs:007E E88501         call   ....
  39. >  cs:0081 F7D0           not    ax
  40. >  cs:0083 F7D2           not    dx
  41. >  cs:0085 B93700         mov    cx,0037
  42. >  cs:0088 3BD1           cmp    dx,cx
  43. >  cs:008A 7205           jb     0091
  44. >  cs:008C B8FFFF         mov    ax,FFFF
  45. >  cs:008F EB02           jmp    0093
  46. >  cs:0091 F7F1           div    cx
  47. >  cs:0093 A35C00         mov    [005C],ax
  48.  
  49. Dadurch wird verhindert, dass das Ergebnis später größer als ein Word  
  50. wird. Natürlich musste ich dazu einige Befehle einfügen. Um den Code nicht  
  51. komplett verschieben zu müssen, habe ich einige Nachlässigkeiten der  
  52. Programmierer von BP/TP ausgenutzt, um vorher einige Bytes einzusparen,  
  53. z.B.:
  54.  
  55. vorher:
  56.  
  57. >  cs:0062 33C0           xor    ax,ax
  58. >  cs:0064 A25100         mov    [0051],al
  59. >  cs:0067 A26100         mov    [0061],al
  60. >  cs:006A A26200         mov    [0062],al
  61. >  cs:006D 40             inc    ax
  62. >  cs:006E A25000         mov    [0050],al
  63.  
  64. nachher:
  65.  
  66. >  cs:0062 33C0           xor    ax,ax
  67. >  cs:0064 A36100         mov    [0061],ax
  68. >  cs:0067 40             inc    ax
  69. >  cs:0068 A35000         mov    [0050],ax
  70.  
  71.  
  72. Das Programm (TPPATCH.EXE) überprüft die zu patchende Datei genau, damit  
  73. nicht eine EXE-Datei "zu Tode gepatcht wird". Die Positionen der Variablen  
  74. werden automatisch gescannt, daher sollte der Patch mit allen Versionen  
  75. von TP7/BP7 arbeiten. Ich habe es nicht mit TP6 getestet (das habe ich  
  76. nicht). Es wäre möglich, das es auch dessen Dateien patchen kann.
  77. -> Jedes Feedback über dieses Programm ist natürlich willkommen.
  78.  
  79. Das ganze ist natürlich nur notwendig, wenn auch die Unit CRT eingebunden  
  80. wurde.
  81.  
  82. Man kann durchaus per Batchdatei alle Dateien auf der Festplatte versuchen  
  83. zu patchen, denn es TPPATCH führt zuerst eine ganze Reihe von Tests durch,  
  84. es wird also keiner anderen Datei ein Haar gekrümmt.
  85.  
  86. Gepackte EXE-Dateien müssen vor dem Patchen entpackt werden,
  87. z.B. mit UNP (ftp://garbo.uwasa.fi/pc/execomp/unp411.zip).
  88.  
  89. Ich übernehme natürlich keine Verantwortung für alles, was man damit  
  90. anstellen kann. Vor dem Patchen von fremden Programmen sollte man einen  
  91. Blick in die LICENSE.DOC etc. werfen.
  92.  
  93. Andreas Bauer <andi.tio@hit.handshake.de>