home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / dtx9203 / driver / drvpop.c < prev    next >
C/C++ Source or Header  |  1992-04-06  |  2KB  |  81 lines

  1. /* DRVPOP.C */
  2. #include <stdio.h>
  3. #include <dos.h>
  4. #include <ctype.h>
  5. #include <stdlib.h>
  6. #include "drvlib.inc"
  7. #include "doslib.h"
  8.  
  9. /* Entfernt Zeichentreiber zu beliebigen Zeitpunkten
  10.  
  11.    Aufruf: DRVPOP <Gerätename>
  12. */
  13.  
  14. int main(int argc, char *argv[])
  15. { DriverPointer p, pLast; /* aktueller Treiber, Vorgänger in der Liste */
  16.   int x;
  17.   Boolean Found;
  18.   char DriverName[9];  /* Name des zu entfernenden Treibers */
  19.   char Ans[2];         /* für Rückfragen */
  20.  
  21.   printf("DRVPOP - (c) 6/91 as\n");
  22.   if (argc < 2 || (argv[1][0] == '/' && argv[1][1] == '?'))
  23.    { printf("Aufruf: DRVPOP <Name des Zeichentreibers>\n"
  24.         "Wirft den angegebenen Treiber aus dem Speicher.\n");
  25.      return 0;
  26.    }
  27.  
  28.   /* Umsetzen des Treibernamens in Großbuchstaben und Auffüllen
  29.     mit Leerzeichen, soweit notwendig */
  30.   for (x = 0; x < 8; x++)
  31.     DriverName[x] = x >= strlen(argv[1]) ? ' ' : toupper(argv[1][x]);
  32.   DriverName[8] = '\0';
  33.  
  34.   if (!strcmp(DriverName,"NUL     "))  /* NUL + 5 Leerzeichen */
  35.     { printf("Gerät NUL läßt sich nicht entfernen!\n");
  36.       return 1;
  37.     }
  38.  
  39.   /* Suche nach dem Treiberkopf sowie seinem Vorgänger in der Liste */
  40.   for (pLast = GetFirstHeader(), p = pLast->DNext, Found = FALSE;
  41.       !Found && FP_OFF(p) != 0xFFFF; )
  42.     { if (p->DAttr & 0x8000)  /* Zeichentreiber? */
  43.     for (Found = TRUE, x = 0; x < 8 && Found; x++)
  44.       if (p->NameOrUnits[x] != DriverName[x]) Found = FALSE;
  45.       if (!Found)
  46.        { pLast = p; p = p->DNext;
  47.        }
  48.     }
  49.  
  50.   if (!Found)
  51.    { printf("Treiber '%s' nicht gefunden!", argv[1]);
  52.      return 1;
  53.    }
  54.  
  55.   /* Geht dem Treiber-Segment ein MCB voraus? */
  56.   if (peek(FP_SEG(p)-1,1) != FP_SEG(p))
  57.    { printf("'%s' ist ein fest installierter "
  58.         "Treiber von DOS - Entfernen sinnlos.\n",argv[1]);
  59.      return 0;
  60.    }
  61.  
  62.   freemem(FP_SEG(p));  /* den Speicherblock freigeben */
  63.   if (_doserrno)
  64.    { printf("Treiber befindet sich in einem 'Subblock' von DOS.\n"
  65.         "Trotzdem entfernen (J/N)? "); gets(Ans);
  66.      if (toupper(Ans[0]) != 'J')
  67.       { printf("Programm abgebrochen.\n");
  68.     return 1;
  69.       }
  70.      else printf("Treiber '%s' aus der Kette entfernt.\n",DriverName);
  71.    }
  72.   else printf("Treiber '%s' aus der Kette und "
  73.         "aus dem Speicher entfernt.\n",DriverName);
  74.  
  75.   /* Der letzte Schritt: die Kette um den hinauszuwerfenden
  76.     Treiber herum schließen */
  77.   pLast->DNext = p->DNext;  /* A -> B -> C => A -> C */
  78.  
  79.   return 0;
  80. }
  81.