home *** CD-ROM | disk | FTP | other *** search
- Program DrvPop; { DRVPOP.PAS, 20-JUN-91 as }
- uses Dos, DosUtils, DrvLib;
-
- { Entfernt Zeichentreiber zu beliebigen Zeitpunkten.
-
- Aufruf: DRVPOP <Gerätename>
-
- }
-
- var p, pLast: DriverPointer; { aktueller Treiber, Vorgänger in der Liste }
- x: Integer;
- DriverName: String; { Name des hinauszuwerfenden Treibers }
- Found : Boolean;
- Ans: String; { für Rückfragen }
- begin
- Writeln('DRVPOP - (c) 6/91 as');
- if (ParamCount = 0) or (ParamStr(1) = '/?') or
- (ParamStr(1) = '/H') then
- begin
- Writeln('Aufruf: DRVPOP <Name des Zeichentreibers>');
- Writeln('Wirft den angegebenen Treiber aus dem Speicher.');
- Halt;
- end;
-
- { Umsetzen des Treibernamens in Großbuchstaben und Auffüllen
- mit Leerzeichen, soweit notwendig }
- DriverName := ParamStr(1);
- for x := 1 to 8 do DriverName[x] := Upcase(DriverName[x]);
- while Length(DriverName) < 8 do DriverName := DriverName + ' ';
-
- if DriverName = 'NUL ' then { NUL + 5 Leerzeichen }
- begin
- Writeln('Gerät NUL läßt sich nicht entfernen!');
- Halt;
- end;
-
- { Suche nach dem Treiberkopf sowie seinem Vorgänger in der Liste }
- pLast := GetFirstHeader; p := pLast^.DNext;
- Found := False;
- repeat
- if p^.DAttr and $8000 <> 0 then { Zeichentreiber }
- begin
- Found := True; { Prinzip Hoffnung }
- for x:= 1 to 8 do
- if p^.Name[x] <> DriverName[x] then Found := False;
- end;
- if not Found then
- begin
- pLast := p; p := p^.DNext; { nächster Treiber }
- end;
- until Found or (Ofs(p^) = $FFFF);
-
- if not Found then
- begin
- Writeln('Treiber ', ParamStr(1), ' nicht gefunden!');
- Halt;
- end;
- { Geht dem Treiber-Segment ein MCB voraus? }
- if Word(Ptr(Seg(p^)-1,1)^) <> Seg(p^) then
- begin
- Writeln('"',ParamStr(1),'" ist ein fest installierter ',
- 'Treiber von DOS - Entfernen sinnlos.');
- Halt;
- end;
-
- SetActivePSP(Seg(p^)); { Treibersegment als "aktives PSP" setzen }
- FreeMemBlock(Seg(p^)); { den Speicherblock freigeben }
- SetActivePSP(PrefixSeg); { und wieder das eigene PSP aktivieren }
- if DosError <> 0 then
- begin
- Writeln('Treiber befindet sich in einem "Subblock" von DOS.');
- Write('Trotzdem entfernen (J/N)? '); Readln(Ans);
- if Upcase(Ans[1]) <> 'J' then
- begin
- Writeln('Programm abgebrochen.');
- Halt;
- end
- else Writeln('Treiber "',DriverName,'" aus der Kette entfernt.');
- end
- else Writeln('Treiber "',DriverName,'" aus der Kette und ',
- 'aus dem Speicher entfernt.');
-
- { Der letzte Schritt: die Kette um den hinauszuwerfenden
- Treiber herum schließen }
- pLast^.DNext := p^.DNext; { A -> B -> C => A -> C }
- end.
-