home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / magazine / pctchnqs / 1991 / number3 / ddlst.c < prev    next >
Text File  |  1991-06-05  |  2KB  |  74 lines

  1. / * DDLST.C -- trace MS-DOS device driver chain
  2.  * Author Jim Mischel.  */
  3.  
  4. #include <stdio.h>
  5. #include <dos.h>
  6.  
  7. #define DEVTYPE 0x8000  /* mask for "Device Type" bit */
  8.  
  9. struct dd_hdr {     /* device driver header structure */
  10.     struct dd_hdr far *nxt_dev;
  11.     unsigned attr;
  12.     void near *strat;
  13.     void near *intr;
  14.     char devname[8];
  15. };
  16.  
  17. struct invars {       /* abbreviated invars structure */
  18.     char skip1[8];
  19.     char far * clock;      /* pointer to CLOCK$ device */
  20.     char far * con;      /* pointer to CON device */
  21.     char skip2[7];
  22.     /* location of NUL device in DOS 2.x */
  23.     struct dd_hdr far *nuldev2;
  24.     char skip3[7];
  25.     /* location of NUL device in DOS 3.0 and later */
  26.     struct dd_hdr far *nuldev3;
  27. };
  28.  
  29. void main (void) {
  30.     struct dd_hdr far *dev;
  31.     struct invars far *InvarsPtr;
  32.  
  33.     if (_osmajor < 2) {
  34.     puts ("This program requires DOS V 2.0 or later");
  35.     return;
  36.     }
  37.  
  38.     /* get address of "invars" in ES:BX */
  39.     _AX = 0x5200;
  40.     geninterrupt (0x21);
  41.  
  42.     /* create pointer from ES:BX */
  43.     InvarsPtr = MK_FP (_ES, _BX);
  44.  
  45.     /* initialize dev to point to NUL device */
  46.     dev = (struct dd_hdr far *)
  47.        ((_osmajor >= 3) ? &InvarsPtr->nuldev3 :
  48.                   &InvarsPtr->nuldev2);
  49.  
  50.     printf ("\ninvars at %Fp\n", InvarsPtr);
  51.     printf ("CLOCK$ device at %Fp\n", InvarsPtr->clock);
  52.     printf ("CON device at %Fp\n", InvarsPtr->con);
  53.     puts("\n seg:ofs    name   typ  strat intr  attr");
  54.  
  55.     while (FP_OFF (dev) != 0xffff) {
  56.     /* Print driver starting address */
  57.     printf ("%Fp ", dev);
  58.  
  59.     /* Print device name and type */
  60.     if (dev->attr & DEVTYPE) {
  61.         int x;        /* character device */
  62.         for (x = 0; x < 8; x++)
  63.         putchar (dev->devname[x]);
  64.         printf (" CHR");
  65.     }
  66.     else            /* block device */
  67.         printf ("   %-5d BLK", dev->devname[0]);
  68.  
  69.     printf ("  %Np  %Np  %04X\n",
  70.             dev->strat, dev->intr, dev->attr);
  71.     dev = dev->nxt_dev;    /* go for next device */
  72.     }
  73. }
  74.