home *** CD-ROM | disk | FTP | other *** search
- /* DRVPOP.C */
- #include <stdio.h>
- #include <dos.h>
- #include <ctype.h>
- #include <stdlib.h>
- #include "drvlib.inc"
- #include "doslib.h"
-
- /* Entfernt Zeichentreiber zu beliebigen Zeitpunkten
-
- Aufruf: DRVPOP <Gerätename>
- */
-
- int main(int argc, char *argv[])
- { DriverPointer p, pLast; /* aktueller Treiber, Vorgänger in der Liste */
- int x;
- Boolean Found;
- char DriverName[9]; /* Name des zu entfernenden Treibers */
- char Ans[2]; /* für Rückfragen */
-
- printf("DRVPOP - (c) 6/91 as\n");
- if (argc < 2 || (argv[1][0] == '/' && argv[1][1] == '?'))
- { printf("Aufruf: DRVPOP <Name des Zeichentreibers>\n"
- "Wirft den angegebenen Treiber aus dem Speicher.\n");
- return 0;
- }
-
- /* Umsetzen des Treibernamens in Großbuchstaben und Auffüllen
- mit Leerzeichen, soweit notwendig */
- for (x = 0; x < 8; x++)
- DriverName[x] = x >= strlen(argv[1]) ? ' ' : toupper(argv[1][x]);
- DriverName[8] = '\0';
-
- if (!strcmp(DriverName,"NUL ")) /* NUL + 5 Leerzeichen */
- { printf("Gerät NUL läßt sich nicht entfernen!\n");
- return 1;
- }
-
- /* Suche nach dem Treiberkopf sowie seinem Vorgänger in der Liste */
- for (pLast = GetFirstHeader(), p = pLast->DNext, Found = FALSE;
- !Found && FP_OFF(p) != 0xFFFF; )
- { if (p->DAttr & 0x8000) /* Zeichentreiber? */
- for (Found = TRUE, x = 0; x < 8 && Found; x++)
- if (p->NameOrUnits[x] != DriverName[x]) Found = FALSE;
- if (!Found)
- { pLast = p; p = p->DNext;
- }
- }
-
- if (!Found)
- { printf("Treiber '%s' nicht gefunden!", argv[1]);
- return 1;
- }
-
- /* Geht dem Treiber-Segment ein MCB voraus? */
- if (peek(FP_SEG(p)-1,1) != FP_SEG(p))
- { printf("'%s' ist ein fest installierter "
- "Treiber von DOS - Entfernen sinnlos.\n",argv[1]);
- return 0;
- }
-
- freemem(FP_SEG(p)); /* den Speicherblock freigeben */
- if (_doserrno)
- { printf("Treiber befindet sich in einem 'Subblock' von DOS.\n"
- "Trotzdem entfernen (J/N)? "); gets(Ans);
- if (toupper(Ans[0]) != 'J')
- { printf("Programm abgebrochen.\n");
- return 1;
- }
- else printf("Treiber '%s' aus der Kette entfernt.\n",DriverName);
- }
- else printf("Treiber '%s' aus der Kette und "
- "aus dem Speicher entfernt.\n",DriverName);
-
- /* Der letzte Schritt: die Kette um den hinauszuwerfenden
- Treiber herum schließen */
- pLast->DNext = p->DNext; /* A -> B -> C => A -> C */
-
- return 0;
- }
-