From 7e0f021a9aec35fd8e6725e87e3313b101d26f5e Mon Sep 17 00:00:00 2001 From: Tobias Klauser Date: Sun, 27 Jan 2008 11:37:44 +0100 Subject: Initial import (2.0.2-6) --- reference/C/CONTRIB/SNIP/drivsrch.c | 84 +++++++++++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100755 reference/C/CONTRIB/SNIP/drivsrch.c (limited to 'reference/C/CONTRIB/SNIP/drivsrch.c') diff --git a/reference/C/CONTRIB/SNIP/drivsrch.c b/reference/C/CONTRIB/SNIP/drivsrch.c new file mode 100755 index 0000000..7f1fdbc --- /dev/null +++ b/reference/C/CONTRIB/SNIP/drivsrch.c @@ -0,0 +1,84 @@ +/* +** DRIVSRCH.C - public domain by Marty Connelly, Victoria, BC 1992 +** +** Modified by Bob Stout +** +** Routine checks how many valid disk drives are available on machine, +** both physical and logical drives +*/ + +/* +** Includes drive letters assigned with DOS SUBST command +** +** Networked drives are left as an exercise as I don't have access +** to them to check. +** +** The routine uses undocumented DOS interrupt 32H. +** +** Compatible with MSC 5 and 6, ZTC++, BC++, other DOS compilers +** +** DS:BX contains the address of the Disk Parameter Block (DPB) for a +** requested drive. If the drive letter at offset 0 of the DPB doesn't +** match the requested drive, then the drive has been SUBST'ed. +*/ + +#include +#include + +#if !defined(MK_FP) + #define MK_FP(seg,off) ((void far *)(((long)(seg) << 16)|(unsigned)(off))) +#endif + +#ifdef __TURBOC__ + #define _far far +#endif + +void main(void) +{ + int i; + int unsigned result; + int drivestatus[26]; + unsigned char _far *DPB; + union REGS regs; + struct SREGS sregs; + + + /* routine checks for all valid drive possibilities from A to Z */ + + /* + ** if removeable media drive ie. floppy drive A: has a latch door + ** open you will get "Abort Retry" panic message + */ + + for (i = 0; i < 26; i++) + { + /* drive number (0=default, 1=A, 2=B,etc.)*/ + + regs.h.dl = (unsigned char)(i + 1); + segread(&sregs); + + regs.h.ah=0x32; /* DOS interrupt 32H */ + /* was undocumented for DOS release 3.2 */ + + intdosx(®s,®s, &sregs); + + result=regs.h.al; + DPB = MK_FP(sregs.ds, regs.x.bx); + + /* + ** result =0 then valid drive + ** =255 or ff hex then invalid or non-existent drive + */ + + if (0 == result && *DPB != (unsigned char)i) + drivestatus[i] = 1; + else drivestatus[i]=result; + } + + for (i = 0; i < 26; i = i + 2) + { + printf("drive %c: status code =%3d drive %c: status code =%3d\n", + 'A' + i,drivestatus[i],'B' + i,drivestatus[i+1]); + } + return; +} -- cgit v1.2.3-54-g00ecf