home *** CD-ROM | disk | FTP | other *** search
- #include <dos.h>
- #include <stdio.h>
- #include <string.h>
- #include <stdlib.h>
-
- extern int tech;
-
- void
- listdrives()
- {
- union REGS r;
- struct SREGS sr;
-
- int lastdrive; // based on A=1
- short default_drive; // based on A=1
- char str[10];
- char *dr_type_ptr;
- int i;
-
- int drive_type;
- volatile char *remote; // ptr to string "LOCAL" or "REMOTE"
-
- long total_space,
- free_space;
-
- char logical; // used to * logical drives
- int logical_count=0; // count of non-physical devices
-
- struct bios_block
- {
- char special;
- char devtype;
- int removable;
- int cylinders;
- char media;
- char BPB_field[31];
- } bios_block;
-
- char *ptr; // used to send location of bios_block
- // to DOS.
-
- #define DRTYPE_MAX 7
- static char *drtypes[] = { // this list current as of DOS 4.01
- "360K",
- "1.2MB",
- "720K",
- "SD8",
- "DD8",
- "Fixed",
- "Tape",
- "1.44MB"
- };
-
- r.h.ah = 0x19; // get current drive
- intdos (&r,&r);
- default_drive = r.h.al;
-
- r.h.ah = 0x0E;
- r.h.dl = default_drive; // set default drive function returns
- // lastdrive
- intdos (&r,&r);
-
- lastdrive = r.h.al;
-
- printf("\nDrive Information\n");
-
- if (tech)
- {
- printf("\nLASTDRIVE is %c:\n",lastdrive+64);
- printf("Current drive is %c:\n",default_drive+65);
- }
-
- printf("\nDrive Type Local/LAN Total Space (K) Free Space (K)\n");
- printf( "----- ------ --------- --------------- --------------\n");
-
- for (i=1;i<=lastdrive;i++)
- {
-
- logical = ' ';
-
- r.h.ah = 0x44;
- r.h.al = 0x0D;
- r.h.bl = i;
- r.h.ch = 0x08;
- r.h.cl = 0x60;
- ptr = (char *)&bios_block;
- segread(&sr); // get the segment registers set
- r.x.dx = FP_OFF(ptr); // and set the offset to bios_block
-
- intdosx(&r,&r,&sr);
-
- if (bios_block.devtype <= DRTYPE_MAX)
- {
- dr_type_ptr = drtypes[bios_block.devtype];
- }
- else
- {
- itoa(bios_block.devtype,str,10);
- strcat(str,"??");
- dr_type_ptr = str;
- }
-
- total_space = 0;
- free_space = 0;
- remote = "Local";
- if (bios_block.devtype == 5)
- {
-
- r.h.ah = 0x44; // determine if local or remote
- r.h.al = 0x09;
- r.h.bl = i;
- intdos(&r,&r);
- if (r.x.cflag) // carry flag indicates invalid drive
- continue;
- if (r.x.dx & 0x1000)
- remote="LAN";
- r.h.ah = 0x36; // get free space on drive
- r.h.dl = i;
- intdos(&r,&r);
-
- total_space = ((long)r.x.ax*(long)r.x.cx*(long)r.x.dx)/1024;
- free_space = ((long)r.x.ax*(long)r.x.cx*(long)r.x.bx)/1024;
-
- }
- else
- {
- r.h.ah = 0x44;
- r.h.al = 0x0E;
- r.x.bx = i;
- intdos(&r,&r);
- if (r.h.al && r.h.al != i)
- {
- logical='*';
- logical_count++;
- }
- }
-
- if (bios_block.devtype==5)
- printf(" %c: %c%-6s %-9s %8ld %8ld\n",
- i+64,logical,dr_type_ptr,remote,total_space,free_space);
- else
- printf(" %c: %c%-6s %-9s\n",
- i+64,logical,dr_type_ptr,remote);
-
- }
-
- if (logical_count)
- printf("\n* Indicates LOGICAL name for another PHYSICAL device.\n");
- }
-