home *** CD-ROM | disk | FTP | other *** search
- (* ------------------------------------------------------ *)
- (* TPWPATCH.PAS *)
- (* Ändern der Meldung in TPW-EXE-Dateien. *)
- (* (c) 1991 Mario Westphal & DMV-Verlag *)
- (* ------------------------------------------------------ *)
-
- {$DEFINE PRG_FERTIG} { Checks aus }
- {$DEFINE DEBUG} { Zum Debuggen setzen }
- {$DEFINE IDE} { WICHTIG: innerhalb der IDE definieren }
-
- PROGRAM TPW_WinExePatch;
- {$M 4096,0,655360}
-
- {$IFDEF PRG_FERTIG}
- {$A+,B-,D-,E+,F-,G-,I+,L-,N-,O-,R-,S-,V+,X-}
- {$ENDIF}
- {$IFDEF DEBUG}
- {$D+,L+}
- {$ENDIF}
-
- USES Crt, Dos;
-
- CONST
- cHSize = $08; { Offset: Größe des Headers }
- cWhAddr = $3C; { Offset: Adresse Windows-Header }
- cWinID = $454E; { Kennung im W-Header "EN" }
- cTpWid = $E0010BA; { MOV DX,0010 PUSH CS }
- cMStart = $90; { Offset: Meldung }
- cMLen = $100-cMStart; { Länge der Meldung }
- CR = '\N'; { Steuerzeichen }
- cDefName = 'TPWPATCH.DEF'; { Name der Default-Datei }
-
- VAR
- PaStr : STRING;
- DefMess : STRING [cMLen-3]; { -3 wg. CRLF+"$" am Ende }
- NewMess : STRING [cMLen-3];
- b : BYTE;
-
-
- FUNCTION ParseStr(s : STRING) : STRING;
- (* Ersetzt das Steuerzeichen \N durch CRLF, füllt bis
- zur maximalen Länge mit Blanks auf und fügt CRLF+"$"
- an das Stringende an. *)
- VAR
- i : BYTE;
- t : STRING;
- BEGIN
- FillChar(t[1], cMLen, ' ');
- i := Pos(CR, s); { Steuerzeichen ersetzen }
- WHILE i <> 0 DO BEGIN
- Insert(#13#10, s, i);
- Delete(s, i+2, 2);
- i := Pos(CR, s);
- END;
- t := s+#13#10+'$';
- t[0] := CHR(cMLen);
- ParseStr := t;
- END;
-
-
- FUNCTION LoadDefMess : BOOLEAN;
- (* Öffnet TPWPATCH.DEF und liest die erste Zeile in die
- Variable "DefMess". Liefert FALSE bei I/O-Fehler. *)
- VAR
- FName : STRING;
- d : DirStr;
- n : NameStr;
- e : ExtStr;
- TFile : TEXT;
- BEGIN
- LoadDefMess := FALSE;
- FSplit(ParamStr(0), d, n, e);
- {$IFDEF IDE} { nur innerhalb der IDE }
- d := 'C:\TP\'; { evtl. anpassen ! }
- {$ENDIF}
- FName := d + cDefName;
- Assign(TFile, FName);
- {$I-}
- Reset(TFile);
- {$I+}
- IF IOResult <> 0 THEN Exit;
- ReadLn(TFile, DefMess);
- Close(TFile);
- LoadDefMess := (IOResult = 0);
- END;
-
-
- FUNCTION IsWinEXE(FName : STRING) : BYTE;
- (* Prüft, ob die Datei "FName" eine TPW EXE-Datei ist.
- Ergebnis = 0 : Kein Fehler und gültige Datei
- = 1 : Keine TPW EXE-Datei
- = 2 : Keine Windows EXE-Datei
- = 3 : I/O-Fehler *)
- TYPE
- LType = RECORD
- CASE Typ : INTEGER OF
- 0 : (L : LONGINT);
- 1 : (LW : WORD;
- HW : WORD);
- END;
- VAR
- f : FILE;
- w : WORD;
- L : LType;
-
- FUNCTION ReadWord(VAR w : WORD) : BOOLEAN;
- (* Liest ein Word. Schließt bei Fehler die Datei
- und liefert FALSE. *)
- VAR
- r : WORD;
- e : INTEGER;
- BEGIN
- {$I-}
- BlockRead(f, w, SizeOf(w), r);
- e := IOResult;
- IF (e <> 0) OR (r <> SizeOf(w)) THEN Close(f);
- {$I+}
- ReadWord := (e = 0) AND (r = SizeOf(w));
- END;
-
- BEGIN
- IsWinEXE := 3;
- Assign(f, FName);
- {$I-}
- Reset(f, 1);
- IF IOResult <> 0 THEN Exit;
-
- Seek(f, cWhAddr); { Windows-Header Offset lesen }
-
- IF NOT ReadWord(L.LW) THEN Exit;
- IF NOT ReadWord(L.HW) THEN Exit;
-
- Seek(f, L.L);
- IF NOT ReadWord(w) THEN Exit; { Kennung lesen }
- IF w <> cWinID THEN BEGIN
- IsWinEXE := 2;
- Close(f);
- Exit;
- END;
-
- Seek(f, cHSize); { Größe des Headers lesen }
- IF NOT ReadWord(w) THEN Exit;
- w := w SHL 4; { Paragraphen -> Bytes }
- Seek(f, w); { Die ersten 4 Byte }
- IF NOT ReadWord(L.LW) THEN Exit; { des Code-Segments }
- IF NOT ReadWord(L.HW) THEN Exit; { vergleichen }
- Close(f);
- {$I+}
-
- IF IOResult <> 0 THEN Exit;
- IF L.L <> cTpWid THEN IsWinEXE := 1
- ELSE IsWinEXE := 0
- END;
-
-
- FUNCTION Patch(FName : STRING; Mess : STRING) : BOOLEAN;
- (* Überschreibt den alten Text in der EXE-Datei mit dem
- Inhalt von "DefMess". Liefert FALSE bei I/O-Fehler *)
- VAR
- f : FILE;
- r : WORD;
- BEGIN
- {$I-}
- Patch := FALSE;
- Assign(f, FName);
- Reset(f, 1);
- IF IOResult <> 0 THEN Exit;
- Seek(f, cMStart);
- IF IOResult <> 0 THEN
- BEGIN Close(f); Exit;
- END;
- BlockWrite(f, Mess[1], cMLen, r);
- Close(f);
- Patch := (IOResult = 0) AND(r = cMLen);
- {$I+}
- END;
-
- BEGIN
- WriteLn('TPWPatch - ',
- '(c) 1991 Mario M. Westphal & DMV-Verlag');
-
- IF Lo(DosVersion) < 3 THEN BEGIN { wegen ParamStr(0) }
- WriteLn;
- WriteLn('Dieses Programm benötigt DOS-Version 3.x!');
- Halt(1);
- END;
-
- IF NOT LoadDefMess THEN BEGIN { Default-String einlesen }
- WriteLn;
- WriteLn(#7, 'Kann Message-Datei nicht lesen!');
- Halt(1);
- END;
-
- PaStr := ParamStr(1); { Dateinamen aufbereiten }
- IF PaStr = '' THEN BEGIN
- WriteLn;
- WriteLn('AUFRUF: tpwpatch <Dateiname>');
- Halt(1);
- END ELSE
- PaStr := FExpand(PaStr);
- b := Pos('.', PaStr);
- IF b = 0 THEN
- PaStr := PaStr + '.EXE'
- ELSE IF Copy(PaStr, b, 4) <> '.EXE' THEN BEGIN
- WriteLn;
- WriteLn(#7, 'Ungültiger Dateiname!');
- Halt(1);
- END;
- WriteLn('Datei: ', PaStr);
-
- b := IsWinEXE(PaStr); { Dateiformat prüfen }
- IF b <> 0 THEN BEGIN
- CASE b OF
- 1 : WriteLn(#7, 'Keine TPW EXE-Datei!');
- 2 : WriteLn(#7, 'Kein Windows-Programm!');
- 3 : WriteLn(#7, 'Fehler beim Zugriff auf Datei!');
- END;
- Halt(1);
- END;
-
- WriteLn('Vorgabe:'); { Neue Meldung einlesen }
- DefMess := ParseStr(DefMess);
- HighVideo;
- WriteLn(DefMess);
- NormVideo;
- WriteLn;
- WriteLn('Neue Meldung (<─┘ = Vorgabe):');
- HighVideo;
- ReadLn(NewMess);
- NormVideo;
- WriteLn;
- IF NewMess = '' THEN NewMess := DefMess
- ELSE NewMess := ParseStr(NewMess);
-
- IF NOT Patch(PaStr, NewMess) THEN BEGIN { Patchen }
- WriteLn(#7, 'Fehler beim Ändern der Meldung!');
- Halt(1);
- END ELSE
- WriteLn('Meldung wurde geändert.');
- END.
- (* ------------------------------------------------------ *)
- (* Ende von TPWPATCH.PAS *)
-