home *** CD-ROM | disk | FTP | other *** search
-
- PROGRAM INTVEC;
- {$M 4096,0,0}
-
- { SAVE / RESTORE INTERRUPTVEKTOREN }
-
-
- USES SELECTD,DOS,TPSTRING;
-
-
- CONST MAXVEC = $CF;
-
- TYPE INTBUF = ARRAY[0..MAXVEC] OF LONGINT;
-
-
- VAR I,J : WORD;
- S : STRING;
- INTS : INTBUF ABSOLUTE 0:0;
- IBUF : INTBUF;
- F : FILE OF INTBUF;
-
-
- PROCEDURE ERKLAERE;
- BEGIN
- WRITELN;
- WRITELN('Programm INTVEC');
- WRITELN;
- WRITELN('INTVEC S speichert die Interrupt- Vektoren auf File');
- WRITELN('INTVEC R restauriert die Interrupt- Vektoren von File');
- WRITELN('INTVEC D löscht File INTVEC.SAV');
- WRITELN;
- WRITELN('INTVEC @PROGRAMM.EXE PARAMETER Programm ausführen');
- WRITELN('INTVEC !PROGRAMM.EXE PARAMETER Programm ausführen und veränderte');
- WRITELN(' Interrupt- Vektoren anzeigen');
- WRITELN;
- WRITELN('Es wird das File INTVEC.SAV auf demselben Directory wie INTVEC.EXE benutzt.');
- WRITELN;
- HALT;
- END; { ERKLAERE }
-
-
- PROCEDURE COMPAREVECTORS(VAR PRG:STRING);
- VAR I : WORD;
- X : BOOLEAN;
- BEGIN
- X := TRUE;
- FOR I := 0 TO MAXVEC DO BEGIN
- IF INTS[I] <> IBUF[I] THEN BEGIN
- IF X THEN BEGIN
- WRITELN;
- WRITELN('!!!!! ',PRG,' verändert Interrupt- Vektoren :');
- WRITELN;
- WRITELN('Nr. (HEX) original verändert in');
- X := FALSE;
- END;
- WRITELN(I:3,' (',HEXB(I),'H) : ',
- HEXPTR(POINTER(IBUF[I])),' - ',
- HEXPTR(POINTER(INTS[I])));
- END;
- END; { NEXT I }
- IF NOT X THEN BEGIN
- WRITELN;
- WRITELN('Die veränderten Interrupt- Vektoren wurden wiederhergestellt');
- END;
- END; { COMPAREVECTORS }
-
-
- PROCEDURE PROGRAMMAUSFUEHREN;
- VAR PRG,CMD : STRING;
- IV22H : POINTER;
- BEGIN
- PRG := S;
- DELETE(PRG,1,1);
- {$I-}
- CHDIR(QUELLDIR);
- {$I+}
- CMD := '';
- FOR I := 2 TO PARAMCOUNT DO BEGIN
- CMD := CMD + PARAMSTR(I);
- IF I < PARAMCOUNT THEN CMD := CMD + ' ';
- END;
- IBUF := INTS;
- GETINTVEC($22,IV22H);
- SWAPVECTORS;
- EXEC(PRG,CMD);
- SWAPVECTORS;
- SETINTVEC($22,IV22H);
- IF DOSERROR <> 0 THEN BEGIN
- WRITELN('*** DOS - ERROR ',DOSERROR,' - ');
- CASE DOSERROR OF
- 2 : WRITE('File nicht gefunden');
- 8 : WRITE('zu wenig Speicherplatz');
- 10 : WRITE('Environment inkonsistent');
- 11 : WRITE('EXE- Datei inkonsistent');
- END; { CASE DOSERROR }
- WRITELN;
- END;
- IF S[1] = '!' THEN COMPAREVECTORS(PRG);
- INTS := IBUF;
- HALT;
- END; { PROGRAMMAUSFUEHREN }
-
-
- BEGIN
- IF PARAMCOUNT = 0 THEN ERKLAERE;
- S := PARAMSTR(1);
- FOR I := 1 TO LENGTH(S) DO S[I] := UPCASE(S[I]);
- IF LENGTH(S) > 1 THEN IF (S[1] = '/') OR (S[1] = '-') THEN DELETE(S,1,1);
-
- IF S[1] IN ['!','@'] THEN PROGRAMMAUSFUEHREN;
-
- {$I-}
- SWAPVECTORS;
- ASSIGN(F,'INTVEC.SAV');
- IF S[1] = 'S' THEN BEGIN
- REWRITE(F);
- IF IORESULT = 0 THEN BEGIN
- WRITE(F,INTS);
- CLOSE(F);
- END;
- END;
- IF S[1] = 'R' THEN BEGIN
- RESET(F);
- IF IORESULT = 0 THEN BEGIN
- READ(F,INTS);
- CLOSE(F);
- END;
- IF S[2] = 'D' THEN ERASE(F);
- END;
- IF S[1] = 'D' THEN ERASE(F);
- SWAPVECTORS;
-
- END.
-
-