home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD2.mdf / c / library / mslang / cp1 / drivsrch.c < prev    next >
C/C++ Source or Header  |  1993-05-15  |  3KB  |  104 lines

  1. ===========================================================================
  2.  BBS: The Abacus * HST/DS * Potterville MI
  3. Date: 05-14-93 (08:49)             Number: 71
  4. From: BOB STOUT                    Refer#: 163
  5.   To: MARTIN CONNELLY               Recvd: NO  
  6. Subj: Re: DRIVSRCH.C (was PART       Conf: (36) C Language
  7. ---------------------------------------------------------------------------
  8. In a message of <May 07 23:10>, Martin Connelly (1:340/303@fidonet) writes:
  9.  
  10.  >  I've missed all the previous posts. Out of the country. So, what
  11.  >  changed?
  12.  
  13. /*
  14. **  DRIVSRCH.C - public domain by Marty Connelly, Victoria, BC 1992
  15. **
  16. **  Modified by Bob Stout
  17. **
  18. **  Routine checks how many valid disk drives are available on machine,
  19. **  both physical and logical drives
  20. */
  21.  
  22. /*
  23. **  Includes drive letters assigned with DOS SUBST command
  24. **
  25. **  Networked drives are left as an exercise as I don't have access
  26. **  to them to check.
  27. **
  28. **  The routine uses undocumented DOS interrupt 32H.
  29. **
  30. **  Compatible with MSC 5 and 6, ZTC++, BC++, other DOS compilers
  31. **
  32. **  DS:BX contains the address of the Disk Parameter Block (DPB) for a
  33. **  requested drive. If the drive letter at offset 0 of the DPB doesn't
  34. **  match the requested drive, then the drive has been SUBST'ed.
  35. */
  36.  
  37. #include <stdio.h>
  38. #include <dos.h>
  39.  
  40. #if !defined(MK_FP)
  41.     #define MK_FP(seg,off) ((void far *)(((long)(seg) << 16)|(unsigned)(off)))
  42. #endif
  43.  
  44. #ifdef __TURBOC__
  45.  #define _far far
  46. #endif
  47.  
  48. void main(void)
  49. {
  50.       int i;
  51.       int unsigned result;
  52.       int drivestatus[26];
  53.       unsigned char _far *DPB;
  54.       union REGS regs;
  55.       struct SREGS sregs;
  56.  
  57.  
  58.       /* routine checks for all valid drive possibilities from A to Z  */
  59.  
  60.       /*
  61.       **    if removeable media drive ie. floppy drive A: has a latch door
  62.       **    open you will get "Abort Retry" panic message
  63.       */
  64.  
  65.       for (i = 0; i < 26; i++)
  66.       {
  67.             /* drive number (0=default, 1=A, 2=B,etc.)*/
  68.  
  69.             regs.h.dl = (unsigned char)(i + 1);
  70.             segread(&sregs);
  71.  
  72.             regs.h.ah=0x32;         /* DOS interrupt 32H */
  73.                                     /* was undocumented for DOS release 3.2 */
  74.  
  75.             intdosx(®s,®s, &sregs);
  76.  
  77.             result=regs.h.al;
  78.             DPB = MK_FP(sregs.ds, regs.x.bx);
  79.  
  80.             /*
  81.             **  result =0  then valid drive
  82.             **         =255 or ff hex then invalid or non-existent drive
  83.             */
  84.  
  85.             if (0 == result && *DPB != (unsigned char)i)
  86.                   drivestatus[i] = 1;
  87.             else  drivestatus[i]=result;
  88.       }
  89.  
  90.       for (i = 0; i < 26; i = i + 2)
  91.       {
  92.             printf("drive %c: status code =%3d drive %c: status code =%3d\n",
  93.                   'A' + i,drivestatus[i],'B' + i,drivestatus[i+1]);
  94.       }
  95.       return;
  96. }
  97.  
  98.  
  99. --- QM v1.00
  100.  * Origin: MicroFirm : Down to the C in chips (1:106/2000.6)
  101. SEEN-BY: 1/211 11/2 4 13/13 101/1 108/89 109/25 110/69 114/5 123/19 124/1
  102. SEEN-BY: 153/752 154/40 77 157/2 159/100 125 575 950 203/23 209/209 261/1023
  103. SEEN-BY: 280/1 390/1 396/1 5 15 2270/1 2440/5 3603/20
  104.