home *** CD-ROM | disk | FTP | other *** search
/ Programmer 7500 / MAX_PROGRAMMERS.iso / PROGRAMS / UTILS / HARDWARE / SHOW285.ZIP / LISTDR.C < prev    next >
Encoding:
C/C++ Source or Header  |  1990-05-11  |  4.0 KB  |  150 lines

  1. #include <dos.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <stdlib.h>
  5.  
  6. extern int tech;
  7.  
  8. void
  9. listdrives()
  10.    {
  11.    union REGS r;
  12.    struct SREGS sr;
  13.    
  14.    int lastdrive;                         // based on A=1
  15.    short default_drive;                   // based on A=1
  16.    char str[10];
  17.    char *dr_type_ptr;
  18.    int i;
  19.    
  20.    int drive_type;
  21.    volatile char  *remote;                // ptr to string "LOCAL" or "REMOTE"
  22.    
  23.    long total_space,
  24.         free_space;
  25.    
  26.    char logical;                          // used to * logical drives
  27.    int logical_count=0;                   // count of non-physical devices
  28.  
  29.    struct bios_block
  30.       {
  31.       char special;
  32.       char devtype;
  33.       int removable;
  34.       int cylinders;
  35.       char media;
  36.       char BPB_field[31];
  37.       } bios_block;
  38.    
  39.    char *ptr;                 // used to send location of bios_block
  40.                               // to DOS. 
  41.    
  42.    #define DRTYPE_MAX 7
  43.    static char *drtypes[] = {     // this list current as of DOS 4.01
  44.                              "360K",
  45.                              "1.2MB",
  46.                              "720K",
  47.                              "SD8",
  48.                              "DD8",
  49.                              "Fixed",
  50.                              "Tape",
  51.                              "1.44MB"
  52.                              };
  53.    
  54.    r.h.ah = 0x19;                 // get current drive
  55.    intdos (&r,&r);
  56.    default_drive = r.h.al;
  57.    
  58.    r.h.ah = 0x0E;
  59.    r.h.dl = default_drive;       // set default drive function returns
  60.                                  // lastdrive
  61.    intdos (&r,&r);
  62.    
  63.    lastdrive = r.h.al;
  64.  
  65.    printf("\nDrive Information\n");
  66.  
  67.    if (tech)
  68.      {
  69.      printf("\nLASTDRIVE is %c:\n",lastdrive+64);
  70.      printf("Current drive is %c:\n",default_drive+65);
  71.      }
  72.  
  73.    printf("\nDrive    Type      Local/LAN   Total Space (K)      Free Space (K)\n");
  74.    printf(  "-----    ------    ---------   ---------------      --------------\n");
  75.    
  76.    for (i=1;i<=lastdrive;i++)
  77.       {
  78.       
  79.       logical = ' ';
  80.       
  81.       r.h.ah = 0x44;
  82.       r.h.al = 0x0D;
  83.       r.h.bl = i;
  84.       r.h.ch = 0x08;
  85.       r.h.cl = 0x60;
  86.       ptr = (char *)&bios_block;
  87.       segread(&sr);                   // get the segment registers set
  88.       r.x.dx = FP_OFF(ptr);           // and set the offset to bios_block
  89.       
  90.       intdosx(&r,&r,&sr);
  91.       
  92.       if (bios_block.devtype <= DRTYPE_MAX)
  93.          {
  94.          dr_type_ptr = drtypes[bios_block.devtype];
  95.          }
  96.         else
  97.          {
  98.          itoa(bios_block.devtype,str,10);
  99.          strcat(str,"??");
  100.          dr_type_ptr = str;
  101.          }
  102.          
  103.       total_space = 0;
  104.       free_space = 0;
  105.       remote = "Local";
  106.       if (bios_block.devtype == 5)
  107.          {
  108.          
  109.          r.h.ah = 0x44;   // determine if local or remote
  110.          r.h.al = 0x09;
  111.          r.h.bl = i;
  112.          intdos(&r,&r);
  113.          if (r.x.cflag)   // carry flag indicates invalid drive
  114.             continue;
  115.      if (r.x.dx & 0x1000)
  116.         remote="LAN";
  117.      r.h.ah = 0x36;    // get free space on drive
  118.      r.h.dl = i;
  119.      intdos(&r,&r);
  120.          
  121.      total_space = ((long)r.x.ax*(long)r.x.cx*(long)r.x.dx)/1024;
  122.      free_space  = ((long)r.x.ax*(long)r.x.cx*(long)r.x.bx)/1024;
  123.          
  124.           }
  125.          else
  126.           {
  127.           r.h.ah = 0x44;
  128.           r.h.al = 0x0E;
  129.           r.x.bx = i;
  130.           intdos(&r,&r);
  131.           if (r.h.al && r.h.al != i) 
  132.              {
  133.              logical='*';
  134.              logical_count++;
  135.              }
  136.           }
  137.           
  138.       if (bios_block.devtype==5)
  139.      printf(" %c:     %c%-6s    %-9s          %8ld            %8ld\n",
  140.             i+64,logical,dr_type_ptr,remote,total_space,free_space);
  141.         else
  142.      printf(" %c:     %c%-6s    %-9s\n",
  143.                i+64,logical,dr_type_ptr,remote);
  144.                
  145.       }
  146.       
  147.       if (logical_count)
  148.          printf("\n*  Indicates LOGICAL name for another PHYSICAL device.\n");
  149.   }
  150.