home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / dtx9203 / driver / drvpop.pas < prev   
Encoding:
Pascal/Delphi Source File  |  1992-04-05  |  2.7 KB  |  87 lines

  1. Program DrvPop;  { DRVPOP.PAS, 20-JUN-91 as }
  2. uses Dos, DosUtils, DrvLib;
  3.  
  4. { Entfernt Zeichentreiber zu beliebigen Zeitpunkten.
  5.  
  6.   Aufruf: DRVPOP <Gerätename>
  7.  
  8. }
  9.  
  10. var p, pLast: DriverPointer; { aktueller Treiber, Vorgänger in der Liste }
  11.     x: Integer;
  12.     DriverName: String;  { Name des hinauszuwerfenden Treibers }
  13.     Found : Boolean;
  14.     Ans: String;         { für Rückfragen }
  15. begin
  16.   Writeln('DRVPOP - (c) 6/91 as');
  17.   if (ParamCount = 0) or (ParamStr(1) = '/?') or
  18.     (ParamStr(1) = '/H') then
  19.   begin
  20.     Writeln('Aufruf: DRVPOP <Name des Zeichentreibers>');
  21.     Writeln('Wirft den angegebenen Treiber aus dem Speicher.');
  22.     Halt;
  23.   end;
  24.  
  25.   { Umsetzen des Treibernamens in Großbuchstaben und Auffüllen
  26.     mit Leerzeichen, soweit notwendig }
  27.   DriverName := ParamStr(1);
  28.   for x := 1 to 8 do DriverName[x] := Upcase(DriverName[x]);
  29.   while Length(DriverName) < 8 do DriverName := DriverName + ' ';
  30.  
  31.   if DriverName = 'NUL     ' then   { NUL + 5 Leerzeichen }
  32.   begin
  33.     Writeln('Gerät NUL läßt sich nicht entfernen!');
  34.     Halt;
  35.   end;
  36.  
  37.   { Suche nach dem Treiberkopf sowie seinem Vorgänger in der Liste }
  38.   pLast := GetFirstHeader; p := pLast^.DNext;
  39.   Found := False;
  40.   repeat
  41.     if p^.DAttr and $8000 <> 0 then  { Zeichentreiber }
  42.     begin
  43.       Found := True;  { Prinzip Hoffnung }
  44.       for x:= 1 to 8 do
  45.         if p^.Name[x] <> DriverName[x] then Found := False;
  46.     end;
  47.     if not Found then
  48.     begin
  49.       pLast := p; p := p^.DNext;  { nächster Treiber }
  50.     end;
  51.   until Found or (Ofs(p^) = $FFFF);
  52.  
  53.   if not Found then
  54.   begin
  55.     Writeln('Treiber ', ParamStr(1), ' nicht gefunden!');
  56.     Halt;
  57.   end;
  58.   { Geht dem Treiber-Segment ein MCB voraus? }
  59.   if Word(Ptr(Seg(p^)-1,1)^) <> Seg(p^) then
  60.   begin
  61.     Writeln('"',ParamStr(1),'" ist ein fest installierter ',
  62.             'Treiber von DOS - Entfernen sinnlos.');
  63.     Halt;
  64.   end;
  65.  
  66.   SetActivePSP(Seg(p^));  { Treibersegment als "aktives PSP" setzen }
  67.   FreeMemBlock(Seg(p^));  { den Speicherblock freigeben }
  68.   SetActivePSP(PrefixSeg);  { und wieder das eigene PSP aktivieren }
  69.   if DosError <> 0 then
  70.   begin
  71.     Writeln('Treiber befindet sich in einem "Subblock" von DOS.');
  72.     Write('Trotzdem entfernen (J/N)? '); Readln(Ans);
  73.     if Upcase(Ans[1]) <> 'J' then
  74.     begin
  75.       Writeln('Programm abgebrochen.');
  76.       Halt;
  77.     end
  78.      else Writeln('Treiber "',DriverName,'" aus der Kette entfernt.');
  79.   end
  80.    else Writeln('Treiber "',DriverName,'" aus der Kette und ',
  81.                 'aus dem Speicher entfernt.');
  82.  
  83.   { Der letzte Schritt: die Kette um den hinauszuwerfenden
  84.     Treiber herum schließen }
  85.   pLast^.DNext := p^.DNext;  { A -> B -> C => A -> C }
  86. end.
  87.